vagrant 関連のメモ

仮想マシン(Virtual Machine, VM)の作成・操作などを自動化するツール.下記のようなコマンドで VM を生成・操作できるようになる.
操作 コマンド 備考
起動 vagrant up はじめての起動で まだ仮想環境に VM が登録されていない場合は登録も同時に行われる.
停止 vagrant halt
VM 状態確認 vagrant status
ssh で VM 操作 vagrant ssh
VM 破棄 vagrant destroy

何がいいの?

準備

※以降は ubuntu 14.04 を前提にしています.

仮想化ソフトウェア VirtualBox と vagrant をインストールする.

Box ファイルの作り方

流れは以下のとおり.

  1. Box ファイルの元になる VM を作成する.ここは手動.
  2. vagrant 用の適当なディレクトリをつくってカレント ディレクトリを移動しておく(Boxファイルや設定ファイル Vagrantfile はデフォルトでカレント ディレクトリから読まれるため).
  3. vagrant package --base コマンドで *.box ファイルを生成する.

Box ファイルの元になる VM の作成

Ubuntu 14.04 Desktop AMD64 を使って Box ファイルを作成する.[注 ネットで多種多様な Box ファイルが配布されていますので,必ずしも自力で作成する必要はありません.が,自分でつくってみたいのが人情だと思いますますので… ちなみに,ネット上で配布されている Box ファイルを利用する場合,ダウンロードする必要すらなく,vagrant コマンドに Box ファイルがおいてる URL を指定して実行できますので,ほんとに手間なしです.]

図1a Port Forwarding 設定1 図1b Port Forwarding 設定2

ここまでの手順が正しければ,ホスト OS 側から下記の ssh コマンドで VM 側のユーザー vagrant にパスワードなしで(※ここ重要)ログインができるようになっているはず.

$ ssh vagrant@127.0.0.1 -p 2222

上記の設定の他に,ディストリビューションによっては,デフォルトでファイアウォールが設定されていて ssh が とおらなかったり,SELinux が有効になっているのがジャマをしていたりもする.Ubuntu Desktop はデスクトップ用のディストリビューションなので,利便性を優先した設計になっていて,簡単に Box ファイルをつくることができる.

パッケージング(Box ファイルの作成)

ホストOS側にもどり,下記のコマンドで Box ファイルを作成する(“ubuntu_1404”は ここまでの手順で VirtualBox 内に作成した VM の名称).[注意 このコマンドは かなり時間がかかります.この原稿執筆時点で,VAIO Pro 13(Intel Core i7-4500U 1.8GHz)で約6分かかっています.元 VM(ubuntu_1404.vdi)のサイズは 5.0 GB,作成される Box ファイルは 1.7 GB です.]

$ mkdir ~/vagrant
$ cd ~/vagrant
$ vagrant package --base ubuntu_1404

カレントディレクトリに package.box というファイルができているはず.以上で Box ファイルの作成は完了. 以下は作成した Box ファイルから vagrant up するまでの手順…

設定ファイル Vagrantfile の作成

Box ファイルができたら(or どこかから Box ファイルを入手したら)vagrant の設定ファイル Vagrantfile を作成する.

vagrant は この Vagrantfile という1個のファイルに すべての設定を記述するようになっているので,このファイルだけをメンテナンスすればよい.また,コピーして別の環境にもっていったり削除して作りなおしたりも特別なコマンドは必要なく,通常の OS のコマンド(cp や rm など)を使えばよい.実にお気楽な透明さ.

$ vagrant init ubuntu

これでカレント ディレクトリに Vagrantfile ができる.

