KVMホストでは、ACPIシャットダウンイベントをリッスンしないレガシーOSを備えたVMがいくつかあります。Debian9.5ホストで発生するように、シャットダウン時にlibvirt-guests.service
は5分間待機します。そのようなVM)ごとに、それを破棄します。
これを回避してクリーンにシャットダウンするために、特別なメソッドを使用してシャットダウンするスクリプトを使用して、カスタムVMシャットダウンサービスを作成しました。
% cat /etc/systemd/system/multi-user.target.wants/vm_stop.service
[Unit]
Description=vm_shutdown
Before=libvirt-guests.service
[Service]
ExecStart=/bin/true
ExecStop=/usr/local/bin/vm_shutdown_all.sh
[Install]
WantedBy=multi-user.target
ただし、シャットダウン時に、上記のサービスのlibvirt-guests.service
設定にもかかわらず、サービスは実行されているように見えますafterBefore=
。
これで、カスタムサービスが実際にシャットダウン時に実行されることをテストしました。これは、検証できるテストファイルをtouch
esします。
問題:libvirt-guests.service
の前に実行されるようにするにはどうすればよいですか?
Before=
ステートメントは、サービスの開始に関連しています。 man systemd.unit
から。
ユニットfoo.serviceにBefore = bar.serviceの設定が含まれていて、両方のユニットが開始されている場合、bar.serviceの起動は、foo.serviceの起動が完了するまで遅延されます。
.。
順序に依存する2つのユニットがシャットダウンされると、起動順序の逆が適用されることに注意してください。つまり、ユニットが別のユニットでAfter =で構成されている場合、両方がシャットダウンされると、前者は後者の前に停止されます。
したがって、After=libvirt-guests.service
が開始された後にサービスが開始され、libvirt-guests.service
が停止される前にサービスが停止されるため、libvirt-guests.service
を使用してサービスを構成する必要があります。