VirtualBoxのHeadless VMがCLIで立ち上げられることに気づいたので起動スクリプトを作った
検証環境
- macOS 10.15.4 (Catalina)
- Oracle VirtualBox 6.1.8r137981
- Ubuntu 20.04 (Focal Fossa) server image
VM起動・シャットダウンスクリプト
起動は VBoxHeadless
コマンド、シャットダウンは VboxManage
コマンドでできる。$VMID
は VboxManage list vms
コマンドで出力されるリストからUUIDをペーストする。$VMCOMMENT
(--comment
) はなくてもよいかもしれないが、GUIから起動したときにこのオプションがついていたので、先ほどのリストからVM名を拾ってくると良いかもしれない。
#!/bin/sh
VMID="xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx" # MUST REPLACE
VMCOMMENT="Ubuntu 20.04 server"
usage() {
cat <<- EOF
$0 [command]
Commands:
start starts VM
stop send ACPI shutdown signal to VM
EOF
}
[ $# -ne 1 ] && {
usage
exit 1
}
[ "$1" == start ] && {
nohup VBoxHeadless --comment "$VMCOMMENT" --startvm $VMID --vrde config &>/dev/null &
exit
}
[ "$1" == stop ] && {
VboxManage controlvm $VMID acpipowerbutton
exit
}
これを ubuntuvm
などのコマンド名にしておけば ubuntuvm start
で起動、 ubuntuvm stop
でシャットダウンできる。
ちなみに VboxManage
コマンドで終了せずに kill
すると仮想マシンが中断状態になる。
nohup + バックグラウンドの合わせ技
余談だが、スクリプト自身の実行は終了するがバックグラウンドプロセスは終了させたくない場合、nohup
が有効である。
今回は start
部分でVMを起動させたままTTYを復帰させる(同じターミナルで今まで通りコマンドを打てるようにする)のに利用している。nohup
を使用しないと、結局バックグラウンドプロセスが終了しない限りシェルのプロンプトが帰ってこない。
よくssh中のセッション切れ対策として紹介されているが、nohup
の効果自体は SIGHUP
(プロセスがTTYを離れる際に送られるハングアップシグナル)を無視するものである。
この特性を利用して、シェルスクリプト内で起動したプロセスを独立させている。
また、&>/dev/null
しているのは、標準出力および標準エラー出力がTTYを向いているとそれらの出力が ~/nohup.out
に保存されてしまうからである。
リダイレクト先を明示している場合は ~/nohup.out
は作成されない。
VirtualBoxのVMログは別の場所に保存されているので問題なく使える。
VMネットワーク設定
続いて、VMを起動した後に固定されたIPアドレスにsshする環境の構築について。
筆者が使用しているVirtualBoxのVMネットワークのデフォルト設定はNATである。
これ以外にもいくつかあり、GUIから「VMの設定画面 > ネットワーク > アダプターN > 割り当て」で選択できる。
- NAT
- ホストのIPアドレスに変換されるNAT(多分正確にはNAPT)を利用してネットワークに接続する。ホストからクライアントには接続できない(ポートフォワードを使用すると部分的に接続可能になる)。
- ブリッジアダプター
- ホストのNICとは独立したクライアント専用NICをホストに設置する。ホストと全く同じサブネットのネットワークに参加する。
- ホストオンリーアダプター
- ホストおよび同じアダプターを用いたVMとの通信のみが可能。ホストより上流には到達できない。
なので「ブリッジアダプター」か「NAT+ホストオンリーアダプター」を使うのが良いだろう。
家庭内のルータの固定IP設定がめんどくさかったら後者をお勧めする。
そして後者の設定方法は先行エントリがあった(https://qiita.com/Yoshiki-Takahashi/items/7274dff15dbafee5b118)
上記エントリとは異なる箇所として、Ubuntu 20.04のサーバイメージでは標準で netplan
が採用されているので、その設定方法だけ記述する。
以下はDHCP offにして、それ以外の設定をいじらず作成したホストオンリーアダプターを第2アダプターに設定した時の固定IP設定である(NATは標準で第1アダプターに設定されているはず)。
$ cat /etc/netplan/99-my-virtualbox-config.yaml
network:
ethernets:
enp0s8:
dhcp4: no
addresses: [192.168.56.101/24]
nameservers:
addresses: [192.168.56.100]
version: 2
今回は enp0s8
となっているが、各自のインタフェースは ip addr
や ip link
で確認して欲しい。
ファイルが作成できたら sudo netplan apply
する。
IPアドレスを固定すればあとは /etc/hosts
でドメイン解決するなり ~/.ssh/config
に直書きするなり好きにできる。
まとめ
CLIスクリプトによるVM起動と、固定IPへのsshで快適なVMアクセス環境を整えることができた。
コメント