VagrantでUbuntuのBoxを作った時にした事



●環境

VirtualBox 4.2.10
Vagrant    1.3.5
packer     0.5.2
guest-os   ubuntu server 12.04
host-os    osx mavericks


●背景

Debianのboxを拾ってきたが、rvmからrubyを数個入れるとdiskが足らなくなった。
なので、diskを追加しようとしたが、boxに定義されてるdiskがLVMではなかったので、
diskを追加できなかった。（osインストール時にする必要があるらしい？）
また、VirtualBoxは作業環境の事情により、アップデートできない。

そこでUbuntuのboxを新たに作成する事にした。


●作業内容

1.インストールdiskのダウンロード

最初に現時点の最新版のubuntu serverをダウンロード。(13.10)
↓
実は最新版のカーネルはインストールするVirtualBoxのguestadditionsに対応していない。
(guestadditionsのビルド時、share foldersの設定で失敗する)
↓
ということで、Ubuntu Server 12.04 を、ダウンロード
（ネット上では、カーネルバージョンは低いハズだった。。。（後述））


2.packerでboxの作成

・ダウンロードしたisoのchecksum取得
　md5 ubuntu-12.04XXXX.iso


・生成スクリプトの準備(template.json)
　disk容量設定：4000（4G）
　iso_url,iso_checksum設定：ローカルisoを指定可。checksumは上記。
　provisionersは要らない
　（どのみちsudoでコケル→guest additionsがビルド出来れば、設定できるかも？）

・packer実行
　packer build テンプレート.json ⇒ ubuntuのインストールが始まる

　[osインストール時の設定]
　ロケールは日本語（キーボードは「日本語」を選択）⇒ timezoneはasia/tokyo
　自動アップデートはしない
　ユーザーはvagrant(パスワードvagrant)
　インストールdiskをLVMにする、grub設定書き込み
　インストールソフトに必ず、SSH Serverを入れる（入れないとpackerのスクリプトが止まる）
　guestadditionsをインストールする（カーネルバージョンが対応してないがDLはしてくれる）

　packerの実行が終わると、実行フォルダに、boxファイルが生成される。

・仮ゲストOS起動
　vagrant box add XXXX packerで生成したboxファイル
　仮のゲストosのフォルダを用意
　登録したbox名(XXXX)でvagrant init
　vagrant up
　※ここでのvagrant upは、必ず異常終了する(sshとsudoの為)が、osは起動する
　vagrant ssh
　※sshが設定されていないので、パスワードを求められる(vagrantでログインするのでvagrant)

・仮ゲストOSの設定
　[sshの設定]
　これにより、vagrant sshでパスワードを要求されなくなる

　mkdir ~/.ssh
　chmod 0700 ./.ssh
　cd ~/.ssh
　wget --no-check-certificate 'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub' -O /home/vagrant/.ssh/authorized_keys
　chmod 0600 ./authorized_keys
　cd ..
　 
　[sudoの設定]
　これにより、sudo実行時、パスワードを要求されなくなる

　sudo visudo
　vagrantの設定を末尾に追加し保存
　vagrant ALL=(ALL) NOPASSWD: ALL

　[カーネルのダウングレード]

　uname -a カーネルの確認（たぶん、3.11系になってる）
　※たぶん、LTSなので、配布インストールイメージも、システムアップデートに合わせて変更されていると思われる。。。

　sudo apt-cache search linux-image インストール可能なパッケージの確認
　sudo apt-get install linux-image-3.8.0-36-generic
　sudo apt-get install linux-headers-3.8.0-36-generic
　※3.8系はビルド可能

　dpkg --list | grep linux-image インストールされているカーネルパッケージの確認
　sudo apt-get purge linux-image-3.11.0-15-generic
　※パージ実行時、勝手に3.11系の最新を入れられるかもしれないので（実際、保留されている更新の中に存在し、パージ実行時に勝手にインストールされた）、それもパージ。
　dpkg --list | grep linux-image インストールされているカーネルパッケージの再確認

　sudo update-grub 上記操作をすれば、3.8が最新になるハズ
　sudo shutdown -r now 再起動
　vagrant ssh 再ログイン
　uname -a カーネルの確認

　[guest additionsインストール]
　これによりvagrant up時のshare-foldersのエラーがなくなる

　ls -la ~/
　※VBoxGuestAdditions_4.2.10.isoの存在確認。なければ、wget
　sudo mount VBoxGuestAdditions_4.2.10.iso -o loop /mnt
　※guest additionsのマウント
　sudo apt-get -y install build-essential linux-headers-`uname -r`
　※build-essentialを入れれば、gccは個別にいれなくてよい？
　sudo apt-get -y install xserver-xorg xserver-xorg-core
　sudo sh /mnt/VBoxLinuxAdditions.run
　※インストール時に -noxにすれば、xserver*は入れなくてよい？
　ログオフし、vagrant reloadすると、vagrant up時のshare-foldersのエラーがなくなる

　[後処理]
　vagrant ssh
　rm ~/VBoxGuestAdditions_4.2.10.iso
　sudo passwd root
　※rootのパスワードはvagrantに設定
　sudo ln -s -f /dev/null /etc/udev/rules.d/70-persistent-net.rules
　※VirtualBoxがMACを覚えている？為、VagrantFileでipを設定しても、勝手にipが設定されてしまうので、無効にする。

 
3.boxの再作成
　仮ゲストOSのフォルダで、vagrant package
　package.boxが生成されるので、名前を変えて、vagrant box add
　仮ゲストosの後始末
　vagrant halt
　vagrant destory
　vagrant box remove XXXX ※packerで作ったboxの除去



●TODO
VirtualBoxのバージョンを上げた時の、guest addtionsの再ビルド設定
（カーネルバージョンによる為。）