[libvirt-users] Recover snapshots from qcow images

Petr Stodulka pstodulk at redhat.com
Fri Sep 6 11:40:10 UTC 2019


On 14. 08. 19 13:27, Peter Krempa wrote:
> On Tue, Aug 13, 2019 at 15:15:11 +0200, Petr Stodulka wrote:
>> Hi guys,
>> I had to move to the new laptop week ago and I screw migration of my virtual
>> machines. I recovered my virtual machines on the new laptop (virsh define)
>> using the backed up xml files, but I am missing any file with metadata about
>> snapshots. The original storage is cleaned so I cannot take these files
>> anymore.
>>
>> Using qemu-info I can see my snapshots inside the qcow images, but libvirt
>> doesn't know about them:
>> ###########################################
>> # virsh snapshot-list rhlvm
>>  Name   Creation Time   State
>> -------------------------------
>>
>> # qemu-img info rhlvm.qcow2
>> image: rhlvm.qcow2
>> file format: qcow2
>> virtual size: 25G (26843545600 bytes)
>> disk size: 2.9G
>> cluster_size: 65536
>> Snapshot list:
>> ID        TAG                 VM SIZE                DATE       VM CLOCK
>> 1         prepared                  0 2018-09-05 11:06:06   00:00:00.000
>> Format specific information:
>>     compat: 1.1
>>     lazy refcounts: true
>>     refcount bits: 16
>>     corrupt: false
>>
>>
>> ###########################################
>>
>> Is there any nice way to regenerate snapshot metadata for libvirt from
>> the data inside qcow images? I have bunch of VMs so if there is nice way
>> how to recover those data, you will make me really happy :)
> 
> Hi,
> 
> libvirt unfortunately does not support metadata-less snapshots so you
> must recreate the metadata to be able to use them. If you didn't modify
> your configuration of the VM between the time you took the snapshot and
> the current point it should be fairly straightforward to recover them,
> but it will require some manual steps.
> 
> The snapshot creation api has a _REDEFINE flag which allows to create
> the snapshot metadata without actually doing any disk changes. (virsh
> snapshot-create --redefine).
> 
> For this to happen you must prepare a definition of the snapshot. I'll
> provide an example with anotations what to update:
> 
> <domainsnapshot>
>   <name>1565701354</name>   <--- this must be equal to the 'TAG' field in the qemu-img output
>   <state>running</state>    <--- state of the VM at snapshot, you'll probably need to use shutoff as the VM was not running
>   <creationTime>1565701354</creationTime>  <--- convert the "DATE" field to a unix timestamp
>   <memory snapshot='internal'/>  <----- your snapshot is internal so this is ok
>   <disks>
>     <disk name='hda' snapshot='no'/>      <--- entries here depend on your configuration, you need one line per disk, readonly disks must have 'no' as snapshot, others are internal
>     <disk name='vda' snapshot='internal'/>
>     <disk name='vdb' snapshot='internal'/>
>     <disk name='vdc' snapshot='internal'/>
>   </disks>
>   <domain type='kvm'>   <--- this is the domain definition XML obtained by running a virsh dumpxml --migratable --inactive --security-info
>     <name>upstream</name>
>     <uuid>841752b8-9452-4078-a62b-8fd9a9af011c</uuid>
> 
>    [...] (trimmed irrelevant stuff but make sure to use full XML)
> 
>     <devices>
>       <emulator>/home/pipo/git/qemu.git/x86_64-softmmu/qemu-system-x86_64</emulator>
>       <disk type='file' device='cdrom'>
>         <driver name='qemu' type='raw'/>
>         <source file='/var/lib/libvirt/images/systemrescuecd-x86-4.9.5.iso'/>
>         <backingStore/>
>         <target dev='hda' bus='ide'/>
>         <readonly/>
>         <boot order='1'/>
>         <address type='drive' controller='0' bus='0' target='0' unit='0'/>
>       </disk>
>       <disk type='file' device='disk'>   <---- these conform to the table above
>         <driver name='qemu' type='qcow2'/>
>         <source file='/tmp/pull4.qcow2'/>
>         <target dev='vda' bus='virtio'/>
>         <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
>       </disk>
>       <disk type='file' device='disk'>
>         <driver name='qemu' type='qcow2'/>
>         <source file='/tmp/commit4.qcow2'/>
>         <target dev='vdb' bus='virtio'/>
>         <address type='pci' domain='0x0000' bus='0x00' slot='0x0c' function='0x0'/>
>       </disk>
>       <disk type='file' device='disk'>
>         <driver name='qemu' type='qcow2'/>
>         <source file='/tmp/copy4.qcow2'/>
>         <target dev='vdc' bus='virtio'/>
>         <address type='pci' domain='0x0000' bus='0x00' slot='0x0d' function='0x0'/>
>       </disk>
> 
>    [...]
> 
>   </domain>
>   <cookie>
>   </cookie>
> </domainsnapshot>
> 
> 
> Use a document which you create with:
> 
> virsh snapshot-create $VMNAME --redefine --current
> 
> Use --current only for the most recent snapshot.
> 

Thanks! It works as you wrote. All my snapshots are recovered.

-- 
Petr Stodulka
Core Services (In-place upgrades and migrations)
Red Hat




More information about the libvirt-users mailing list