В зависимости от того, что вам нужно выполнить при выключении VM, systemd таймер, проверяющий статус VM, может быть хорошим вариантом. У меня есть сценарий использования для этого, где основная функция Proxmox хоста — это запуск единственной VM, используемой как настольная машина с GPU passthrough. Пользователю этой настольной VM не нужно — и он совсем не хочет — знать о Proxmox, пока все USB порты назначены VM, за исключением того, что, к сожалению, выключение VM (очевидно, из гостевой ОС) не выключает хост даже при использовании хукскриптов. Следующий systemd таймер и Python скрипт, использующий Proxmox API через библиотеку proxmoxer, решает эту проблему и выключает хост через несколько минут после выключения настольной VM. Он также пытается убедиться, что хост выключен только в том случае, если настольная VM действительно была запущена и затем выключена, чтобы избежать того, что хост будет постоянно выключаться в порочном круге, например, если VM не удалось запустить после загрузки по какой-то причине и администратору нужно работать с хостом.
Создайте файл /etc/systemd/system/desktop-shutdown.timer
Код:
[Unit]
Description=Проверка, выключена ли настольная VM
[Timer]
OnBootSec=5min
OnUnitActiveSec=5min
Unit=desktop-shutdown.service
[Install]
WantedBy=timers.target
Создайте файл /etc/systemd/system/desktop-shutdown.service
Код:
[Unit]
Description=Проверка, выключена ли настольная VM
[Service]
Type=oneshot
ExecStart=python /var/lib/vz/snippets/desktop-shutdown.py
[Install]
WantedBy=multi-user.target
Создайте файл /var/lib/vz/snippets/desktop-shutdown.py и замените заполнители hostIP, password и VMID
Python:
import os
from proxmoxer import ProxmoxAPI
os.system('logger "Запуск desktop-shutdown.py"')
proxmox = ProxmoxAPI("hostIP", user="root@pam", password="password", verify_ssl=False)
is_vm_running = True if proxmox("nodes/prox/qemu/VMID/status/current").get()['status'] == 'running' else False
tasks = proxmox("nodes/prox/tasks").get()
host_last_start = max([ t['starttime'] for t in tasks if t['id'] == '' and t['type'] == 'startall' and t['status'] == 'OK' ])
vm_last_start = max([ t['starttime'] for t in tasks if t['id'] == 'VMID' and t['type'] == 'qmstart' and t['status'] == 'OK' ])
has_vm_started_after_boot = vm_last_start > host_last_start
if not has_vm_started_after_boot:
os.system('logger "Настольная VM не была запущена, никаких действий."')
elif is_vm_running:
os.system('logger "Настольная VM все еще работает, никаких действий."')
else:
os.system('logger "Настольная VM была выключена, выключение Proxmox хоста сейчас!"')
os.system('shutdown -h now')
pip install proxmoxer
systemctl enable desktop-shutdown.timer
Сообщите, если это оказалось полезным.