Ubuntu 13.04 の vagrant 用 box を作る

そもそも記述者はVirtualBoxもvagrantも初心者ですのでご注意ください

# vagrant とは

VirtualBox のRubyフロントエンド的なものです。puppetやchefと親和性が高いようです。

* [Vagrant (naoya氏による)](http://d.hatena.ne.jp/naoya/20130205/1360062070)
* [VirtualBox 自体の Wikipediaの記述](http://ja.wikipedia.org/wiki/VirtualBox)

追記 (2013-05-29): 現在ではデフォルトでVirtualBoxをサポートしつつ、プラグイン形式で他のVMフォーマットにも対応している、と公式に書かれています。そのレイヤではVMWare等が良い代替になるでしょうね。

# box とは

Vagrant 上で動作する仮想マシンのディスクイメージとメタデータの塊は .box 形式で配布できます。フォーマットについては1.0と1.1 (現在) で違うようですが、今のところ中身は「VirtualBox のディスクイメージ + メタデータ」tar (tar.gz) の様子。イメージそのものですからしばしば数百MBになります。

[本家の説明 (doc v2)](http://docs.vagrantup.com/v2/boxes.html)

.box ファイルは他の環境でも使えます。ということで、puppetやchefの準備が整った出来合いのものが共有されています (例えば [こちら](http://www.vagrantbox.es/))

# 自前でboxを作る、とは

しかし、野良で作られたものがどこまで安全かが良くわからない部分もあり、またカスタマイズしたい場合にどうするのか、といった点に興味があったため、今回この .box を作ることから vagrant に触れることにしました。

特に、今回はUbuntu 13.04 LTSをDebian wheezy 上で作ることにしました。

# 主に参考にしたページ

[Debian wheezyをvagrant用boxにインストール](http://blog.ikeji.ma/archives/941)
[Creating Debian Squeeze Box for Vagrant](http://blog.codeboutique.com/post/creating-debian-squeeze-box-for-vagrant)
[Base Boxes (vagrant v1のドキュメント)](http://docs-v1.vagrantup.com/v1/docs/base_boxes.html)

# 概要

概要レベルでやるべきことは簡単です

* まず VirtualBox 上でVMを作ります。OS (とそのiso)はここで指定します
* 起動後、vagrant のbase boxとして使えるように追加します
    * 例えば デフォルトのユーザとして vagrant を追加し, sudo, ssh, VirtualBox Guest Additions のインストール等も行います
* base box に入れておきたいソフトをインストールします
* 要らないファイルを消すなどしてディスクサイズをなるべく小さくします
    * キャッシュを消すことから初めて、man に関する全てを消す、localeを消す、まで
    * zerofree を用いて仮想ディスクをコンパクトにするともっとよろし ([参考](http://blog.codeboutique.com/post/creating-debian-squeeze-box-for-vagrant))
* "vagrant package" コマンドでパッケージを作成します。 .box ファイルはここで出来ます
* ユーザ側で "vagrant box add" コマンド時に作られた .box ファイルを指定して「複製」します。おしまい

デフォルトのユーザ名やルートのパスワード、sudoの設定等はOS環境をまたがってvagrant上で利用できるように、少しだけ制約があるようです (ssh で公開鍵認証を使え、と言ってくるのがその一つ) 。VirtualBox Guest Additions はおそらくsshポートフォワーディングに必要なんでしょう。

インストールガイド的な記事では、どの追加操作がvagrantの動作に必須で、どれが強く「推奨」で、どれが単なるオプショナルなのかがはっきりしません。設定項目はそもそも多くないので、書かれた内容をやるのが良い気がしました。

強いて言えば

* ssh に関係する設定
* sudoに関係する設定
* VirtualBox Guest Additionsのインストール

はvagrantの動作に必須の印象を受けます。ただそうではないのかも (内部的にどう使われるかも完全にはわかってませんもんで)。パッケージについては「使うものは入れる」ということで、この界隈では良くみかけるpuppetとchefは良く並べられてます。

# ハマりどころ

概要レベルでバージョン指定する必要はありませんな。ここからはDebian wheezy でUbuntu 13.04用のboxを作るさいにハマった点を書いておきます。

## vagrant と VirtualBox は最新にする

Debian wheezy で(2013-05-28現在) パッケージインストールできる VirtualBox (4.1.18) では、VMで起動された Ubuntu 13.04 内において VirtualBox Guest Additions のバイナリをビルド出来ませんでした。

具体的にはコンパイルエラーを吐きました ([参考](https://forums.virtualbox.org/viewtopic.php?f=3&t=53708))。そもそも X Window System に関わる部分はエラーが発生します (「xorgとかないんだけどー」って言われます。これは無視してよいです) が、そこ以外でエラーが出るわけです。

そのため、 apt-get 経由でのインストールは辞めて、VirtualBox 本家の deb パッケージ (64bits) を取り入れて試したところ、上記のバイナリのビルドは成功しました (4.2.12-84980-Debian~wheezy)。

VirtualBox を新しく (上記のレポートによると4.2.8 以降に) すると、VirtualBox Guest Additions については動作するようになるのですが、今度はvagrantのboxをパッケージングする部分で問題が起きます。具体的には、4.2 系のVirtualBoxイメージを Debian wheezy のvagrant (1.0.3-1) でサポートしていない旨エラーが出ました。

こちらもvagrant本家にdebパッケージがあるため、素直にそちらを入れることで対応しました (1.2.2)。

まとめると、Debian wheezyでは VirtualBox 4.2.8 以降、vagrant をなるべく新しいバージョンにするべく、先回りして最新版をインストールしておくのがお得です。

## %admin ALL=(ALL) NOPASSWD: ALL は sudo行の下。マシンをリブートするなどして確認

vagrantの base box ではユーザ名 vagrant, パスワード vagrant とする標準ユーザを利用するのが一般的のようです。そして、vagrant ユーザには __password less__ の sudo として admin グループを活用する事例が書かれています (どこまでが推奨でどこまでがvagrantのデザイン的に必須なのかはわかりませんでした)。

さて、(Ubuntu 13.04 の) sudo はパスワードを入力したあとしばらくその状態を維持しますので、ログアウトしてログイン後に sudo してもパスワードを聞かれなかったりします。password lessにしたつもりでシステムリブートすると、あら不思議、パスワードを聞かれるのだわ。

というわけで password-less sudo になっているかをちゃんと確認しましょう。

私が見たケースでは、

    %admin ALL=(ALL) NOPASSWD: ALL

の行はファイル末尾 (多分 sudo グループに関する設定の後、というのが真実) に書く必要がありました。

＃ ところでなんでそうするんでしょう。vagrant がセットアップ時に自分で使うんでしょうか

# パッケージサイズ

今回はサイズを気にしない前提で ubuntu-13.04-server-amd64.iso を利用してアグレッシブにディスクサイズを削減せずにディスクイメージを作りました。

結果として出来た box ファイルは700MB近く。 /usr/share/doc を消す、不要なLinux Kernel (header) パッケージを消すなどしてもそういう状態です。du / によると

* /usr 464352KB
* /var 243232KB
* /lib 220644KB

で 906MB 、dfによれば トータルで 995MBです。明らかに改善の余地が多々あることがわかります。

debのパッケージサイズについては

    dpkg-query -W --showformat='${Installed-Size;10}\t${Package}\n' | sort -n

の結果の上位10個が

*     13723	gcc-4.7
*     14082	perl-modules
*     14992	iso-codes
*     16071	g++-4.7
*     17142	perl
*     22376	vim-runtime
*     32837	linux-image-3.8.0-22-generic
*     40731	linux-firmware
*     58690	linux-headers-3.8.0-22
*    126372	linux-image-extra-3.8.0-22-generic

となっています。本気で配布するつもりならカーネルモジュールのレベルで手を入れるのでしょうが、そこまでガチのツールなのか、正直確信が持てません。

このあたり何かご意見があれば教えてください。出来れば rm -rf で /usr/share 色々ぶっとばすのはやりたくないのだけど、まぁやるのか。いいのか。あんまり doc パッケージに切り分けられてる、って感じじゃないんだよな全体的に。

Debianでは businesscard ISO とかいうのが確か非常にコンパクトなサイズでOSを構築出来る関係で小さいイメージを作り易かった記憶があります。Ubuntuではほんの少し調べた感じではそういう対応はないような気がしましたが、その辺りもしっかり調べてませんので、何か知っていれば教えてください。