virtualbox host os 連動 自動起動/終了
ホスト OS (ubuntu20)の起動/終了にゲスト OS (VM)の起動/停止を連動させる
毎日やると意外とゲスト OS の起動/終了は面倒である
概要
ゲスト(vm) 起動/終了のサービスを作って systemd に登録する方法で実現する
systemd に登録することでホストOS起動、終了時に作成したサービスを読み込んでくれる
VM の起動/終了はVBoxManage コマンドを利用する
https://www.virtualbox.org/manual/ch08.html
VM 開始/終了するためにVM の UUID を調べる XXXX-XXXX-XXXX-XXX-XXXXX の部分
$ VBoxManage list vms
"VM_Name" {XXXX-XXXX-XXXX-XXX-XXXXX}
VM 開始
--type headless はウィンドウ(GUI)非表示で起動
VBoxManage startvm VM_UUID --type headless
VM 終了
VBoxManage controlvm VM_UUID acpipowerbutton
vm 起動/終了サービス用のディレクトリ作成
ディレクトリ名はなんでもいい。ここでは、ubuntuVMService とした
mkdir ~/ubuntuVMService
cd ~/ubuntuVMService
vm 起動サービス用のシェル
※sleep 10 念のため入れてるけどなくても大丈夫かもしれない
$ vim start.sh
#!/bin/sh
sleep 10
VMID="bcff1cd2-6410-4eaf-908d-b4cc5e93f34a"
VBoxManage startvm $VMID --type headless
exit
vm 終了サービス終了シェル
※echo ...stop.log の部分は動作確認後は消してもいい
$ vim stop.sh
#!/bin/sh
echo `date "+%Y/%m/%d %H:%M:%S" 'ubuntuVM stopping'` > ~/ubuntuVMService/stop.log
VMID="bcff1cd2-6410-4eaf-908d-b4cc5e93f34a"
VBoxManage controlvm $VMID acpipowerbutton
sleep 10
echo `date "+%Y/%m/%d %H:%M:%S" 'VBoxManage list runningvms'` >> ~/ubuntuVMService/stop.log
echo `VBoxManage list runningvms` >> ~/ubuntuVMService/stop.log
exit
シェル実行権限を与える
$ ll
合計 8
-rw-rw-r-- 1 user user 110 1月 16 15:20 start.sh
-rw-rw-r-- 1 user user 351 1月 16 15:20 stop.sh
$ chmod 755 *.sh
$ ll
合計 8
-rwxr-xr-x 1 user user 110 1月 16 15:20 start.sh*
-rwxr-xr-x 1 user user 351 1月 16 15:20 stop.sh*
vm サービス登録用定義ファイル
Ubuntu では、 systemd でサービスが管理されており、サービス定義ファイルは /etc/systemd/system 配下にある
*.service という定義ファイルを用意する
サービス登録のお作法としては
/lib/systemd/system/my-app.service に定義ファイルを配置して
/etc/systemd/systemn/multi-user.target.wants/my-app.service にシンボリックリンクを張る
ただいつも作ったファイルがどこのディレクトリか忘れるので
今回は、~/ubuntuVMService/ubuntuVM.service を作って
/lib/systemd/system/ubuntuVM.serviceシンボリックリンクを張り
さらに/etc/systemd/system/multi-user.target.wants/ubuntuVM.serviceにシンボリックリンクを張って構築する
$ vim ubuntuV.MService
[Unit]
Description=VirtualBox VM
After=network-online.target
[Service]
User=user
ExecStart=/home/user/ubuntuVMService/start.sh
ExecStop=/home/user/ubuntuVMService/stop.sh
Restart=no
Type=forking
[Install]
WantedBy=multi-user.target
サービス定義ファイルのシンボリックリンクを張る
sudo ln -s /home/user/ubuntuVMService/ubuntuVM.service /lib/systemd/system/ubuntuVM.service
sudo ln -s /lib/systemd/system/ubuntuVM.service /etc/systemd/system/multi-user.target.wants/ubuntuVM.service
systemctl コマンドでサービスを登録する
$ sudo systemctl enable ubuntuVM.service
Created symlink /etc/systemd/system/ubuntuVM.service → /home/user/ubuntuVMService/ubuntuVM.service.
サービスの起動確認
sudo systemctl start ubuntuVM
VM が起動しているか確認する
$ VBoxManage list runningvms
"vmub20_1" {bcff1cd2-6410-4eaf-908d-b4cc5e93f34a}
サービスの終了確認
sudo systemctl stop ubuntuVM
VM が終了しているか確認する
$ VBoxManage list runningvms
何も表示されなければVMは終了している
最後にホストOSを再起動してVM が起動しているか確認して起動していればOK
sudo reboot
OS再起動後
$ VBoxManage list runningvms
"vmub20_1" {bcff1cd2-6410-4eaf-908d-b4cc5e93f34a}
以上。