仮想マシン起動&監視デーモン

ルーターとしての用途を考えると、電源が入った時点で仮想マシンが起動している必要がある。
virshにはautostartというオプションがあるが、これは起動順番などは制御できないようなので、自前で起動スクリプトを書いて、初期化時に呼び出すことにした。
下記を参考にした。
[ThinkIT] 第4回:virshコマンドで仮想化を管理する! (2/3)
これで作ったスクリプトをboot.localから呼び出せば自動起動…と思ったのだが、libvirtに必要なサービスが起動していないらしく、起動に失敗した。


試行錯誤の結果、作成した監視スクリプトをsystemdのサービスとして登録し、依存関係を登録してやればうまく動くことが分かった。


まず監視スクリプト

#!/bin/bash

# Must be root
if test "`/usr/bin/id -u`" != 0 ; then
    echo "$0: You must be root to run this script" >& 2
    exit 1
fi

SLEEPTIME=10

boot_vm ()
{
    if test "`virsh domstate $1`" != "running" ; then
        virsh start $1
        rc=$?
        [ $rc -ne 0 ] && exit $rc

        sleep $SLEEPTIME
    fi
}

halt_vm ()
{
    if test "`virsh domstate $1`" != "shut off" ; then
        virsh shutdown $1
        rc=$?
        [ $rc -ne 0 ] && exit $rc

        sleep $SLEEPTIME
    fi
}

exit_service ()
{
    halt_vm leap-router-dmz-int
    halt_vm leap-router-ext-dmz
}

trap "exit_service" EXIT

while true
do
    boot_vm leap-router-ext-dmz
    boot_vm leap-router-dmz-int
    sleep 120
done

pingによる監視なども入れたいと思ったが、とりあえず最低限の起動順序制御・落ちた場合の再起動・ホスト終了時のシャットダウン処理のみ。
これによって、特に操作しなくても自動的にルーター用のVMが起動するようになる。


呼び出すためのsystemdサービス定義。

[Unit]
Description = KVM router startup
After=network.target libvirt-guests.service libvirtd.service
Requires=network.target libvirt-guests.service libvirtd.service

[Service]
ExecStart = /usr/local/sbin/vm-router-service
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

これによって必要なサービスの準備が終わってから起動するようになる。