Scripting

使用 virt-manager 啟動虛擬機時在主機中執行腳本

  • January 7, 2020

這與我在 Ask Ubuntu: Add physical partition to QEMU/KVM virtual machine in virt-manager上的問題有關(如果需要,請參閱最後的“更新”)。

每次從 virt-manager 啟動 VM 時,是否有一種很好的方法可以在主機上執行任意腳本?

原因是我想自動解除安裝 ESP 分區/dev/sda1(作為 掛載在主機中/boot/efi),並在 VM 斷電時重新掛載它。

$$ update $$我使用的腳本可以在這裡找到

來自libvirt:特定係統管理的掛鉤

目前可以呼叫的鉤子腳本有五種:

  • /etc/libvirt/hooks/daemon

在 libvirt 守護程序啟動、停止或重新載入其配置時執行

  • /etc/libvirt/hooks/qemu

在啟動、停止或遷移 QEMU 來賓時執行

(…)

腳本參數

掛鉤腳本使用特定的命令行參數呼叫,具體取決於腳本和正在執行的操作。

(…)

命令行參數採用這種方法:

  1. 第一個參數是操作中涉及的對象的名稱,如果沒有,則為“-”。

例如,正在啟動的來賓的名稱。 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.automountand x-systemd.device-timeout=&lt;seconds&gt;。請參閱http://man7.org/linux/man-pages/man5/fstab.5.html>和<https://www.freedesktop.org/software/systemd/man/systemd.automount.html

引用自:https://unix.stackexchange.com/questions/374551