CentOS 7 のホストに VirtualBox をインストールし、VM の自動起動と停止を設定

今回は CentOS 7 に VirtualBox を yum でインストールし、VM の自動起動ホスト終了時に VM も同時に終了させる設定をします。自宅サーバーや開発環境などで、ホスト起動と同時に VM が自動的に立ち上がって、ホストをメンテナンスなどで停止する際は自動的に VM も停止出来るようすることを目指します。このサイトで利用している VirtualBox 5.2 系です。

現在最新の VirtualBoxは、6.0 系が出ています。Oracle の 5.2 系のサポートは2020年の7月までです。
スポンサーリンク

VirtualBox を yum でインストール

VirtualBox をインストールするにあたり、wget パッケージのインストール と ホストの状態を最新にし再起動します。

yum -y install wget
yum -y update
reboot

次に必要なパッケージをインストールします。これらは、ホストのカーネルの更新時に VirtualBox の 再セットアップで必要になります。(/sbin/vboxconfig や /usr/lib/virtualbox/vboxdrv.sh setup で必要になる)

yum install -y kernel-devel kernel-headers gcc make perl
VirtualBox 5.1から、モジュールの再構築を DKMS に依存しなくなったようです。

続いて、Oracle からパブリックキーをインポートし、レポジトリを設定します。

wget http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc
rpm --import oracle_vbox.asc
wget http://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo -O /etc/yum.repos.d/virtualbox.repo

VirtualBox をインストールします。

yum -y install VirtualBox-5.2.x86_64

VirtualBox で VM を自動起動

ここでは VM が、設定(インストール)またはインポートされ、すでに起動可能な状態にあることが前提とします。
自動起動するために必要な設定ファイルを置くディレクトリを作成し、設定ファイルを生成します。ファイルやディレクトリ名は自由です。ここでは autostart_db ディレクトリと autostart.cfg を作成しています。

mkdir /etc/vbox/autostart_db
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_DB=/etc/vbox/autostart_db" > /etc/default/virtualbox
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 しています)。

sudo -u vboxuser VBoxManage modifyvm VM_NAME --autostart-enabled on

参考URL
https://www.virtualbox.org/manual/ch08.html#vboxmanage-setproperty
https://www.virtualbox.org/manual/ch09.html#autostart

VirtualBox で VM をホスト終了と同時に終了

本来は、以下のコマンドでホスト停止時に自動停止できるはずですが、試したところ出来ないようなのでスクリプトを作成します。

sudo -u vboxuser VBoxManage modifyvm VM_NAME --autostop-type acpishutdown

以下の様に /opt/bin/vboxshutdown を作成します。(エラー時の処理に問題があったので修正しました。なんらかのエラーで停止できない場合はホストも停止しないように変更しています。)

#!/bin/bash

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 を作成します。

#!/bin/bash
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 reboot="sudo /opt/bin/shutdown.sh -r"
alias poweroff="sudo /opt/bin/shutdown.sh -h"
alias shutdown="sudo /opt/bin/shutdown.sh"

エイリアスを反映します。

source /root/.bashrc

これにて設定完了です。

ホストを再起動して VM が自動起動すること、ホストをシャットダウンして起動している VM がホストに合わせてシャットダウンすることを確認します。