まんぼう日記

takataka's diary

VirtualBox上のゲストOSのブート&スナップショット撮影の自動化

余談ですが,25日26日の研究室公開にお越し下さったみなさま,ありがとうございました.って,うちの公開に来てくれてかつここを読んでる,なんちゅう人はおらへん気ぃしますが (^^;

 

と余談ついでに…たかたかのデフォルト装備であるわんつーかたつー( わんつーかたつーはたかたかのデフォルト装備になりました - まんぼう日記 )は,痛み止め飲まずに終日がまんできる日もある,って位までましになってきました.なんかだんだん痛みの範囲が広がりつつ中心が腕の方に移ってきて,今は肘周辺が…そのうち手に移ったり,その手を他人の体に当てるとそっちへ移ったり…んなこたぁない (^^;

 

さて,バックアップは忘れずに - まんぼう日記 に書いたような次第その他もろもろでしっちゃかめっちゃかやった一週間がすぎて,ようやく落ち着きました.大事なことやからもう一度言おう,バックアップは忘れずに - まんぼう日記 で「土日月のうちには…」って書いといて結局水曜になってしまいましたが,そういうわけで,VirtualBox のスナップショットをとる作業を自動化する話と,ついでに VirtualBox上のゲストOSをホストのブート時に自動ブートする - まんぼう日記 とは別の方法でゲストOSのブートを自動化する話です.

 

環境は

  • VirtualBox を動かしてるホストOS: Mac OS X Mountain Lion
  • VirtualBox のバージョン: 4.3.18 

です.以下では,Mac OS X の launchd と,VirtualBox をコマンドラインでいじる方法について,ちょっと知ってることを前提にしてます.いずれもウェブで検索すればいろいろ情報が見つかるでしょう.

スナップショット撮影の自動化

VirtualBoxを動かしてるユーザで

$ vboxmanage snapshot 「VM名」 take 「スナップショット名」

とすればコマンドラインからスナップショットを撮れます(「スナップショット名」は,GUIの「VirtualBox マネージャー」で見える名前). ちゃんと仕組みは理解してませんが,スナップショットを撮ってる間はゲストOSは一時停止状態になるようです.

 

そこで,次のようなシェルスクリプトを用意して,定期的に実行することにします.

#!/bin/sh

name=snapshot`date "+%Y%m%d-%H%M%S"`
echo
echo "##### $name #####" 
vboxmanage snapshot 「VM名」 take $name

このシェルスクリプトを launchd に登録します.~/Library/LaunchAgents/ に以下の内容のファイルを作成しました.ここではファイル名を vbsnapshot.plist としてます.このXMLファイルのキーについては,man launchd.plist に詳しく説明されてます.

ここでは,毎日16時11分(動作確認のために適当に設定しただけ)に上記シェルスクリプトを起動して,その標準出力と標準エラー出力を指定のログファイルに書き込むように設定してます.たかたかは,~/Library/Logs/ 内に適当な名前でログファイルを作ってそこに書き込むようにしてみました(OS X の「コンソール」の ~/Library/Logs からログを参照できたりします).

 

上記のファイルを書いたら,launchctl コマンドでその情報を登録します.

$ launchctl load 「vbsnapshot.plistのパス」

ちなみに,登録解除は

$ launchctl unload 「vbsnapshot.plistのパス」(または Label キーの値)

です.vbsnapshot.plist を変更したら一度 unload して再度 load する必要があります.

 

上記の設定で自動的にスナップショットをとってくれる&ログが残ることを確認したので,起動時刻を修正して運用開始.これだとほっとくとスナップショットだらけになりますが,「VirtualBox マネージャー」で個々のスナップショットを削除するとスナップショットをマージすることができる(どうマージされるんかたかたかはまだわかってませんが)そうなので,適当なタイミングで削除していけばよいでしょう.削除作業を自動化するんは,間違った時が怖いのでやめときます.

 

ブートの自動化

次は,ゲストOSのブートを自動化します.VirtualBox上のゲストOSをホストのブート時に自動ブートする - まんぼう日記 に書いた方法でもいいんですが,headless モードで動くのでコンソール画面が見えへんのがいややったので,自前のスクリプトでブートする設定にしてみました.上記リンク先の設定法は VirtualBox のマニュアルに従ったもので,ホストOS上に複数ユーザがいるような場合のこともちゃんと考えたやり方になってますが,以下に示す方法は「VirtualBox を動かすユーザが OS X のブート時に自動ログインする設定になってる」ことを前提とした,いい加減なものです.

 

まずは,手動でゲストOSを起動してみます.

$ vboxmanage startvm 「VM名」

これだけ.headless モードと違い,ウィンドウが開いてブート中のコンソール画面も見えます.ということで

#!/bin/sh

echo
echo "# " `date`
vboxmanage startvm 「VM名」

とかいうシェルスクリプトを書いて,スナップショットの設定と同様に launchd から実行してもらうようにします.設定ファイルはこんな感じ.

RunAtLoad というキーの値を true にすることで,ログイン時に上記シェルスクリプトが実行される設定になります.ssh 経由でログインしたりした時にどうなるんかが気になりますが,ホストOSのログイン画面からログインしてる状態で他のマシンからsshしてもスクリプトは実行されませんでした.GUIベースでログインしてない状態でsshしたら,ってとこまでは試してません.いいかげん (^^;

 

ともあれ,これでひと安心…かな.