VeeWeeを使わずWheezyのVagrantのBoxを作る
Vagrantといえば今更だけど、特殊な状況があって環境を用意する必要がありVirtualBox単体で作ってもよかったのだけれど、ちょっと慣れておこうかと思ってVagrantをインストールしてみた。 しかし、Vagrantbox.esにプレーンなDebian WheezyのboxがなかったのでBase boxから作ってみたのでメモ。
使用したVagrantは、debianパッケージもありますがgemからインストールしています。バージョンはVagrantは1.0.7。Virtualboxは4.2.12です。
参考
- Vagrant Documentation - Documentation - Base Boxes: http://docs-v1.vagrantup.com/v1/docs/base_boxes.html
ベース仮想マシンの作成
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を使うとかなりファイルサイズがかなり縮む
- Debian -- sid の zerofree パッケージに関する詳細: http://packages.debian.org/ja/sid/zerofree
- Keeping filesystem images sparse: http://intgat.tigress.co.uk/rmy/uml/index.html
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を起動して、そこから実行しました。
これはいいかも。