使用 zeroconf 網路斷開電纜後必須重新啟動網路服務
我正在使用執行 Ubuntu 15.04 的 Wandboard (imx6) 設備來實現類似資訊亭的目的。我使用 zeroconf 網路進行初始配置和在網路之間移動之後(現場沒有鍵盤訪問)。在將網路更改為 zeroconf 設置後,我遇到了網路介面無法正常工作的問題。這是我的重現步驟(如果有更多有用的東西可以放入我的診斷腳本,請告訴我):
- 我重置為 zeroconf 設置並在設備仍插入 lan 的情況下重新啟動
wandboard@lnm:~$ ./network-diag.sh + cat /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 169.254.254.254 netmask 255.255.0.0 gateway 1.1.1.1 + ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:1f:7b:b2:14:96 brd ff:ff:ff:ff:ff:ff inet 169.254.254.254/16 brd 169.254.255.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::21f:7bff:feb2:1496/64 scope link valid_lft forever preferred_lft forever + ip route 169.254.0.0/16 dev eth0 proto kernel scope link src 169.254.254.254 + systemctl status sys-subsystem-net-devices-eth0.device � sys-subsystem-net-devices-eth0.device - /sys/subsystem/net/devices/eth0 Loaded: loaded Active: active (plugged) since Fri 2016-08-12 18:40:17 UTC; 1min 17s ago Device: /sys/devices/soc0/soc.1/2100000.aips-bus/2188000.ethernet/net/eth0
- 拔下電纜,插入 ad-hoc zeroconf 網路
wandboard@lnm:~$ ./network-diag.sh + cat /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 169.254.254.254 netmask 255.255.0.0 gateway 1.1.1.1 + ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:1f:7b:b2:14:96 brd ff:ff:ff:ff:ff:ff inet6 fe80::21f:7bff:feb2:1496/64 scope link valid_lft forever preferred_lft forever + ip route + systemctl status sys-subsystem-net-devices-eth0.device � sys-subsystem-net-devices-eth0.device - /sys/subsystem/net/devices/eth0 Loaded: loaded Active: active (plugged) since Fri 2016-08-12 18:40:17 UTC; 5min ago Device: /sys/devices/soc0/soc.1/2100000.aips-bus/2188000.ethernet/net/eth0
- 現在無法從處於 zeroconf 模式的 Windows 機器訪問設備。ping 返回“目標主機不可達”。但是通過快速的網路重啟……
wandboard@lnm:~$ sudo service networking restart wandboard@lnm:~$ ./network-diag.sh + cat /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 169.254.254.254 netmask 255.255.0.0 gateway 1.1.1.1 + ip addr show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:1f:7b:b2:14:96 brd ff:ff:ff:ff:ff:ff inet 169.254.254.254/16 brd 169.254.255.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::21f:7bff:feb2:1496/64 scope link valid_lft forever preferred_lft forever + ip route 169.254.0.0/16 dev eth0 proto kernel scope link src 169.254.254.254 + systemctl status sys-subsystem-net-devices-eth0.device � sys-subsystem-net-devices-eth0.device - /sys/subsystem/net/devices/eth0 Loaded: loaded Active: active (plugged) since Fri 2016-08-12 18:40:17 UTC; 7min ago Device: /sys/devices/soc0/soc.1/2100000.aips-bus/2188000.ethernet/net/eth0
然後一切又好了。來自 Windows 機器的 Ping 立即開始完成。
這會讓現場的使用者感到困惑,他們最終會重啟設備直到它響應。電纜切換事件後,如何在 zeroconf 模式下按預期重新連接網路?
更新:
allow-hotplug eth0
似乎沒有改變任何東西。更新更新:
按照 maxf 的建議,我的許多問題在安裝 ifplugd(並配置它!)後就消失了。注意:如果您希望 ifplugd 監控您的界面,則必須在 /etc/default/ifplugd 中配置 ifplugd。我發現我的界面在所有情況下都能正確聯機,但只有一種情況:
╔═══════════╦═══════════════╦═══════════╦═════════╗ ║ Boot with ║ bad link ║ good link ║ no link ║ ╠═══════════╬═══════════════╬═══════════╬═════════╣ ║ dhcp ║ ok ║ ok ║ ok ║ ║ zeroconf ║ needs restart ║ ok ║ ok ║ ╚═══════════╩═══════════════╩═══════════╩═════════╝
在此表中,我將啟動配置了 dhcp/zeroconf-static 的設備,並且將電纜插入到所需的相反網路(壞鏈路)、正確的網路(良好鏈路)或未連接(無鏈路)。然後我將它連接到正確的網路,看看介面是否正確聯機。我發現只有在啟動時連接到我的 LAN 的 zeroconf 配置無法連接到 zeroconf 筆記型電腦 ad-hoc 網路。
這是我在 /etc/ifplugd/action.d/ 中的操作腳本
#!/bin/sh LNM_LOG=/tmp/ifplug.log ZEROCONF_IP=169.254.254.254 date >> $LNM_LOG echo $1 $2 >> $LNM_LOG if [ "$1" = "eth0" -a "$2" = "up" -a $(grep -c $ZEROCONF_IP /etc/network/interfaces) -ne 0 ] ; then echo "eth0 plugged in for zeroconf, restart networking" >> $LNM_LOG service networking restart echo "network restarted" >> $LNM_LOG fi
理論上重啟網路應該是沒有必要的。嘗試在“auto eth0”行之後將“allow-hotplug eth0”添加到 /etc/network/interfaces 以查看是否可以修復它。
至於你原來的問題:你可以使用ifplugd。Ifplugd 基本上是一個小型守護程序,它監視乙太網介面的連結狀態並在更改時呼叫使用者定義的腳本(預設為 /etc/ifplugd/ifplugd.action)。此腳本獲取單個參數(“up”或“down”),設置後您可以使用:
#!/bin/sh if [ "$1" = "up" ] ; then service networking restart fi