使用 virt-manager 啟動虛擬機時在主機中執行腳本
這與我在 Ask Ubuntu: Add physical partition to QEMU/KVM virtual machine in virt-manager上的問題有關(如果需要,請參閱最後的“更新”)。
每次從 virt-manager 啟動 VM 時,是否有一種很好的方法可以在主機上執行任意腳本?
原因是我想自動解除安裝 ESP 分區
/dev/sda1
(作為 掛載在主機中/boot/efi
),並在 VM 斷電時重新掛載它。$$ update $$我使用的腳本可以在這裡找到。
目前可以呼叫的鉤子腳本有五種:
/etc/libvirt/hooks/daemon
在 libvirt 守護程序啟動、停止或重新載入其配置時執行
/etc/libvirt/hooks/qemu
在啟動、停止或遷移 QEMU 來賓時執行
(…)
腳本參數
掛鉤腳本使用特定的命令行參數呼叫,具體取決於腳本和正在執行的操作。
(…)
命令行參數採用這種方法:
- 第一個參數是操作中涉及的對象的名稱,如果沒有,則為“-”。
例如,正在啟動的來賓的名稱。 2. 第二個參數是正在執行的操作的名稱。
例如,如果正在啟動來賓,則為“start”。
(…)
/etc/libvirt/hooks/qemu
- 在啟動 QEMU 來賓之前,會在三個位置呼叫 qemu 掛鉤腳本;如果任何位置發生故障,則不會啟動來賓。從 0.9.0 開始,第一個位置是在 libvirt 執行任何資源標記之前,並且該掛鉤可以分配不受 libvirt 管理的資源,例如 DRBD 或缺少的網橋。這被稱為:
/etc/libvirt/hooks/qemu guest_name prepare begin -
第二個位置,從 0.8.0 開始可用,發生在 libvirt 完成標記所有資源但尚未啟動來賓之後,稱為:
/etc/libvirt/hooks/qemu guest_name start begin -
第三個位置 0.9.13 出現在 QEMU 程序成功啟動之後:
/etc/libvirt/hooks/qemu guest_name started begin -
(…)
所以,在實踐中,這個:
/etc/libvirt/hooks/qemu(無副檔名)
#!/bin/bash if [[ $1 == "<domain_name>" ]] && [[ $2 == "start" || $2 == "stopped" ]] then if [[ $2 == "start" ]] then # unmount logic here else # mount logic here fi fi
當然,編輯
<domain name>
,實現掛載/解除安裝邏輯,然後重啟libvirtd.service
。我正在https://gitlab.com/ranolfi/rvirtesp提供我的完整解決方案。
附錄:對於這個特定的案例,您可能會發現使用選項設置
fstab
文件很有用noauto
,也許還有x-systemd.automount
andx-systemd.device-timeout=<seconds>
。請參閱http://man7.org/linux/man-pages/man5/fstab.5.html>和<https://www.freedesktop.org/software/systemd/man/systemd.automount.html。