当我连接 USB 转以太网适配器(以前使用过)时,我会收到一个 MAC 地址,然后如果另一端连接了其他设备,我也会收到一个 IP 地址(在我的情况下是 192.168.1.1,在 NetworkManager 中配置为静态)。另一端有各种仪器等待该 PC 上运行的 DHCP 服务器为其分配 IP。
问题是,如果找不到子网,DHCP 服务器将拒绝启动,因此在连接建立之前无法启动它。systemctl restart isc-dhcp-server.service
从 NetworkManager 收到 IP 192.168.1.1 后我该怎么办?
我考虑过使用 udev 规则,ATTR{address}=="f0:1f:af:3d:6c:e7" RUN+="systemctl restart isc-dhcp-server.service"
但它在分配 IP 之前就运行了。有没有我可以使用 udev 选项,或者我必须通过 systemd 或 NetworkManager 或其他方法使用其他方法?
答案1
UDEV 触发 systemd 服务是实现此目的的方法。
您可以通过 USB ID 匹配您的 USB 适配器,当您看到 MAC 地址时就太晚了。
这篇文章有说明
https://unix.stackexchange.com/questions/229987/udev-rule-to-match-any-usb-storage-device
答案2
您的系统已配置 systemd 。
isc-dhcp-server
因此,一个解决方案是在和 USB 设备之间添加依赖关系。
- 识别systemd系统下设备的名称
systemctl | grep -i sys-subsystem-net-devices.*6c.*e7
附言6c&e7你的 mac 的最后 2 个字节来自你的 usb 设备
你一定有类似的东西
sys-subsystem-net-devices-enxf01faf3d6ce7.device
- 修改单元文件
isc-dhcp-server
export EDITOR=emacs # <= change to what you want
systemctl edit isc-dhcp-server.service
并添加以下行
[Unit]
After=sys-subsystem-net-devices-enxf01faf3d6ce7.device
Wants=sys-subsystem-net-devices-enxf01faf3d6ce7.device
重启
isc-dhcp-server
通过运行这些命令来检查状态和配置
systemctl show --property=After isc-dhcp-server.service
systemctl status isc-dhcp-server.service
答案3
restart-dhcpd.sh
最后花了一些时间解决这个问题,并用我命名并放置在的脚本解决了它/etc/NetworkManager/dispatcher.d/
。(注意:之后您可能需要systemctl restart network-manager.service
和/或systemctl daemon-reload
):
#! /bin/bash
IF=$1
STATUS=$2
case "$2" in
dhcp4-change|up)
logger -s "NM Script $STATUS $IF triggered"
if [ "$1" = "enx6cf0496c6947" ]; then
/bin/systemctl restart isc-dhcp-server.service
fi
;;
esac