Mar 24th, 2013

build vagrant box for squeeze64

最近 vagrant がまた話題になっているので久しぶり(390日?)に触ってみたのだけど、公開されている box が海外の人作成のものが多いので、割と変更する箇所が多いので苦痛だった。
やっぱり自分で作るかと思って veewee を入れてみたら最新のバージョン1.1.2に対応してないらしく、エラーでまくりだったので、基本に戻って Vagrant + Virtualbox の基本機能で作成してみたらやっぱり大変だったので、その記録として残しておきます。

virtualboxで作成したときの設定は以下の通り。

  • Hostname: squeeze64
  • Domain: (空白)
  • Root Password: vagrant
  • Account Id: vagrant
  • Account Password: vagrant
  • Mirror server: japan ftp.jp.debian.org
  • Install Software: all unchecked
  • Keyboad: America
  • language: en_US.UTF-8

以下プロンプトで # がある場合には root で作業していていると適宜読み替えてください。

sudo & openssh install

まずは sudosshサーバをインストール。

# apt-get install sudo openssh-server openssh-client

そして、DNSを使わない設定を ssh に追加しておく。

# echo 'UseDNS no' >> /etc/ssh/sshd_config

editor config

必須では無いが visudo などで利用されるエディタが nano なので修正しておく。

# update-alternatives --set editor /usr/bin/vim.tiny

sudo config

vagrant ユーザで sudo がパスワード無しで実行できる必要があるので /etc/sudoers.d のディレクトリの下に vagrant というファイルを以下の内容で作成する。 よくsudoの権限を修正するときに admin グループを追加して %admin の権限を追加する情報を見るけれど、こちらの方が大本を修正する必要が無いのでおすすめ。

vagrant ALL=(ALL) NOPASSWD:ALL

またこのファイルは owner(=root)group(=root) のみが読める必要があるのでパーミッションを変更。

# chmod 440 vagrant

vagrant ssh

vagrant ssh でログインするときに必要な公開鍵を設定する

# su - vagrant
$ mkdir .ssh
$ wget --no-check-certificate -O .ssh/authorized_keys https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys

guest addition package

virtualboxの管理を行うためにアクセスを許可する追加パッケージがあり、それらは既にvirtualboxインストール時に追加されているものもあるのだが古いので新しくインストールし直す。

パッケージ削除の前にロードされているサービス停止とモジュールの削除。

# /etc/init.d/virtualbox-ose-guest-utils stop
# rmmod vboxguest

そして古いパッケージの削除。

for squeeze
# apt-get autoremove virtualbox-ose-guest-dkms virtualbox-ose-guest-utils virtualbox-ose-guest-x11
for wheezy
# apt-get autoremove virtualbox-guest-dkms virtualbox-guest-utils virtualbox-guest-x11

Guest Addtions を追加する前に module-assistant を導入して、シンボリックリンクの生成をしておく。

# apt-get install module-assistant
# m-a prepare

次に virtualbox で実行している方のメニューにある デバイスGuest Additions のインストール を選択する。すると実行している仮想環境の方で mount 出来るようになっている。メニューについてはわかりにくすぎるかもしれないので以下に画像を掲げる。

ScreenShot

選択したら実行してるVMに戻って mount して、シェルスクリプトを実行し追加パッケージをインストールする。
このシェルスクリプトでは環境の差異を吸収しつつ、カーネルのモジュールのビルドと起動時に実行するスクリプトがインストールされる。

# mount /dev/cdrom
# yes|sh /media/cdrom/VBoxLinuxAdditions.run

インストールの結果、 Installing the Window System drivers ...fail! というメッセージが表示されるがX環境が入っていないだけなので問題ない。 ここまで来たら一旦再起動。

# shutdown -r now

clean up

vagrantで作成するときに改めて作成するようにネット環境などの情報を削除しておく。 まずはdhcpリリース情報を削除。

# rm /var/lib/dhcp/*

同様にudev情報を削除

# rm -f /etc/udev/rules.d/70-persistent-net.rules

同様に/etc/resolv.confを削除。

# rm -f /etc/resolv.conf

box作成時の圧縮効率を上げるためにフリー領域にファイルを作成し削除を行う。

# dd if=/dev/zero of=/EMPTY bs=1M
# rm /EMPTY

他に linux-headers- とか build-essential などを削除しておくとVMのサイズが小さくなるのだけど、立ち上げたら定番で入れるので入れたままにしておく。小さい方が良いということなら削除した方がいいでしょう。

shutdown

ちょっとハマったのだけど、BOXを作成するためにはVMがシャットダウンされている必要があるのでシャットダウン。

# shutdown -h now

BOX作成

ここでローカルに戻って以下のコマンドを実行

$ vagrant package --base <Virutalboxで作成した時の名前>
[squeeze64] Clearing any previously set forwarded ports...
[squeeze64] Creating temporary directory for export...
[squeeze64] Exporting VM...
[squeeze64] Compressing package to:

すると実行した場所に package.box という名前でファイルが出来ているので、次のコマンドで vagrantのboxに追加する。

$ vagrant box add squeeze64 package.box
Downloading with Vagrant::Downloaders::File...
Copying box to temporary location...
Extracting box...
Cleaning up downloaded box...
Successfully added box 'squeeze64' with provider 'virtualbox'!

vagrant init & up

これ以後はvagrantの使い方そのままになるのだけど、軽く書いておきます。 適当なディレクトリを作成し、そこで vagrant の準備を行う

$ vagrant init squeeze64

そして起動。

$ vagrant up
自分の環境では上記のようにして作ったVMを起動すると初回のみ以下のようなメッセージが表示されてしまう。だけど、共有フォルダも使えるしポート転送も使えるしVMのメモリサイズ変更も行える。だから現状問題は無いのでスルーしております。

この部分の原因は Additions インストール前に m-a prepare していないことが原因だったようです。

[default] No guest additions were detected on the base box for this VM! Guest
additions are required for forwarded ports, shared folders, host only
networking, and more. If SSH fails on this machine, please install
the guest additions and repackage the box to continue.

This is not an error message; everything may continue to work properly,
in which case you may ignore this message.

無事起動し終わったら、vagrant ssh で接続できることを確認。

$ vagrant ssh

後始末

作成したVMイメージはもう要らないので Virtualbox から削除し、vagrant packageで作成した package.box も削除しておく。 お疲れ様でした。

2013-03-30 update
初回起動時のメッセージ表示の原因が分かったので追記。

2013-03-31 update
古いパッケージ削除時の処理を追加。文言の修正。
圧縮効率を上げるための処理を追加。

2013-05-07 update
清書および文章の修正。 m-a prepare 実行時 linux-headersbuild-essential がインストールされていない場合、自動でインストールされるので削除。 削除するパッケージが squeeze と wheezy で違うのでコメントの追加。