Vagrantを使ってて所要により自前でbase boxを作ろとういうことはあったりするわけで、今回はvagrant-libvirtでboxを作る方法のめも。
まずは、普通にLinuxがインストールされた環境を作るところから。ここは普通にvirt-managerで作成。ストレージのファイルフォーマットはqcow2です。 最低限準備しないと行けないのはVirtual Boxなんかの場合と一緒で、vagrantユーザーを作ったり、パスワード無しのsudoができるようにしたりと言ったところは行います。この辺はオフィシャルのドキュメントを読めばバッチリですね。
次が本番で、qcow2のイメージファイルからboxファイルの作成。これには元になる.qcow2ファイルの他に、Vagrantfileとメタデータを記述するjsonファイルの2ファイルが必要なります。参考ドキュメントはgithubにあるvagrant-libvirtプロジェクトに含まれるサンプルです。
metadata.jsonとVagrantfileはFedoraのクラウドイメージを展開して、そこにあるやつを使いました。
jsonファイルはこんな感じです。変えたのはvirtual_sizeでストレージサイズを100GBに設定してます。この100GBはvirt-managerで設定したストレージサイズです。
{"provider": "libvirt", "format": "qcow2", "virtual_size": 100}
VagrantfileはFedoraのクラウドイメージのやつをそのまま使っています。
Vagrant.configure('2') do |config|
config.vm.synced_folder ".", "/vagrant", type: "rsync"
config.vm.provider :libvirt do |libvirt|
libvirt.driver = 'kvm'
libvirt.connect_via_ssh = false
libvirt.username = 'root'
libvirt.storage_pool_name = 'default'
end
end
そして、qcow2のイメージを/var/lib/libvirt/imagesからコピーして名前をbox.imgに変更します。そしてtarコマンドでboxを作ります。うちのcpuはCore i7の5820kで、ストレージにはssdを使ってます。この環境で大体10分ほどかかりました。
masami@saga:~/codes/fedora-base-box$ time tar czvf fedora23-base-box.box ./metadata.json ./Vagrantfile box.img ./metadata.json ./Vagrantfile box.img real 11m3.724s user 10m50.540s sys 1m39.960s masami@saga:~/codes/fedora-base-box$ ls ./ ../ box.img fedora23-base-box.box metadata.json Vagrantfile
これでカレントディレクトリにboxファイルができてます。
さて、もとになるディスクイメージのファイル名をbox.imgとしてますが、これが結構重要みたいでハマりました。boxを作るときはもとのqcow2のファイル名はなんであろうとboxのcreate -> addはできるんですが、vagrant upをした時に以下のようなエラーで失敗しました。fedoraのクラウドイメージなんかはqcow2のファイルがbox.imgという名前になっていたのでもしか?と思ってbox.imgにしたらvagrant sshまで出来るようになった次第です。。。
masami@saga:~/codes/fedora23-test-box$ vagrant up
Bringing machine 'default' up with 'libvirt' provider...
==> default: Uploading base box image as volume into libvirt storage...
/usr/share/vagrant/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/handle_box_image.rb:50:in `block in call': uninitialized constant VagrantPlugins::ProviderLibvirt::Errors::BoxNotFound (NameError)
from /usr/share/vagrant/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/handle_box_image.rb:40:in `synchronize'
from /usr/share/vagrant/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/handle_box_image.rb:40:in `call'
from /usr/share/vagrant/lib/vagrant/action/warden.rb:34:in `call'
from /usr/share/vagrant/lib/vagrant/action/builtin/handle_box.rb:56:in `call'
from /usr/share/vagrant/lib/vagrant/action/warden.rb:34:in `call'
from /usr/share/vagrant/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/handle_storage_pool.rb:24:in `block in call'
from /usr/share/vagrant/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/handle_storage_pool.rb:17:in `synchronize'
from /usr/share/vagrant/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/handle_storage_pool.rb:17:in `call'
from /usr/share/vagrant/lib/vagrant/action/warden.rb:34:in `call'
from /usr/share/vagrant/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/set_name_of_domain.rb:34:in `call'
from /usr/share/vagrant/lib/vagrant/action/warden.rb:34:in `call'
from /usr/share/vagrant/lib/vagrant/action/warden.rb:95:in `block in finalize_action'
from /usr/share/vagrant/lib/vagrant/action/warden.rb:34:in `call'
from /usr/share/vagrant/lib/vagrant/action/warden.rb:34:in `call'
from /usr/share/vagrant/lib/vagrant/action/builder.rb:116:in `call'
from /usr/share/vagrant/lib/vagrant/action/runner.rb:66:in `block in run'
from /usr/share/vagrant/lib/vagrant/util/busy.rb:19:in `busy'
from /usr/share/vagrant/lib/vagrant/action/runner.rb:66:in `run'
from /usr/share/vagrant/lib/vagrant/action/builtin/call.rb:53:in `call'
from /usr/share/vagrant/lib/vagrant/action/warden.rb:34:in `call'
from /usr/share/vagrant/gems/gems/vagrant-libvirt-0.0.30/lib/vagrant-libvirt/action/connect_libvirt.rb:18:in `call'
from /usr/share/vagrant/lib/vagrant/action/warden.rb:34:in `call'
from /usr/share/vagrant/lib/vagrant/action/builtin/config_validate.rb:25:in `call'
from /usr/share/vagrant/lib/vagrant/action/warden.rb:34:in `call'
from /usr/share/vagrant/lib/vagrant/action/builder.rb:116:in `call'
from /usr/share/vagrant/lib/vagrant/action/runner.rb:66:in `block in run'
from /usr/share/vagrant/lib/vagrant/util/busy.rb:19:in `busy'
from /usr/share/vagrant/lib/vagrant/action/runner.rb:66:in `run'
from /usr/share/vagrant/lib/vagrant/machine.rb:214:in `action_raw'
from /usr/share/vagrant/lib/vagrant/machine.rb:191:in `block in action'
from /usr/share/vagrant/lib/vagrant/environment.rb:516:in `lock'
from /usr/share/vagrant/lib/vagrant/machine.rb:178:in `call'
from /usr/share/vagrant/lib/vagrant/machine.rb:178:in `action'
from /usr/share/vagrant/lib/vagrant/batch_action.rb:82:in `block (2 levels) in run'
boxができたらvagrant initをしてconfig.vm.boxの名前を適当につけて、前回のFedora 23でFedora Cloudイメージをvagrant-libvirtで動かすメモ - φ(・・*)ゞ ウーン カーネルとか弄ったりのメモと同様にbox addして完了です。
masami@saga:~/codes/fedora23-test-box$ vagrant box add ../fedora-base-box/fedora23-base-box.box --name fedora23-test-box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'fedora23-test-box' (v0) for provider:
box: Unpacking necessary files from: file:///home/masami/codes/fedora-base-box/fedora23-base-box.box
==> box: Successfully added box 'fedora23-test-box' (v0) for 'libvirt'!
ちょっと確認を。
masami@saga:~/codes/fedora23-test-box$ ls ~/.vagrant.d/boxes/fedora23-test-box/0/libvirt/ ./ ../ box.img metadata.json Vagrantfile
そしてvagrant up。/usr/sbin/biosdevnameが無いっていって途中で失敗してますが、これはbiosdevname packageがインストールされてないからっぽいです。 一応vagrant sshでログインはできました。
masami@saga:~/codes/fedora23-test-box$ vagrant up
Bringing machine 'default' up with 'libvirt' provider...
==> default: Creating image (snapshot of base box volume).
==> default: Creating domain with the following settings...
==> default: -- Name: fedora23-test-box_default
==> default: -- Domain type: kvm
==> default: -- Cpus: 1
==> default: -- Memory: 512M
==> default: -- Base box: fedora23-test-box
==> default: -- Storage pool: default
==> default: -- Image: /var/lib/libvirt/images/fedora23-test-box_default.img
==> default: -- Volume Cache: default
==> default: -- Kernel:
==> default: -- Initrd:
==> default: -- Graphics Type: vnc
==> default: -- Graphics Port: 5900
==> default: -- Graphics IP: 127.0.0.1
==> default: -- Graphics Password: Not defined
==> default: -- Video Type: cirrus
==> default: -- Video VRAM: 9216
==> default: -- Keymap: en-us
==> default: -- Command line :
==> default: Creating shared folders metadata...
==> default: Starting domain.
==> default: Waiting for domain to get an IP address...
==> default: Waiting for SSH to become available...
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
/usr/sbin/biosdevname &>/dev/null; echo $?
Stdout from the command:
Stderr from the command:
sudo: no tty present and no askpass program specified
masami@saga:~/codes/fedora23-test-box$ vagrant ssh
Last login: Tue Nov 10 00:13:25 2015 from 192.168.124.1
[vagrant@fedora23-base ~]$ uname -a
Linux fedora23-base 4.2.5-300.fc23.x86_64 #1 SMP Tue Oct 27 04:29:56 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
virt-managerでvagrant upした環境が見えてます。

必要なパッケージの調整はあるとして、virt-managerで作ったイメージをboxファイルにして、vagrant-libvirtで動かすというところは達成できました( ´ー`)フゥー...

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問
- 作者: 増井敏克
- 出版社/メーカー: 翔泳社
- 発売日: 2015/10/14
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る