web-dev-qa-db-ja.com

virt-managerで仮想マシンを起動するときにホストでスクリプトを実行します

これは、Ask Ubuntuでの私の質問に関連しています: virt-managerでQEMU/KVM仮想マシンに物理パーティションを追加 (必要に応じて、末尾近くの「アップデート」を参照してください)。

VMがvirt-managerから起動されるたびにホスト上で任意のスクリプトを実行する良い方法はありますか?

その理由は、ESPパーティション/dev/sda1(ホストに/boot/efiとしてマウントされている)を自動的にアンマウントし、VMの電源がオフになっています。

[更新]私が使用していたスクリプト ここにあります

2
Marc.2377

From libvirt:特定のシステム管理のフック

現在、呼び出すことができる5つのフックスクリプトがあります。

  • _/etc/libvirt/hooks/daemon_
    libvirtデーモンが開始、停止、またはその構成を再ロードするときに実行されます

  • _/etc/libvirt/hooks/qemu_
    QEMUゲストが起動、停止、または移行されたときに実行されます

(...)

スクリプト引数

フックスクリプトは、スクリプトと実行される操作に応じて、特定のコマンドライン引数で呼び出されます。

(...)

コマンドライン引数はこのアプローチを取ります:

  1. 最初の引数は、操作に関係するobjectの名前です。存在しない場合は「-」です。
    たとえば、開始されているゲストの名前。

  2. 2番目の引数は、実行中のoperationの名前です。
    たとえば、ゲストが起動している場合は「start」。

(...)

/ etc/libvirt/hooks/qemu

  • QEMUゲストが開始される前に、qemuフックスクリプトが3つの場所で呼び出されます。いずれかの場所で障害が発生した場合、ゲストは起動されません。 0.9.0以降の最初の場所は、libvirtがリソースのラベル付けを実行する前であり、フックは、DRBDや欠落しているブリッジなど、libvirtによって管理されていないリソースを割り当てることができます。これは次のように呼ばれます:
    _/etc/libvirt/hooks/qemu guest_name prepare begin -_

    2番目の場所(0.8.0以降で使用可能)は、libvirtがすべてのリソースのラベル付けを完了した後、ゲストをまだ起動していない後に発生します。
    _/etc/libvirt/hooks/qemu guest_name start begin -_

    3番目の場所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_および_x-systemd.device-timeout=<seconds>_。 http://man7.org/linux/man-pages/man5/fstab.5.html および https://www.freedesktop.org/software/systemd/man/を参照してください。 systemd.automount.html

1
Marc.2377