今回は CentOS 7 に VirtualBox を yum でインストールし、VM の自動起動とホスト終了時に VM も同時に終了させる設定をします。自宅サーバーや開発環境などで、ホスト起動と同時に VM が自動的に立ち上がって、ホストをメンテナンスなどで停止する際は自動的に VM も停止出来るようすることを目指します。このサイトで利用している VirtualBox 5.2 系です。
VirtualBox を yum でインストール
VirtualBox をインストールするにあたり、wget パッケージのインストール と ホストの状態を最新にし再起動します。
yum -y update
reboot
次に必要なパッケージをインストールします。これらは、ホストのカーネルの更新時に VirtualBox の 再セットアップで必要になります。(/sbin/vboxconfig や /usr/lib/virtualbox/vboxdrv.sh setup で必要になる)
続いて、Oracle からパブリックキーをインポートし、レポジトリを設定します。
rpm --import oracle_vbox.asc
wget http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo -O /etc/yum.repos.d/virtualbox.repo
VirtualBox をインストールします。
VirtualBox で VM を自動起動
ここでは VM が、設定(インストール)またはインポートされ、すでに起動可能な状態にあることが前提とします。
自動起動するために必要な設定ファイルを置くディレクトリを作成し、設定ファイルを生成します。ファイルやディレクトリ名は自由です。ここでは autostart_db ディレクトリと autostart.cfg を作成しています。
chmod 1777 /etc/vbox/autostart_db
touch /etc/vbox/autostart.cfg
chmod 644 /etc/vbox/autostart.cfg
autostart.cfg は、以下のような内容を記載します。1行目で自動起動ポリシーを deny に設定し、VM を自動起動するユーザを許可制にします。2行目で VM を自動起動できるユーザ(linux にログインできる VM 所持ユーザ)を指定します。ここでは vboxuser が VM を自動起動出来るユーザとなります。
1 2 3 4 5 | default_policy = deny vboxuser = { allow = true startup_delay = 10 } |
先ほど作成した、ディレクトリと設定ファイルを VirtualBox が読み込めるように設定します。setproperty は、先ほど自動起動を許可したユーザで実行する必要があります(sudo しています)。
echo "VBOXAUTOSTART_CONFIG=/etc/vbox/autostart.cfg" >> /etc/default/virtualbox
chmod 644 /etc/default/virtualbox
sudo -u vboxuser VBoxManage setproperty autostartdbpath /etc/vbox/autostart_db
VM_NAME は自動起動する VM の名前を指定します。なお、modifyvm は、自動起動を許可したユーザで実行する必要があります(sudo しています)。
参考URL
https://www.virtualbox.org/manual/ch08.html#vboxmanage-setproperty
https://www.virtualbox.org/manual/ch09.html#autostart
VirtualBox で VM をホスト終了と同時に終了
本来は、以下のコマンドでホスト停止時に自動停止できるはずですが、試したところ出来ないようなのでスクリプトを作成します。
以下の様に /opt/bin/vboxshutdown を作成します。(エラー時の処理に問題があったので修正しました。なんらかのエラーで停止できない場合はホストも停止しないように変更しています。)
USER="vboxuser"
export PATH="${PATH:+$PATH:}/bin:/usr/bin:/usr/sbin:/sbin"
SUDO="sudo -u $USER"
VMLIST_CMD="VBoxManage list runningvms"
VMDOWN_CMD="VBoxManage controlvm VMNAME acpipowerbutton"
TIMEOUT=30
timer=0
check_vms_state() {
echo "check VMs state"
RUNNING_VMS=`$SUDO $VMLIST_CMD | wc -l`
if [ $RUNNING_VMS != 0 ]; then
echo "wait for VM shutdown"
sleep 5
timer=$(expr $timer + 5)
if [ $timer -lt $TIMEOUT ]; then
check_vms_state
else
echo "Timeout:Check your VM status and make sure your VM supports ACPI shutdown."
exit 2
fi
fi
}
$SUDO $VMLIST_CMD > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "[FALE] The host's kernel has been updated."
echo "Please try [sudo /sbin/vboxconfig]."
exit 1
fi
$SUDO $VMLIST_CMD | cut -d\" -f2 | while read VM; do
echo "shutdown $VM"
$SUDO ${VMDOWN_CMD/VMNAME/$VM}
done
check_vms_state
exit 0
以下の様に /opt/bin/shutdown.sh を作成します。
echo "shutdown VM..."
/opt/bin/vboxshutdown || exit 1
if [ -n "$1" ]; then
shutdown $1 now
else
shutdown "$@"
fi
ホストの shutdown,reboot や poweroff などのコマンドのエイリアスとして、先ほど作成した /opt/bin/shutdown.sh を登録します。(※ /root/.bashrc に以下を追記します。)
alias poweroff="sudo /opt/bin/shutdown.sh -h"
alias shutdown="sudo /opt/bin/shutdown.sh"
エイリアスを反映します。
これにて設定完了です。