vagrant-libvirtでbase boxの作成めも

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-managervagrant upした環境が見えてます。

f:id:masami256:20151110234035p:plain

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

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問

プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問