狐の王国

人は誰でも心に王国を持っている。

Vagrant: Debian Wheezy の base box を作成する

なんとなく流れで気がついたら仮想マシンコマンドラインから生成したり起動したりするツールである vagrant をいじりはじめていた。とりあえず debian 信者である俺は当然のように A list of base boxes for Vagrant から Debian の最新 stable release である wheezy の vanilla base box を拾ってこようとした。

ところがファイルが壊れてるのかなんなのかうまく起動しない。しょうがないので自分で作り始めたのだが日本語のドキュメントがないのでとりあえずメモ的にここに書いておく。

とりあえず vagrant 本体のインストールだが、 gem install vagrant というインストール方法は使えなくなった。古いバージョンしか入らない。今はオフィシャルサイトの ダウンロードページ からインストーラを拾ってくるようになったらしい。

次に VirtualBox をインストールする。新しい vagrantVMware も使えるようになったらしいのだが、とりあえず従来通り VirtualBox を利用してみることにする。

今回は Debian 7 wheezy の base box を作るので、Debian on CDs から今現在の stable release を拾ってくる。俺がいつも使うのは最小サイズの debian-7.3.0-amd64-netinst.iso というやつ。200M 程度しかないので実はいつも手元においてある。

VirtualBox を起動して、Debian を普通にインストールする*1。ただし vagrant base box 用にユーザー名やパスワードは vagrant v1 用のドキュメントだが Vagrant Documentation - Base Boxes にあるように、

Vagrant Documentation - Documentation - Base Boxes

というようにする。今回は wheezy なので hostname は vagrant-debian-wheezy にした。

今回は vanilla wheezy が欲しいので最小構成でインストールする。インストーラのオプションで出てくる desktop environment とかは全部外した。

そんでもって、一度 root でログインし、

# apt-get install openssh-server sudo

追加で入れるパッケージはこれだけ。

v1 ドキュメントには VirtualBoxツールも入れるように指示されてるけど、なんか普通に wheezy のインストーラVirtualBox 用のパッケージ入れてくれてるし、別にいいかなって。

sudo のセットアップ

さてここから vagrant 用のセットアップに入る。vagrant は base box を最初に起動するときに、 vagrant という名前のユーザーで sudo mkdir -p /vagrant などしたりする。このときパスワードを自動入力したりしないので、visudo コマンドで

vagrant ALL=(ALL:ALL) NOPASSWD: ALL

という行を付け加えた。もちろん v1 ドキュメントのように

%sudo ALL=(ALL:ALL) ALL

となってる行を

%sudo ALL=(ALL:ALL) NOPASSWD: ALL

と編集し、 vigr で vagrant ユーザーを sudo グループに入れても構わないだろう。

ssh のセットアップ

それから vagrant ユーザーが ssh アクセスできるように、insecure key を配置する。
v1 ドキュメントには github においてある鍵を使えと書いてあるのだが、これだといまの vagrant ではアクセスできないようだ。しょうがないので vagrant をインストールしたホストで

$ ssh-keygen -y -f ~/.vagrant.d/insecure_private_key > ~/tmp/insecure_public_key

という感じで秘密鍵から公開鍵を作り、これをなんらかの方法で VirtualBox で動いてる仮想マシン内の /home/vagrant/.ssh/authorized_keys に配置する。俺は適当なウェブサーバにおいて wget で取得した。

もちろん /home/vagrant/.ssh 以下のオーナーシップを vagrant:vagrant に変更の上、.sshパーミッションを 700 に変更しておく。

ついでに v1 ドキュメントにもあるのだが、sshd がアクセス元アドレスを逆引きしようとして接続に時間がかかったりしないように、 /etc/ssh/sshd_config に

UseDNS no

なんて行を追加しておく。

ところで sshd の鍵ペアって同じの使いまわすのなんか気持ち悪いんだけど、base box が最初に起動された時に生成しなおす方法ってないもんですかね? 鍵を削除して dpkg-reconfigure openssh-server すればいいんだろうけど1度だけ自動でやるとかどうするのがスマートかなあ。

vagrant で package する

さてここまでできたらあとは仮想マシンを shutdown して vagrant package する。
事前に apt-get clean しておくことを忘れないように。これでキャッシュされてるパッケージが消える。

気になる人は事前に .bash_history などを削除しておこう。ちなみに bash は終了時にヒストリを書き込むので、root の .bash_history は最小でも rm ~/.bash_hisotry; shutdown -h now などが残ることになる。

仮想マシンを終了したら、以下のようなコマンドで base box を作成する。

$ vagrant package --base path/to/virtualmachine

そうするとカレントディレクトリに package.box という名前で作成される。 ls -lh してみると 455M だった。

こんな感じで作ったものを、以下に置いておいた。

さて実際に動作するかテストしてみよう。

$ vagrant box add wheezy path/to/package.box

とやると手元の vagrant に wheezy という名前の base box が追加される。

適当なディレクトリを掘って、

$ vagrant init wheezy

これで wheezy という名前でおいておいた base box から仮想マシンを作る。カレントディレクトリに Vagrantfile が生成されてるはず。

そしていよいよ……

$ vagrant up

で起動する。うまく起動できただろうか?

どうでもいいけど vagrant up ってなんか響きがロボットアニメの合体とかヒーローの変身の掛け声みたいだよな。ヴァグラントアップ!

うまく起動できたら、

$ vagrant ssh

で接続できるか確認しよう。

$ vagrant ssh-config --host v-d-w >> ~/.ssh/config

というような感じで ssh 設定を書き込むと、

$ ssh v-d-w

だけでアクセスできるようになる。

というわけで

「仮想機兵ヴァグラント、次回もヴァグラントアップ!」

*1:インストール時に選ぶパッケージを拾ってくるサーバは cdn.debian.net を選びましょう。CDN という仕組みでその場からもっとも近いサーバが自動的に選択されます

Sugano `Koshian' Yoshihisa(E) <koshian@foxking.org>