敵のいない勉強部屋

勉強記録用。土日を中心に更新。

KVMでsnapshotをとるには

参考サイト

Enable Snapshot with KVM on CloudStack - cloud-mate.org

 

global設定の変更

KVMでのsnapshotの取得はデフォルトで無効化されているので、有効化する。

mysql> update configuration set value="true" where name="KVM.snapshot.enabled";

# /etc/init.d/cloudstack-management restart

 

management-server.logの確認

しかし、guestVMのsnapshotが取得できない! まずはmanagement-server.logを確認

2017-07-25 00:09:53,931 DEBUG [c.c.s.s.SnapshotManagerImpl] (Work-Job-Executor-7:ctx-546a75ae job-178/job-179 ctx-7dd89d67) (logid:d7942c39) Failed to create snapshot 

 ざっくりとしたエラーメッセージ…

ちなみにjavaのexceptionも出ていた

com.cloud.utils.exception.CloudRuntimeException: Failed to backup 66a441af-bae9-457a-8330-6573b3c1d574 for disk /mnt/5fd97e14-cdc8-3ed0-8847-dbebfa8f8cae/76809d58-171a-40a7-9745-5fa1bc018100 to /mnt/94a2b615-187d-37bf-96e9-9b61278662f0/snapshots/5/30 

 ちょっとこれだけではわからないので、KVMホスト側のログも確認。

 

agent.log (KVM)の確認

management-server.logで上記のエラーが出る直前、KVMから下記のようなメッセージを受け取っている。

2017-07-25 00:09:53,353 DEBUG [c.c.a.m.AgentAttache] (AgentManager-Handler-2:null) (logid:) Seq 7-446419313063100482: No more commands found

この Seq 7-446419313063100482 という番号がとても重要で、シーケンス番号などと呼ばれる。

前半の "7" はhost_idを指し、これでどのホストとやり取りしているかがわかる。

# mysql -u root cloud -e "select name from host where id=7;"

+------------+
| name       |
+------------+
| host_kvm04 |
+------------+

というわけで、host_kvm04にログイン。

/var/log/cloudstack/agent/agent.logを確認。

2017-07-25 00:10:17,001 DEBUG [kvm.storage.KVMStorageProcessor] (agentRequest-Handler-3:null) (logid:d7942c39) Executing: /usr/share/cloudstack-common/scripts/storage/qcow2/managesnapshot.sh -b /mnt/5fd97e14-cdc8-3ed0-8847-dbebfa8f8cae/76809d58-171a-40a7-9745-5fa1bc018100 -n 66a441af-bae9-457a-8330-6573b3c1d574 -p /mnt/94a2b615-187d-37bf-96e9-9b61278662f0/snapshots/5/30 -t 66a441af-bae9-457a-8330-6573b3c1d574
2017-07-25 00:10:17,225 DEBUG [kvm.storage.KVMStorageProcessor] (agentRequest-Handler-3:null) (logid:d7942c39) Exit value is 2

 原因はここのようだ・・・scriptの実行に失敗している。

 

qemu-imgの罠

managesnapshot.shの中身を見てみる。

# vi /usr/share/cloudstack-common/scripts/storage/qcow2/managesnapshot.sh

$qemu_img convert -f qcow2 -O qcow2 -s $snapshotname $disk $destPath/$destName >& /dev/null
if [ $? -gt 0 ]
then
  printf "Failed to backup $snapshotname for disk $disk to $destPath " >&2
  return 2
fi

 ここの処理で失敗している。

$qemu_imgが何を指しているか確認したところ…

qemu_img="cloud-qemu-img" 

 cloud-qemu-img…?

そんなコマンドないが…

# which cloud-qemu-img

/usr/bin/which: no cloud-qemu-img in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

調べたところ、CentOS6.5以降では標準インストールされるqemu-imgが-sオプションをサポートしていないらしく、代わりにcloud-qemu-imgたるものが必要らしい。

 

cloud-qemu-imgのインストー

参考サイトに従って下記手順を実施。

yum install wget

# mkdir cloud-qemu-img

# cd cloud-qemu-img/

wget http://vault.centos.org/6.4/updates/x86_64/Packages/qemu-img-0.12.1.2-2.355.el6_4_4.1.x86_64.rpm

# rpm2cpio qemu-img-0.12.1.2-2.355.el6_4_4.1.x86_64.rpm |cpio -idmv

# cp ./usr/bin/qemu-img /usr/bin/cloud-qemu-img

# which cloud-qemu-img

/usr/bin/cloud-qemu-img

 
snapshot取得成功

記念のスクリーンショット

f:id:im_not_enemy:20170725010858j:plain

 解決できて満足です。