防止程序(vmet-natd)获取 Linux 中网络状态发生变化的事件

防止程序(vmet-natd)获取 Linux 中网络状态发生变化的事件

我们的 Wi-Fi 接入点配置了非常激进的 DHCP 租约时间,为 10 分钟。这本身不是问题,因为租约续订时 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 能力不够好,无法找到解决方案。

有几种方法可以解决这个问题。

  1. 修复 vmnet-natd 以对此类事件进行特殊处理。(VMware 支持没有帮助)。
  2. 配置vmnet-natd完全忽略网络事件,但是好像没有这个选项。
  3. 如果通过修补/配置内核/用户空间 Linux 网络堆栈,Wi-Fi 关联重新密钥或 DHCP 租约延长没有任何变化,则不会生成网络变化事件。
  4. 修补/配置内核/用户空间 Linux 网络堆栈以不将网络事件(或其中的某些子集)发送到 vmnet-natd。

有人能告诉我解决这个烦恼的最有效方法吗?

更新 1:VM 中的网络适配器配置为 NAT 模式,我无法在任何其他模式下运行它,因为我无法将任何 VM 直接暴露到办公室网络上。主机的 DHCP 服务器本身就是接入点,并且始终保持不变。网络由网络管理器管理。

答案1

文章 修复 Linux 上使用 DHCP 地址时的 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;
    }

相关内容