libvirtで管理さてるゲストマシンを高速シンプロビジョニングしてくれるツールを作った
virt-clone コマンドって便利ですよね。
これ確かにスゲー便利なんですが、30回も40回も同じこと繰り返してると、スゲー疲れるわけです。
具体的に何に疲れるかって言うと、
- 待ち時間
- ネットワークの再設定
待ち時間に関しては、シェルスクリプトにしておくなりスパースでやるオプションを付けておけば"ある程度”我慢できるけど、ネットワークの再設定に関してはスゲータルい。
なんせ1回はゲストに入らなきゃいけない。
コレを回避するには、ゲストをクローンしたときのMACアドを、DHCPサーバに書いて決め打ちにすること。
そうすればある程度は管理できる。
…のはずだったけど、RHEL6系からは新しく追加されたネットワークデバイスは自動的に ONBOOT="no" な仕様にかわったので、そもそも立ち上がらないし、RHEL5系だと、すでにeth0があった場合、インクリメントされてeth1としてアタッチされたりで、コレはコレで美味しくない。
という訳で、これらの問題を一括で片付けるソリューションを思いついたので、やっつけで書いた。
https://github.com/kazuhisya/virt-thinpro
GitHub - kazuhisya/virt-thinclone: Virtualmachine ThinProvisioning Clone Tool
具体的には下記の流れになる
- qemu-imgでオリジナルのゲストの仮想ディスクから新しいゲストの仮想ディスクを作成する
- ベースイメージから作成する場合、"皮”の部分だけ作られるので、一瞬で終わる(多分RHEVのpool機能はコレを使ってるんじゃないかな)
- virt-cloneに--preserve-dataオプションを付けてクローンする
- --preserve-dataオプションは--fileオプションと一緒に使うんだけど 1. で作った仮想ディスクをアタッチする。これも一瞬
- 新しくできたクローンからMACアドをひっぱて来て、仮想ディスク内の各コンフィグに直接書きこんでしまう
- 最後の仕上げに新しい方の仮想ディスクのスナップショットを取る
出来上がった新しいゲストを実行してやれば、いきなりネットワークが設定された状態で立ち上がる。
[root@rhel6 virt-thinpro]# time ./virt-thinpro.rb -o el6-tmpl -n el6-01 -i 192.168.XXX.XXX Formatting '/data/el6-01.img', fmt=qcow2 size=10485760000 backing_file='/data/el6-tmpl.img' encryption=off cluster_size=0 Clone 'el6-01' created successfully. Success: el6-01 real 0m10.841s user 0m2.830s sys 0m0.930s [root@rhel6 virt-thinpro]#
10秒ちょいですね!
多分ストレージがSSDとかだともちっと速いんでしょうが、一番時間掛かるのはゲストの仮想ディスクをマウントする所なので、劇的には改善されないと思います。(要確認?)
条件
- ライセンス
- GPLv2+
- ホストOS
- ゲストOS
- RHEL6(ないしそれと互換性のある物、例えばScientific Linux6とか、Fedora14もイケル?)
- 書き換えてるのは下記
- /etc/sysconfig/network-scripts/ifcfg-eth0
- /etc/udev/rules.d/70-persistent-net.rules
- どうしてもRHEL5系でやりたいなら下記を編集するロジックを入れればいいと思います
- /etc/sysconfig/hwconf
制限
使用方法
[root@rhel6 virt-thinpro]# ./virt-thinpro.rb --help Usage: virt-thinpro [options] -o, --originalOriginal Domain Name -n, --new New Domain Name -i, --ip New Domain IP
- -o: libvirtに登録されている元となるゲストの名前
- -n: 新しくクローンして作成されるゲストの名前
- -i: 新しくクローンして作成されるゲストのIP
コード的にあんまし美しくないから、ちょくちょく綺麗にしていきたいなぁ。
特にsystem()で直に叩いちゃってるところは、かなりイヤーンな感じ。
qemu-img createを叩いてる所はlibvirtのAPIで何とかできそうな気がしますね。
virt-clone叩いてる所はvirt-clone(python)からrubyに置き換えができそう。
あとlibguestfsの所を改善出来れば、リモートでも叩けそうですね。