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件) を見る