Задайте этот вопрос прямо отсюда .
Я использую arch linux, и у меня часто работает виртуальная машина вместе с системой. Фактически, в большинстве случаев.
Моя цель - создать следующее поведение:
- В систему отправляется сигнал выключения / отключения питания / перезагрузки / остановки
- Никаких действий, кроме попыток корректно завершить работу виртуальных машин
- Если виртуальные машины завершают работу изящно через X секунд, продолжается и выключение хост-системы.
- Если нет, выполните другую операцию команда
Просто дайте мне хорошее представление о том, над чем работать, потому что я даже не знаю, с чего начать. Я думаю, что есть вызов к ядру, который можно посмотреть.
Дайте мне знать.
Мой текущий код
В настоящее время я использую эти скрипты, чтобы изящно завершить работу моих виртуальных машин KVM, и это работает! Но только до тех пор, пока мой пользователь запускает shutdown или reboot , используя свою оболочку. Любой другой случай не сработает.
Эти псевдонимы:
alias sudocheck="/bin/bash /home/damiano/.script/sudocheck"
alias sudo="sudocheck "
Запускают эту функцию:
#!/bin/bash
# This script checks for what is being passed to sudo.
# If the command passed is poweroff or reboot, it
# launches a custom script instead, that also looks
# fur currently running virtual machines and shuts them.
sudocheck() {
if [ $1 == "poweroff" ] || [ $1 == "reboot" ]; then
eval "sudo /home/damiano/.script/graceful $@"
else
eval "sudo $@"
fi
}
sudocheck $@
При запуске этого сценария при необходимости:
#!/bin/bash
i=0
e=0
## if virsh finds VMs running
virsh -c qemu:///system list | awk '{ print $3}' | \
if grep running > /dev/null ; then
virsh -c qemu:///system list --all | grep running | awk '{print "-c qemu:///system shutdown "$2}' | \
## shuts them dow gracefully
xargs -L1 virsh
## wait 30 seconds for them to go down
until (( i >= 30 || e == 1 )) ; do
## check every second for their status
virsh -c qemu:///system list --all | awk '{ print $3}' | \
if grep -E '(running|shutdown)' > /dev/null ; then
## keep waiting if still running
if (( i <= 30 )) ; then
sleep 1 && let i++ && echo $i
else
e=1 && notify-send 'Shutdown has been canceled' 'Please check the status of your virtual machines: seems like even though a stop signal has been sent, some are still running.' --urgency=critical
fi
else
## if no machine is running anymore, original power command can be executed
e=1 && eval $@
fi
done
fi
Systemd Unit
Я также сделал следующий черновик, чтобы управлять выполнением моей виртуальной машины:
bootvm@.service
[Unit]
Description=This service manages the execution of the %i virtual machine
Documentation=https://libvirt.org/manpages/virsh.html
[Service]
ExecStartPre=virsh -c qemu:///system
ExecStart=virsh start %i
ExecStop=virsh -c qemu:///system
ExecStop=virsh shutdown %i
TimeoutStopSec=30
KillMode=none
[Install]
WantedBy=multi-user.target
Но как я могу сказать системе не выключать среду рабочего стола, чтобы она оставалась такой, какая она есть ДО Виртуальная машина была успешно закрыта? Потому что, если система не может выключить виртуальную машину, я хочу сделать это, пока еще в моем DE. Я не хочу, чтобы компьютер начинал останавливать все службы и оставался зависшим до тех пор, пока он просто не выключится.