Vagrant の VirtualBox 用 Base Box ファイルを手動で作ってみる
Vagrant で作成した既存の仮想マシンを元にした Base Box ファイルの作り方は以前この記事で扱った。 今回はまっさらな状態から手動で Base Box ファイルを作る方法について書いてみる。 おそらく本格的にやるなら VeeWee や Packer といったツールで自動化するんだろうけど、何事も一足飛びは失敗の元なので最初はマニュアルでやってみる。
Vagrant ホストには Mac OS X Mavericks (10.9.1) を使った。 VirtualBox のバージョンは 4.3.6 で、Vagrant のバージョンは 1.4.3 で動作確認している。 作成する Base Box ファイルは CentOS 6.5 (minimal) にする。
まず、一般的な Base Box ファイルの要件は以下に書かれている。
http://docs.vagrantup.com/v2/boxes/base.html
内容を要約すると以下の通りだ。
"vagrant" ユーザにログイン用の公開鍵を設置する
"root" ユーザのパスワードは "vagrant" にする
"vagrant" ユーザはノーパスワードで "sudo" できる
SSH デーモンの設定で "requiretty" と "UseDNS" を無効にする
VirtualBox プロバイダ固有の内容については以下を参照する。 こちらには VirtualBox Guest Additions をインストールすること、パッケージングには vagrant package コマンドが使える等が書かれている。
http://docs.vagrantup.com/v2/virtualbox/boxes.html
それでは早速作っていこう。 まず VirtualBox に CentOS 6.5 を minimal でインストールする。 仮想マシンに指定するパラメータは以下の通り。
ハードドライブ: 64GB (VDI/可変サイズ)
名前は何でも構わないが、今回は vagrant-centos6 にする。
ハードドライブは VMDK でも良いようだが今回は VDI 形式にする。
もっと大きくても構わないが今回はサイズを 64GB にする。
ここまでで、ひとまず起動の準備はできた。 次に、仮想マシンの設定から USB コントローラの有効化を解除する。
本家のドキュメントにはないが、今後の作業を考えてポートフォワーディングで仮想マシンに SSH できるようにしておきたい。 まず、ネットワーク設定を開く。
仮想マシンの TCP/22 ポートをホストの TCP/2222 に紐付ける。
上記の設定が終わったら実際に仮想マシンをインストールする。 CentOS 6.5 の iso イメージから minimal でインストールしよう。 その際、root パスワードは "vagrant" に指定する。
これ以降はインストールした CentOS 6.5 の設定を行う。 minimal でインストールすると初期状態では NIC が起動時に up していないので、まずはそこを直す。 eth0 を DHCP で動作させる。
# sed -i -e "s:^ONBOOT=no$:ONBOOT=yes:" /etc/sysconfig/network-scripts/ifcfg-eth0 # service network restart # ip addr show eth0 2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 08:00:27:91:c3:76 brd ff:ff:ff:ff:ff:ff inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0 inet6 fe80::a00:27ff:fe91:c376/64 scope link valid_lft forever preferred_lft forever
MAC アドレスの記憶を無効化して、NIC に振られた UUID も消しておく。 これは Vagrant のドキュメントには無いものの、忘れると NIC のナンバリングが eth1 からになったりして苦労する。
# ln -f -s /dev/null /etc/udev/rules.d/70-persistent-net.rules # sed -i -e "s:HWADDR=.*::g" /etc/sysconfig/network-scripts/ifcfg-eth0 # sed -i -e "s:UUID=.*::g" /etc/sysconfig/network-scripts/ifcfg-eth0
ssh デーモンの設定を行う。 UseDNS を無効にして起動する。
# sed -i -e "s:^#UseDNS yes:UseDNS no:" /etc/ssh/sshd_config # service sshd start # chkconfig sshd on
これ以降は SSH を使って VirtualBox を動作させているホスト経由で操作できる。
vagrant グループ&ユーザを追加してノーパスワードで sudo できるようにする。 ついでに requiretty を無効にする。
# groupadd vagrant # useradd vagrant -g vagrant -G wheel # echo "vagrant ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers # sed -i -e "s:^.*requiretty:#Defaults requiretty:" /etc/sudoers
vagrant ユーザが公開鍵を使ってログインできるように鍵を設置する。 パーミッションには注意する。
# su - vagrant $ mkdir ~/.ssh $ chmod 0700 ~/.ssh $ curl -L -o ~/.ssh/authorized_keys https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub $ chmod 0600 ~/.ssh/authorized_keys
最後に VirtualBox の Guest Additions をインストールする。 仮想マシンに Guest Additions 用の CD/DVD を接続した上で以下の操作を行う。 インストールが上手くいかないときは /var/log/vboxadd-install.log にログがあるのでそこを参照する。
# yum -y update # shutdown -r now # yum -y install kernel-devel gcc perl # mount -t iso9660 /dev/cdrom /mnt # sh /mnt/VBoxLinuxAdditions.run
以上で仮想マシンの設定は完了。 シャットダウンしておく。
ここからはまた VirtualBox を動かしているホスト側の操作。 仮想マシンが保存されているディレクトリに移動して Base Box ファイルにパッケージする。
$ cd ~/VirtualBox\ VMs/vagrant-centos6/ $ vagrant package --base vagrant-centos6 $ ls | grep package.box package.box
完成した Base Box ファイルを Vagrant に登録する。
$ vagrant box add mycentos65 package.box
登録した Base Box ファイルを元に仮想マシンを作成してログインしてみる。
$ vagrant init mycentos65 $ vagrant up $ vagrant ssh $ uname -a Linux localhost.localdomain 2.6.32-431.5.1.el6.x86_64 #1 SMP Wed Feb 12 00:41:43 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux