VeeWeeを使わずWheezyのVagrantのBoxを作る

nogajun
nogajun

_

Vagrantといえば今更だけど、特殊な状況があって環境を用意する必要がありVirtualBox単体で作ってもよかったのだけれど、ちょっと慣れておこうかと思ってVagrantをインストールしてみた。 しかし、Vagrantbox.esにプレーンなDebian WheezyのboxがなかったのでBase boxから作ってみたのでメモ。

使用したVagrantは、debianパッケージもありますがgemからインストールしています。バージョンはVagrantは1.0.7。Virtualboxは4.2.12です。

参考

ベース仮想マシンの作成

Vagrantのドキュメントに書かれている仮想マシンの構成に従って作成します。

ハードディスク 40GB以上
メモリ なるべく少なく(360MB)
オーディオ・USB 無効
ネットワーク NAT
  • 最終的なboxサイズは500MB以下にする。

ということで、こんな感じで作成しました。

  • OSタイプ: Debian
  • メモリ: 384MB
  • VRAM: 9MB
  • HDD: 50GB

GUIから普通に作ってもよいですが、コマンドラインから作るとこんな感じ。 (というかコマンドラインから作る必要性はまったくなく、ちょっと書いてみたかっただけなので無理にこれを使うことはないです。)

# Debianマシンの設定
vboxmanage createvm --name vagrant-debian-wheezy --ostype Debian --register
vboxmanage modifyvm vagrant-debian-wheezy --memory 384 --vram 9 --rtcuseutc on
# ストレージコントローラの設定
vboxmanage storagectl vagrant-debian-wheezy --name IDE --add ide
vboxmanage storagectl vagrant-debian-wheezy --name SATA --add sata --sataportcount 1
# HDDを作成(50GB)
vboxmanage createhd --filename ~/VirtualBox\ VMs/vagrant-debian-wheezy/vagrant-debian-wheezy.vdi --size 51200
# HDDとCDをマウント
vboxmanage storageattach vagrant-debian-wheezy --storagectl IDE --port 1 --device 0 --type dvddrive --medium ~/debian-7.0.0-i386-CD-1.iso
vboxmanage storageattach vagrant-debian-wheezy --storagectl SATA --port 0 --device 0 --type hdd --medium ~/VirtualBox\ VMs/vagrant-debian-wheezy/vagrant-debian-wheezy.vdi
# ブートデバイスの変更
vboxmanage modifyvm vagrant-debian-wheezy --boot1 dvd --boot2 disk --boot3 none --boot4 none

Debianのインストール

VirtualBoxにWheezyをインストールします。インストールは通常のインストールで構いませんが、サイズを小さくするため「ソフトウェアの選択」のチェックをすべて外してインストールします。また、個人的にはrootは不要なので「rootのパスワード」の入力画面でパスワードを空にしてrootを無効にしています。

ネットワークとアカウントは、Vagrantのドキュメントにしたがって設定します。

ホスト名 vagrant-[os名] 例) vagrant-debian-lenny
ドメイン vagrantup.com
Rootパスワード(rootを無効にするなら不要) vagrant
メインアカウント名 vagrant
メインアカウントパスワード vagrant

vagrantユーザの設定

vagrantユーザーでログインをして、Debianの設定をおこないます。 最初にロケールが「ja_JP.UTF-8」ではコンソール上では文字化けをするので「C」に設定しておきます。

$ export LANG=C

続いて、vagrantユーザーがパスワード無しで管理者権限になれるように設定します。 rootを無効にしてインストールしたなら、vagrantユーザーはsudoグループに入っているので、visudoを使い%sudoの行にNOPASSWDを追加します。

$ sudo /usr/sbin/visudo

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) NOPASSWD:ALL

rootユーザーを有効にしている場合は、sudoをインストールしてvagrantユーザーをsudoグループに追加してから上の設定をおこないます。

$ su -
# apt-get install sudo
# usermod -G sudo vagrant

GuestAdditionsの設定

VirtualBoxにDebianをインストールすると、自動的にvirtualbox-guest-dkmsパッケージがインストールされるので改めてインストールする必要はありませんが、気になる人はこれらのパッケージを削除してインストールしなおしてもよいと思います。 (VirtualBoxとGuestAdditionsのバージョンが異なった状態でVagrantを使うと警告が出ますが、GuestAdditionsの機能はホストゲスト間のファイル共有しか使っていないので、よほど大きくバージョンが異ならなければ問題は出ないはず。)

$ sudo apt-get purge virtualbox-guest-dkms virtualbox-guest-utils
$ sudo apt-get install build-essential dkms
(VirtualBoxのメニューの[デバイス]→[GuestAdditionsのインストール]を選択してから)
$ sudo mount /media/cdrom
$ sudo sh -C /media/cdrom/VBoxLinuxAdditons.run

SSHのインストール

SSHを使うための設定をします。 ca-certificatesパッケージは、wgetでSSH公開鍵を取得する際に必要になるのでインストールしています。

$ sudo apt-get install ssh ca-certificates
$ sudo sh -c "echo 'UseDNS no' >> /etc/ssh/sshd_config"
$ mkdir ~/.ssh/
$ wget -O ~/.ssh/authorized_keys https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub
$ chmod 700 ~/.ssh/
$ chmod 600 ~/.ssh/authorized_keys

その他の設定

あとは適当にrubyやchefなどをインストールしたり、いろいろ必要なことをおこないます。

クリーンアップ

これは定番ですね。不要なDebianパッケージを削除します。

$ sudo apt-get autoremove
$ sudo apt-get clean
dhcpの情報を削除する

気になる人は気になるかもしれないdhcpの情報を削除しておきます。

$ sudo rm /var/lib/dhcp/dhclient.*
$ sudo rm /etc/resolv.conf
grubの待ち時間をなくす

vagrant upしたとき、ちょっと早くなるかな? /etc/default/grubを編集してGRUB_TIMEOUTの値を0にします。

$ sudo vi /etc/default/grub

GRUB_TIMEOUT=0

編集がおわったgrubの設定を更新します。

$ sudo /usr/sbin/update-grub

Vagrantパッケージ化とテスト

ベースとなる仮想マシンが出来ればVagrant用にパッケージ化します。

$ vagrant package --base vagrant-debian-wheezy

パッケージ化出来るとpackage.boxというファイルができているので、package.boxを登録してみます。例ではd7という名前で登録しました。

$ vagrant box add d7 package.box
[vagrant] Downloading with Vagrant::Downloaders::File...
[vagrant] Copying box to temporary location...
[vagrant] Extracting box...
[vagrant] Verifying box...
[vagrant] Cleaning up downloaded box...

適当なディレクトリを作成して登録したboxのテストをします。

$ mkdir test_env
$ cd test_env

$ vagrant init d7
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

登録したboxを起動します。

$ vagrant up
[default] Importing base box 'd7'...
[default] Matching MAC address for NAT networking...
[default] Clearing any previously set forwarded ports...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] The guest additions on this VM do not match the install version of
VirtualBox! This may cause things such as forwarded ports, shared
folders, and more to not work properly. If any of those things fail on
this machine, please update the guest additions and repackage the
box.

Guest Additions Version: 4.1.18
VirtualBox Version: 4.2.12
[default] Mounting shared folders...
[default] -- v-root: /vagrant

無事起動したようです。SSHのポートをポートフォワーディングしてますね。 /vagrantでホストとゲスト間のファイルを共有できます。

SSHでログインしてみます。

$ vagrant ssh
Linux vagrant-debian-wheezy 3.2.0-4-686-pae #1 SMP Debian 3.2.41-2 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Mon May  6 23:13:52 2013
/usr/bin/xauth:  file /home/vagrant/.Xauthority does not exist

vagrant@vagrant-debian-wheezy:~$ ls -la
total 32
drwxr-xr-x 3 vagrant vagrant 4096 May  6 23:31 .
drwxr-xr-x 3 root    root    4096 May  6 23:13 ..
-rw------- 1 vagrant vagrant   67 May  6 23:31 .Xauthority
-rw------- 1 vagrant vagrant  405 May  6 23:19 .bash_history
-rw-r--r-- 1 vagrant vagrant  220 May  6 23:13 .bash_logout
-rw-r--r-- 1 vagrant vagrant 3392 May  6 23:13 .bashrc
-rw-r--r-- 1 vagrant vagrant  675 May  6 23:13 .profile
drwx------ 2 vagrant vagrant 4096 May  6 23:17 .ssh

ということで作成できました。

あとは巷に溢れるblogなどをみながらいろいろ試すとよいと思います。

_ zerofreeを使うとかなりファイルサイズがかなり縮む

zerofreeというのは、ext2/3/4用のファイルシステムの空き領域をゼロクリアするツールです。 Vagrantのboxを上のような感じで何も考えず作ると、だいたい400〜500MBになりますが、zerofreeで空き領域をクリアするとかなり縮みます。

$ ls -lah
合計 724M
drwxr-xr-x   2 jun jun 4.0K  5月  7 12:20 .
drwxr-xr-x 241 jun jun  20K  5月  7 12:20 ..
-rw-r--r--   1 jun jun 3.9K  5月  7 11:36 Vagrantfile
-rw-r--r--   1 jun jun 277M  5月  7 11:18 package.box
-rw-r--r--   1 jun jun 448M  5月  6 23:22 package.box_old

package.box_oldは何も考えず作ったもので448MBありましたが、zerofreeで空き領域をクリアしたpackage.boxは277MBと171MBも差がでました。

使い方としては、Debianではサクッと apt-get install zerofree でインストールして、root権限で

zerofree -v (パーティション)

とすれば使えますが、アンマウントしたパーティションかリードオンリーでマウントされたパーティションにしか使えないので、自分はライブCDを起動して、そこから実行しました。

これはいいかも。