仮想マシン起動&監視デーモン
ルーターとしての用途を考えると、電源が入った時点で仮想マシンが起動している必要がある。
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
これによって必要なサービスの準備が終わってから起動するようになる。