%20%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B0%D1%82%D1%8C%20%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F%20%D0%BE%D0%B1%20%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B8%20%D1%81%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D1%8F%20%D1%81%D0%B5%D1%82%D0%B8%20%D0%B2%20Linux.png)
Наша точка доступа Wi-Fi настроена на очень агрессивное время аренды DHCP в 10 минут. Это не проблема сама по себе, так как IP-адрес остается прежним при продлении аренды. Но я запускаю VMware Workstation, и такой короткий интервал приводит к частым отключениям сети внутри виртуальных машин. Корень проблемы в демоне vmet-natd. Он обнаруживает, что произошло НЕКОТОРОЕ сетевое событие, и предполагает, что это было повторное подключение. Следствием этого является то, что виртуальный сетевой адаптер в виртуальной машине получает «физическое» отключение сети, а затем немедленное повторное подключение. И все мои сеансы TCP сбрасываются в виртуальной машине.
В настоящее время я использую VMware Workstation 15.1.0 на хосте Xubuntu 18.04.
Это события из системного журнала, когда это происходит.
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.
Eстьветка на форумах vmwareпо этому поводу нет решения.
Как мне это предотвратить? Мой гугл-фу оказался недостаточно хорош, чтобы найти решение.
Есть несколько способов исправить это.
- Исправьте vmnet-natd, чтобы он выполнял специальную обработку таких событий. (Поддержка VMware не поможет).
- Настройте vmnet-natd на полное игнорирование сетевых событий, но, похоже, такой опции нет.
- Не генерировать события изменения сети, если ничего не изменилось при смене ключей ассоциации Wi-Fi или продлении аренды DHCP путем исправления/настройки сетевого стека ядра/пользовательского пространства Linux.
- Исправьте/настройте сетевой стек ядра/пользовательского пространства Linux, чтобы не отправлять сетевые события (или некоторую их часть) в vmnet-natd.
Может ли кто-нибудь указать мне путь наименьшего сопротивления, чтобы решить эту проблему?
Обновление 1:Сетевой адаптер в виртуальной машине настроен в режиме NAT, я не могу запустить его в каком-либо другом режиме, так как не могу напрямую выставить ни одну из своих виртуальных машин в офисную сеть. DHCP-сервер для хоста — это сама точка доступа, и он все время остается неизменным. Управление сетью осуществляется с помощью Network Manager.
решение1
Статья Исправление VMWare Player на Linux при использовании DHCP-адресов описывает проблему и предлагает решение.
Эта проблема, появившаяся в 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
в файле userif.c
, включенном в code-tar файла,
/usr/lib/vmware/modules/source/vmnet-only.tar
который входит в каждую установку VMWarePlayer.
Найденный им код выглядел так:
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;
}