初期段階では ほぼすべての記述がコメントアウトされている状態になっているので,必要に応じてコメントを外して編集すればよい.とりあえず,下記の部分だけ修正しておけばよい.[ubuntu 14.04 では ssh-keygen で作成される秘密鍵ファイルの名前がデフォルト id_rsa になるので config.ssh.private_key_path の編集は必須.また,config.vm.provider は VM を起動したときに GUI 画面をだすかどうかをコントロールする部分で必須というわけではないが,テスト用にわかりやすいためコメントを外して有効にしている.サンプル Vagrantfile

config.ssh.private_key_path = "~/.ssh/id_rsa"
config.vm.provider :virtualbox do |vb|
    # Don't boot with headless mode
    vb.gui = true
    # Use VBoxManage to customize the VM. For example to change memory:
    vb.customize ["modifyvm", :id, "--memory", "1024"]
end

vagrant からの VM の起動

ここまでの手順を正しく実施できていれば,下記のコマンドを実行するだけで,vagrant が Box ファイル(package.box)をタネに新しい VM を VirtualBox に登録して起動するところまで自動でやってくれる.

$ vagrant up

サンドボックス機能(sahara plug-in)

sahara プラグインをインストールすると vagrant コマンドから VM スナップショットをとって roll back などを行えるようになる.

$ vagrant plugin install sahara
$ vagrant plugin list
sahara (0.0.17)
コマンド 説明
vagrant sandbox on サンドボックス モードの開始.このコマンドを実行した時点で VM のスナップショットが作成される.
vagrant sandbox status サンドボックス モードに入っているかどうか状態確認.
vagrant sandbox rollbak サンドボックス モードを開始した時点のスナップショットにロールバックする.
vagrant sandbox commit ここまでの VM に対する変更をコミット(この時点で新しいスナップショットが作成される).
vagrant sandbox off サンドボックス モードを終了する.

Appendix

備考: Faild to mount folders in Linux guest ...

ubuntu など,Debian 系の Linux ディストリビューションをゲストOSにすると,VirtualBox のバグ[7][8]を踏んでしまう.このバグは,正確には VirtualBox Guest Additions 4.3.10 のもので,4.3.12 (VBoxGuestAdditions_4.3.12.iso)[9]など,少し新しいものを利用すれば解消する.
図 Issue #3341 を踏んだときの現象(クリックで拡大)

ダウンロードしてきた新しい VBoxGuestAdditions_*.iso を $HOME/.VirtualBox/ にコピーして,Oracle VM VirtualBox Manager の Settings → Storage でマウントしてあげれば,ゲストOS側で autorun が走って新しい Guest Additions が自動でインストールされる(ビルドに必要なツール kernel-headers, build-essentials は古い版の Guest Additions をビルドした際に既にはいっているので改めてインストールする必要はないはず).

Links

[1] 新原: Vagrant入門ガイド,技術評論社,2013.
わずか52ページと,すごくお手軽なガイドになっている.概要を知りたいだけならコレでOK.ただ,VM の“種”にあたる Box ファイルの作成方法について触れていないため,これだけでは自作の独自 Box ファイルを作成できない.
[2] Mitchell Hashimoto: Vagrant: Up and Running, O'Reilly, 2013. [日本語版]
本家.Vagrant の開発者の本.
[3] Vagrant Docs: Creating a Base Box
Box ファイルの作り方の公式ドキュメント.
[4] Vagrant の VirtualBox 用 Base Box ファイルを手動で作ってみる
[5] stackoverflow: Vagrant up takes a long time after "Waiting for machine to boot. This may take a few minutes..." to finish booting (2014-01-08)
ssh をパスワード不要の公開鍵認証にしてるつもりなのに vagrant ssh をするとユーザー vagrant のパスワードを聞かれてしまう現象の解決方法が載ってる(下記の設定を追加).バージョンのちがいで ssh 秘密鍵を保存してるファイルのファイル名がちがっているのが原因みたい.
config.ssh.private_key_path = "~/.ssh/id_rsa"
[6] turbolinux: ssh にてパスワードを使用しないでログインする方法 (2002-02-08)
[7] GitHub: Vagrant can't mount shared folder in VirtualBox 4.3.10 #3341
[8] VirtualBox: #12879 Can't mount shared folders with guest additions 4.3.10
[9] Index of /virtualbox/4.3.12/

はたいたかし
http://exlight.net/
2014-09-13
Home > Linux > vagrant