Vagrantのboxを作ってみよう…と思ったが例題が難しかったかもしれない

(主に)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のカーネルなので
  • 自分でダウンロードする
  • 展開してパッチを当ててconfigファイルを.configにコピー
  • いろいろパッケージが必要になった。busyboxのtar/xzだとうまく展開できないのでtczでtar, xzを入れたり、他にもmakeやbash、gcc、glibc_base-devなどは必要になる。あとパッケージを作るときにsquashfs-toolsなんかも必要になる。
  • make listnewconfig
  • make prepare
  • make modules_prepare
  • Guest Additionのソースを展開して、makeなんちゃら、make install
  • tczを作る。/tmp/virtualbox-additionの下に一式ファイルを作ってmksquashfs
  • このVMはでかいので、作ったtczだけ拾っておいて、新たに小さなVMを作る
  • tce-load -wi tc-install
  • sudo tc-install.shでインストール
    • CDからインストール、Frugal、whole disk、sda、y、ext4、home=sda1 restore=sda1、y
  • リブートしてHDDから上げる
    • /opt/.filetool.lstからhomeを削除、/etc/dropbearと/etc/passwdと/etc/shadowを追加
    • vagrantユーザを作る。直接/etc/passwdと/etc/shadowをいじり、sudo passwd vagrantでパスワードを設定
  • dropbearを入れて設定する
    • 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
  • VirtualBoxからovfをexportする。名前は「box」
    • 他のboxからVagrantfileやmetadata.jsonを拝借
    • tar cvfz ../tc51.box metadata.json Vagrantfile box.ovf box-disk1.vmdk
    • これでboxができました。どうにか10MB以下に収まった。
  • cd ..; vagrant box add tc51 tc51.box
  • mkdir tcvag
  • cd tcvag
  • vagrant init tc51
  • vagrant up
    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.
  • このエラーのためか、共有フォルダが自動でマウントされません。
  • Vagrantfileに「config.vm.guest = :linux」を記述してみたところ、エラーが変わりました。
    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

  • そう来るか。vagrant sshで入って、tce-load -wi bashでbashを入れる。
  • vagrant ssh
    • mount.vboxsf /vagrant /vagrant
    • 単にこれを実行するだけなのだが…
  • vagrant haltによるshutdownも失敗する。shutdown -h nowで落とすんですね。TinyCoreにはshutdownコマンドがありません。poweroffやhaltならある
  • たぶん、↑の問題は、Vagrantfile側でどうにか吸収できるような気がする。shutdownコマンドじゃなくてpoweroffを使うとか、共有フォルダのマウントに関してもね。本体側で対応しているOS以外で動かすことも考えられているはずだから。ただ私はRuby苦手なんですよね…

    Guest Additionをあきらめるというのもひとつの選択かな。dockerを遊べるCoreOSとかはそうやっていて、そのため共有フォルダを使えない。

    コメントを残す

    メールアドレスが公開されることはありません。