LINUX.ORG.RU
решено ФорумAdmin

KVM host shutdown, guest wait nfs umount

 , , ,


0

2

Дано.

Хост debian stable, systemd 230 из бэкпортов. На хосте поднят nfs-сервер, который монтируется гостем, тоже дебианом.

Проблема в том, что при выключении хоста его сеть вместе с nfs-сервером выключается быстрее, чем nfs-шара отмонтируется на клиенте. В итоге, клиент висит 90 секунд и ждёт принудительного выключения.

За выключение ВМ отвечает сгенерированный юнит:

# systemctl cat libvirt-guests
# /lib/systemd/system/libvirt-guests.service
[Unit]
Description=Suspend Active Libvirt Guests
After=network.target libvirtd.service time-sync.target
Documentation=man:libvirtd(8)
Documentation=http://libvirt.org

[Service]
EnvironmentFile=-/etc/default/libvirt-guests
# Hack just call traditional service until we factor
# out the code
ExecStart=/usr/lib/libvirt/libvirt-guests.sh start
ExecStop=/usr/lib/libvirt/libvirt-guests.sh stop
Type=oneshot
RemainAfterExit=yes
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target

Пытаюсь дополнить правило требованием

# /etc/systemd/system/libvirt-guests.service.d/nfs.conf
[Unit]
Requires=nfs-kernel-server.service

Но ничего не выходит и гость выключается только по тайм-ауту. Без выключения хостовой системы, гость перезагружается за считанные секунды.

Что можно придумать, в какую сторону копать?

P.S. сеть поднимается через systemd-networkd.service.

Похоже всё из-за Type=oneshot.

# Hack just call traditional service until we factor out the code

Можно посмотреть, как в свежем дебиане юнит выглядит, может осилили наконец нормально переписать. Если нет, можно запилить баг, пусть тоже чинят

Вот похожая ситуация, пока тоже не решилась толком: https://bbs.archlinux.org/viewtopic.php?id=222963

disarmer ★★★ ()
Ответ на: комментарий от disarmer

осилили наконец нормально переписать

Не осилили, смотрел в unstable.

After=nfs.target

Спасибо за зацепку, правда, nfs.target в debian нет, но здесь сами пытались навелосипедить что-то схожее.

Jurik_Phys ★★★★★ ()
Ответ на: комментарий от disarmer

https://bbs.archlinux.org/viewtopic.php?id=222963

Похоже, на проблемы с systemd, которая не дожидается завершения команды ExecStop.

ExecStop= doesn't seem to wait for the process to finish (even on type=oneshot)", and I really wonder whether or not «oneshot» should wait on shutdown

Красиво, задачу не решить...

Jurik_Phys ★★★★★ ()

Этой проблемы небыло с nfs3.

Проблема в клиенте. Он отмотировав ресурсы держит открытым соединение с nfs-сервером. Как попросить закрыть это соединение быстро - непонятно.

vel ★★★★★ ()
Ответ на: комментарий от Jurik_Phys

Я не знаю, с чем столкнулись авторы того треда, но systemd на самом деле запускает ExecStop= синхронно (ждёт завершения), я только что это проверил.

Тот скрипт, который вызывается в ExecStop=, он сам ждёт завершения виртуалок? Есть возможность это проверить, вызвав его руками и параллельно глядя в условный htop?

Дополнение: зависимости порядка с NFS-сервером действительно нужны. Но там должно быть After=, а не Requires=.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

[Решение]

Дополнение: зависимости порядка с NFS-сервером действительно нужны. Но там должно быть After=, а не Requires=

Благодарю! Это именно то, что нужно.

$ systemctl cat libvirt-guests.service
# /lib/systemd/system/libvirt-guests.service
[Unit]
Description=Suspend Active Libvirt Guests
After=network.target libvirtd.service time-sync.target
Documentation=man:libvirtd(8)
Documentation=http://libvirt.org

[Service]
EnvironmentFile=-/etc/default/libvirt-guests
# Hack just call traditional service until we factor
# out the code
ExecStart=/usr/lib/libvirt/libvirt-guests.sh start
ExecStop=/usr/lib/libvirt/libvirt-guests.sh stop
Type=oneshot
RemainAfterExit=yes
StandardOutput=journal+console

[Install]
WantedBy=multi-user.target

# /etc/systemd/system/libvirt-guests.service.d/nfs.conf
[Unit]
After=nfs-kernel-server.service

С данной зависимостью виртуальные машины выключаются, как орешки, перезагрузка хоста происходит без задержки.

Самостоятельно экспериментировал с «Before=», забыв, что After/Before относятся к процессу загрузки системы, а при её выключении выполнение юнитов идёт в обратном порядке. Вот, и хотел, чтобы до отключения NFS сработал юнит libvirt.

P.S. в ходе экспериментов от частых ресетов развалился raid1 с системой, пришлось шаманить и восстанавливать.

Jurik_Phys ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.