VirtualBoxのHeadless VMを楽に立ち上げてホストからsshする

VirtualBoxのHeadless VMがCLIで立ち上げられることに気づいたので起動スクリプトを作った

検証環境

  • macOS 10.15.4 (Catalina)
  • Oracle VirtualBox 6.1.8r137981
  • Ubuntu 20.04 (Focal Fossa) server image

VM起動・シャットダウンスクリプト

起動は VBoxHeadless コマンド、シャットダウンは VboxManage コマンドでできる。
$VMIDVboxManage 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 addrip link で確認して欲しい。
ファイルが作成できたら sudo netplan apply する。

IPアドレスを固定すればあとは /etc/hosts でドメイン解決するなり ~/.ssh/config に直書きするなり好きにできる。

まとめ

CLIスクリプトによるVM起動と、固定IPへのsshで快適なVMアクセス環境を整えることができた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です