(主に)VirtualBoxのVMを簡単に操作できるVagrant。けっこう便利そうだし、プラグインを書けたり、boxを自前で作れたりする。VirtualBox用のboxのフォーマットはけっこう簡単なようなので、自作できる気がする。
ほかに似た目的を持つものとしてdockerに注目していたりするのだが、dockerはLinux(特にUbuntu)でLXCが必須なので、順番的にはVagrantで遊ぶのが先かなと。実際はdockerもVagrantで作ったVMの上で動かしたりするケースが多い状態、らしい。まだ、LXCをまともに使える環境は限られてますからね。
ともかく、試しに何かやってみよう。
- ユーザvagrantの~/.ssh/authorized_keysにinsecure public keyを入れておくとsshで入れる
- VirtualBoxのGuest Additionsを入れると/vagrant以下がホスト側と共有できてうれしい
- PuppetやChefが入っているとポイントが高いらしい
で、vmdkファイルといくつかのメタデータのファイルを置いたtar.gzファイルを作ればboxになってくれるようだ。ubuntuやFedora、CentOSのboxはけっこうある。
ここはひとつ、TinyCoreLinuxのboxを作ってみよう。TinyCoreにはChefとかPuppetのパッケージはないから、まあそのへんはやめて、ユーザを指定通りに登録して、Guest Additionsを入れたイメージを作ってみる。TinyCoreはサイズが小さいので遊ぶのに時間がかからないところがうれしい…はず。これはこれでいろいろ不自由はあるのだが。
TinyCoreLinuxにGuest Additionsを入れるまで。
- 既存のパッケージはない
- kernel-develに当たるファイルを作ってモジュールをコンパイルしてtczを作る
- tczがあるlinux-3.8.10-sources-env(ソースをダウンロードしてパッチを当ててくれる)やlinux-3.8.3_api_headers(/usr/include以下)はいまいち使えない。現在のCore-5.1のカーネルは3.8.13で、tczが対応しているのはちょっと古くCore-5.0のカーネルなので
- 自分でダウンロードする
- linux-3.8.13.tar.xz
- http://www.tinycorelinux.net/5.x/x86/release/src/kernel/38-patches/ 以下のファイル、その上のconfig-3.8.10-tinycore{,64}
- CDからインストール、Frugal、whole disk、sda、y、ext4、home=sda1 restore=sda1、y
- /opt/.filetool.lstからhomeを削除、/etc/dropbearと/etc/passwdと/etc/shadowを追加
- vagrantユーザを作る。直接/etc/passwdと/etc/shadowをいじり、sudo passwd vagrantでパスワードを設定
- tce-load -wi dropbear
- dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
- dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
- echo dropbear -w >> /opt/bootlocal.sh
- vi ~vagrant/.ssh/authorized_keys (insecure keyを入れる)
- 作ったtczをインストール
- echo modprobe vboxsf >> /opt/bootlocal.sh
- echo modprobe vboxguest >> /opt/bootlocal.sh
- echo mkdir /vagrant >> /opt/bootlocal.sh
- backup
- sudo poweroff
- 他のboxからVagrantfileやmetadata.jsonを拝借
- tar cvfz ../tc51.box metadata.json Vagrantfile box.ovf box-disk1.vmdk
- これでboxができました。どうにか10MB以下に収まった。
Bringing machine ‘default’ up with ‘virtualbox’ provider…
[default] Importing base box ‘tc51’…
[default] Matching MAC address for NAT networking…
[default] Setting the name of the VM…
[default] Clearing any previously set forwarded ports…
[default] Creating shared folders metadata…
[default] Clearing any previously set network interfaces…
[default] Preparing network interfaces based on configuration…
[default] Forwarding ports…
[default] — 22 => 2222 (adapter 1)
[default] Booting VM…
[default] Waiting for machine to boot. This may take a few minutes…
[default] Machine booted and ready!
[default] Mounting shared folders…
[default] — /vagrant
The guest operating system of the machine could not be detected!
Vagrant requires this knowledge to perform specific tasks such
as mounting shared folders and configuring networks. Please add
the ability to detect this guest operating system to Vagrant
by creating a plugin or reporting a bug.
Bringing machine ‘default’ up with ‘virtualbox’ provider…
[default] Clearing any previously set forwarded ports…
[default] Creating shared folders metadata…
[default] Clearing any previously set network interfaces…
[default] Preparing network interfaces based on configuration…
[default] Forwarding ports…
[default] — 22 => 2222 (adapter 1)
[default] Booting VM…
[default] Waiting for machine to boot. This may take a few minutes…
[default] Machine booted and ready!
[default] Mounting shared folders…
[default] — /vagrant
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
echo; printf /vagrant
Stdout from the command:
Stderr from the command:
sh: bash: not found
- mount.vboxsf /vagrant /vagrant
- 単にこれを実行するだけなのだが…
たぶん、↑の問題は、Vagrantfile側でどうにか吸収できるような気がする。shutdownコマンドじゃなくてpoweroffを使うとか、共有フォルダのマウントに関してもね。本体側で対応しているOS以外で動かすことも考えられているはずだから。ただ私はRuby苦手なんですよね…
Guest Additionをあきらめるというのもひとつの選択かな。dockerを遊べるCoreOSとかはそうやっていて、そのため共有フォルダを使えない。