Ubuntu

使用 zeroconf 網路斷開電纜後必須重新啟動網路服務

  • April 17, 2019

我正在使用執行 Ubuntu 15.04 的 Wandboard (imx6) 設備來實現類似資訊亭的目的。我使用 zeroconf 網路進行初始配置和在網路之間移動之後(現場沒有鍵盤訪問)。在將網路更改為 zeroconf 設置後,我遇到了網路介面無法正常工作的問題。這是我的重現步驟(如果有更多有用的東西可以放入我的診斷腳本,請告訴我):

  1. 我重置為 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
  1. 拔下電纜,插入 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
  1. 現在無法從處於 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

引用自:https://unix.stackexchange.com/questions/303096