%20%E5%8F%96%E5%BE%97%20Linux%20%E4%B8%AD%E7%B6%B2%E8%B7%AF%E7%8B%80%E6%85%8B%E5%B7%B2%E8%AE%8A%E6%9B%B4%E7%9A%84%E4%BA%8B%E4%BB%B6.png)
我們的 Wi-Fi 存取點配置了非常激進的 10 分鐘 DHCP 租用時間。這本身不是問題,因為續租時 IP 位址保持不變。但我運行的是VMware Workstation,如此短的間隔導致虛擬機器內經常出現網路遺失。根本問題在於 vmet-natd 守護程式。它檢測到存在一些網路事件並假設它是重新連接。結果是虛擬機器中的虛擬網路介面卡出現「實體」網路斷開連接,然後立即重新連接。我的所有 TCP 會話都在虛擬機器中被丟棄。
目前我在 Xubuntu 18.04 主機上執行 VMware Workstation 15.1.0。
這些是發生這種情況時系統日誌中的事件。
Jun 25 15:23:18 laptop wpa_supplicant[1039]: wlp2s0: WPA: Group rekeying completed with 6c:3b:6b:XX:XX:XX [GTK=CCMP]
Jun 25 15:26:06 laptop dhclient[6554]: DHCPREQUEST of 192.168.XXX.XXX on wlp2s0 to 192.168.XXX.XXX port 67 (xid=0x6f72XXXX)
Jun 25 15:26:06 laptop dhclient[6554]: DHCPACK of 192.168.XX.XX from 192.168.XX.XX
Jun 25 15:26:06 laptop NetworkManager[1038]: <info> [1561465566.1687] dhcp4 (wlp2s0): address 192.168.XX.XX
Jun 25 15:26:06 laptop NetworkManager[1038]: <info> [1561465566.1687] dhcp4 (wlp2s0): plen 24 (255.255.255.0)
Jun 25 15:26:06 laptop NetworkManager[1038]: <info> [1561465566.1687] dhcp4 (wlp2s0): gateway 192.168.XX.XX
Jun 25 15:26:06 laptop vmnet-natd: RTM_NEWADDR: index:4, addr:192.168.XXX.XXX
Jun 25 15:26:06 laptop NetworkManager[1038]: <info> [1561465566.1688] dhcp4 (wlp2s0): lease time 600
Jun 25 15:26:06 laptop NetworkManager[1038]: <info> [1561465566.1688] dhcp4 (wlp2s0): nameserver '192.168.XXX.XXX'
Jun 25 15:26:06 laptop NetworkManager[1038]: <info> [1561465566.1688] dhcp4 (wlp2s0): nameserver 'XXX.XXX.XXX.XXX'
Jun 25 15:26:06 laptop NetworkManager[1038]: <info> [1561465566.1688] dhcp4 (wlp2s0): nameserver 'XXX.XXX.XXX.XXX'
Jun 25 15:26:06 laptop NetworkManager[1038]: <info> [1561465566.1688] dhcp4 (wlp2s0): state changed bound -> bound
Jun 25 15:26:06 laptop dbus-daemon[1020]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service' requested by ':1.11' (uid=0 pid=1038 comm="/usr/sbin/NetworkManager --no-daemon " label="unconfined")
Jun 25 15:26:06 laptop systemd[1]: Starting Network Manager Script Dispatcher Service...
Jun 25 15:26:06 laptop dhclient[6554]: bound to 192.168.XXX.XXX -- renewal in 267 seconds.
Jun 25 15:26:06 laptop dbus-daemon[1020]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Jun 25 15:26:06 laptop systemd[1]: Started Network Manager Script Dispatcher Service.
Jun 25 15:26:06 laptop nm-dispatcher: req:1 'dhcp4-change' [wlp2s0]: new request (1 scripts)
Jun 25 15:26:06 laptop nm-dispatcher: req:1 'dhcp4-change' [wlp2s0]: start running ordered scripts...
Jun 25 15:26:06 laptop kernel: [10747.491441] userif-2: sent link down event.
Jun 25 15:26:06 laptop kernel: [10747.491445] userif-2: sent link up event.
有一個vmware 論壇上的帖子關於這個沒有解決辦法。
我該如何防止這種情況?我的 google-fu 不足以找到解決方案。
可能有多種方法可以解決這個問題。
- 修復 vmnet-natd 以對此類事件進行特殊處理。 (VMware 支援沒有幫助)。
- 設定vmnet-natd完全忽略網路事件,但好像沒有這個選項。
- 如果透過修補/配置核心/使用者空間 Linux 網路堆疊對 Wi-Fi 關聯重新產生金鑰或 DHCP 租約擴充功能沒有任何更改,則不會產生網路變更事件。
- 修補/配置核心/使用者空間 Linux 網路堆疊,以不將網路事件(或其某些子集)傳送至 vmnet-natd。
有人能指出我解決這個煩惱的阻力最小的路徑嗎?
更新1:虛擬機器中的網路介面卡配置為 NAT 模式,我無法以任何其他模式運行它,因為我無法將任何虛擬機器直接公開到辦公室網路。主機的 DHCP 伺服器是存取點本身,並且始終保持不變。網路由網路管理器管理。
答案1
文章 使用 DHCP 位址時修復 Linux 上的 VMWare Player 描述問題並提供解決方案。
此問題是在 VMwarePlayer v8+ 中引入的,描述如下:
每次更新主機任何網路介面卡的 DHCP 位址時,所有虛擬機器都會收到網路中斷和連線的訊息,導致網路在每次更新後約 20 秒內無法使用。
對於像您這樣的 DHCP 租用時間較短的網路來說,這尤其具有破壞性,大約每 5 分鐘所有虛擬機器就會暫時失去網路連線。
這種行為可以在您的/var/log/messages
:
Jun 25 15:26:06 laptop kernel: [10747.491441] userif-2: sent link down event.
Jun 25 15:26:06 laptop kernel: [10747.491445] userif-2: sent link up event.
本文的作者userif-3
在檔案中找到了該字串,該字串包含在 每個 VMWarePlayer 安裝中包含的userif.c
檔案的 code-tar 中 。/usr/lib/vmware/modules/source/vmnet-only.tar
他找到的程式碼如下所示:
965 int
966 VNetUserIfSetUplinkState(VNetPort *port, uint8 linkUp)
967 {
...
1010 LOG(0, (KERN_NOTICE "userif-%d: sent link %s event.\n",
1011 userIf->port.id, linkUp ? "up" : "down"));
1012
1013 return retval;
1014 }
然後他創建了一個補丁檔案並應用瞭如下程式碼:
cd /tmp
tar xf /usr/lib/vmware/modules/source/vmnet.tar
patch -p0 < vmware-vmnet-only.patch
tar cf vmnet.tar vmnet-only
cp /tmp/vmnet.tar /usr/lib/vmware/modules/source/vmnet.tar
/usr/bin/vmware-modconfig --console --install-all
systemctl restart vmware ## or 'service vmware restart'
我在下面列出了他的補丁:
-- vmnet-only/userif.c 2017-12-21 17:02:28.555820933 +0100
+++ vmnet-only.jjk/userif.c 2017-12-15 13:22:13.257724953 +0100
@@ -973,6 +973,9 @@
userIf = (VNetUserIF *)port->jack.private;
hubJack = port->jack.peer;
+ /* never send link down events */
+ if (!linkUp) return 0;
+
if (port->jack.state == FALSE || hubJack == NULL) {
return -EINVAL;
}