KVM / libvirt 磁盘整合

KVM / libvirt 磁盘整合

使用 ubuntu 20.04 作为 kvm 主机,使用 cloud-init 初始化客户机。这为我提供了一个可运行的客户机,并因此获得了一个映像链。为了简化备份过程并重新使用现有脚本,我想将映像链合并为一个文件。

https://libvirt.org/kbase/merging_disk_image_chains.html#consolidating-an-entire-disk-image-chain-into-a-single-image

初始配置

virsh domblklist test
 Target   Source
-----------------------------
 vda      test-rootfs.qcow2
 hdd      -

整合图像

virsh blockcommit test vda --verbose --pivot --active
Block commit: [100 %]
Successfully pivoted

结果

virsh domblklist test
 Target   Source
------------------------------------------
 vda      /data/libvirt/disk-images/test
 hdd      -

这是预期结果。每当我关闭虚拟机并重新启动时,映像配置都会更改为:

virsh domblklist test
 Target   Source
-----------------------------
 vda      test-rootfs.qcow2
 hdd      -

并且不再使用合并的图像,而是再次使用原始图像链...->我的问题:为什么?

BR,谢谢你的提示

//编辑:

我已在客户机中禁用 cloud-init,然后禁用 shudtown/start 程序。

这是差异,比较块提交之后和关闭/启动域之后(使用 virsh dumpxml)。

$ diff 0_blockcommit 1_shutdown_start 
1c1
< <domain type='kvm' id='8'>
---
> <domain type='kvm' id='9'>
32c32
<     <disk type='file' device='disk'>
---
>     <disk type='volume' device='disk'>
34,35c34,39
<       <source file='/data/libvirt/pools/disk-images/test.qcow2' index='3'/>
<       <backingStore/>
---
>       <source pool='disk-images' volume='test-rootfs.qcow2' index='2'/>
>       <backingStore type='file' index='3'>
>         <format type='qcow2'/>
>         <source file='/data/libvirt/pools/disk-images/test.qcow2'/>
>         <backingStore/>
>       </backingStore>
42c46,47
<       <source index='4'/>
---
>       <source file='/data/libvirt/pools/disk-images/test.iso' index='1'/>
>       <backingStore/>
89c94
<       <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-8-test/org.qemu.guest_agent.0'/>
---
>       <source mode='bind' path='/var/lib/libvirt/qemu/channel/target/domain-9-test/org.qemu.guest_agent.0'/>

答案1

解决方法:

DOMAIN_NAME="test"
## save xml and remove domain
#
virsh dumpxml ${DOMAIN_NAME} > ${DOMAIN_NAME}.xml
virsh undefine ${DOMAIN_NAME}
virsh shutdown ${DOMAIN_NAME}
 
## redefine domain and start again
#
virsh define ${DOMAIN_NAME}.xml
virsh start ${DOMAIN_NAME}

在 libvirt 项目上创建了一张票:https://gitlab.com/libvirt/libvirt/-/issues/240

相关内容