virsh - snapshot

最後更新: 2017-04-27

介紹

By default libvirt 的 snapshot 會保儲

  • memory
  • disk
  • device state

 


snapshot-list

 

snapshot-list centos6.3

Name                 Creation Time             State
------------------------------------------------------------

virsh # snapshot-current centos6.3

error: domain 'centos6.3' has no current snapshot

snapshot-create

Default: disk and RAM    ( 加了 --disk-only 就只會 backup harddisk)

virsh # snapshot-create centos6.3

Domain snapshot 1345047528 created

virsh # snapshot-list centos6.3

 Name                 Creation Time             State
------------------------------------------------------------
 1345047528           2012-08-16 00:18:48 +0800 shutoff
 1345047747           2012-08-16 00:22:27 +0800 shutoff

# 不是用數字做名的 snapshot:

virsh # snapshot-create-as debian7 clearos "clear state"

virsh # snapshot-list debian7

Name                 Creation Time             State
------------------------------------------------------------
 clearos              2013-12-11 15:51:25 +0800 shutoff

snapshot-parent

snapshot-parent centos6.3 1345047747

1345047528       <-- 只顯示一層

snapshot-revert

snapshot-revert centos6.3 1345047528

snapshot-delete 

virsh # snapshot-delete centos6.3 1345047528

Domain snapshot 1345047528 deleted

 


External snapshots with libvirt

 

 * At the moment external snapshots are a one-way operation

    (libvirt can create them but cannot do anything further with them)

建立

# snapshot-create-as && --disk-only

virsh snapshot-create-as mydom snap --disk-only

Remark

take Internal snapshots 係比 External snapshots 慢的.

 


Snapshot By XML

 

VM1-snap1.xml:

<domainsnapshot>
    <name>VM1-snap1</name>
    <description>description type here</description>
</domainsnapshot>

virsh snapshot-create VM1 /var/tmp/VM1-snap1.xml

 


snapshot-dumpxml

 

snapshot-dumpxml centos6.3 1345047956

<domainsnapshot>
  <name>1345047956</name>
  <state>shutoff</state>
  <creationTime>1345047956</creationTime>
  <domain type='kvm'>
.................................
  </domain>
</domainsnapshot>

 


snapshot-edit

 

# If snapshotname is omitted, then --current must be supplied,
# (To edit the current snapshot)

snapshot-edit u22 --current

snapshot-list u22

Name         Creation Time               State
---------------------------------------------------
 1694696159   2023-09-14 20:55:59 +0800   shutoff

# allow editor rename current snapshot, 此 "name" 不是保儲存在 IMAGE 裡

snapshot-edit u22 --current --rename

qemu-img snapshot -l u22.qcow2

Snapshot list:
ID        TAG               VM SIZE                DATE     VM CLOCK     ICOUNT
1         1694696159            0 B 2023-09-14 20:55:59 00:00:00.000          0

 


Snapshot 的分類

 

Snapshot 的儲結構一共有種

  • Internal snapshot (qcow2) <-- Deafult
  • External snapshot (vdi)
  • VM State (ram)

查看 Image 檔的內容:

qemu-img info /mnt/vm/centos6.3.qcow2

file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 818M
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
3         1345047956                0 2012-08-16 00:25:56   00:00:00.000

External snapshot XML:

<disk name='vda' snapshot='external'>
  <source file='/path/to/new'/>
</disk>

 


blockcommit

 

它與之後講的 blockpull 是相反操作來

 * You cannot commit from the active image of an online guest

# 需要 Version

# QEMU 2.1 (and above), libvirt-1.2.9 (and above).

Checking: qemu-system-x86_64 --version; libvirtd --version

It is a two phase operation:

(1) once an external snapshot (which results in a qcow2 overlay that tracks the new writes from then on) is taken, the content from the overlay can be copied into its backing file (e.g. 'base'); then

(2) pivot live QEMU to 'base'. All of this while the guest is running.

[1]

# List the current block device in use:
virsh domblklist win7

[2]

# Create an external disk snapshot:
virsh snapshot-create-as win7 guest-state1 \
    --diskspec vda,file=/data/vm/win7/overlay1.qcow2 \
    --disk-only --atomic

    
# Create a snapshot for domain <domain> with the given <name>
snapshot-create-as <domain> {[--print-xml] | [--no-metadata] [--halt]
       [--reuse-external]} [name] [description] [--disk-only [--quiesce] [--atomic]
       [[--diskspec] diskspec]...]
       
--disk-only
request a disk-only snapshot
the command can also take additional diskspec
 
--no-metadata
then the snapshot data is created, but any metadata is immediately discarded
(that is, libvirt does not treat the snapshot as current, and cannot revert to the snapshot unless snapshot-create is later used to teach libvirt about the metadata again)
           
--atomic
libvirt will guarantee that the snapshot either succeeds, or fails with no changes;

[base] (live QEMU)
              TO
[base] <-- [overlay1] (live QEMU)

NOTE-1: Above, if you have QEMU guest agent installed in your virtual machine, try '--quiesce' option with virsh snapshot-create-as[. . .] to ensure you have a consistent disk state.

NOTE-2: Optionally, you can also supply '--no-metadata' option to tell libvirt to not track the snapshot metadata -- this is useful currently, at a later point when you decide to merge snapshot files, you have to explicitly clean the libvirt metadata

[3]

virsh domblklist win7

Take a backup of the original disk in backround using your faviourite tool:

$ cp /export/images/base.img /export/images/copy.img

                or

$ rsync -avh --progress /export/images/base.img \
        /export/images/copy.img

[4] live mergning contents

virsh blockcommit win7 vda --active --verbose --pivot

--active: It performs a two stage operation:

first stage – it commits the contents from top images into base (i.e. sn1, sn2, current into base);

second stage, the block operation remains awake to synchronize any further changes (from top images into base), here the user can take two actions: cancel the job, or pivot the job, i.e. adjust the base image as the current active image.

--pivot: Once data is committed from sn1, sn2 and current into base, it pivots the live QEMU to use base as the active image.
--verbose: Displays a progress of block operation.

# checking

virsh domblklist vm1

Doc

http://wiki.libvirt.org/page/Live-merge-an-entire-disk-image-chain-including-current-active-disk

 


blockpull

 

Flattens an image by populating it with data from its backing image chain.

This makes the image file self-contained so that it no longer depends on backing images

 * You can only pull into the active image of an online guest

Looks like this:

Before: Base.img ← Active.img

After: Base.img is no longer used by the guest and Active.img contains all of the data.

[1]

virsh snapshot-create-as $dom $name --disk-only

# Before: base ← snap1 ← snap2 ← active

virsh blockpull $dom $disk snap1

# This command makes 'snap1' the backing file of active, by pulling data from snap2 into active resulting in:

# After: base ← snap1 ← active.

[3]

Once the blockpull is complete, the libvirt tracking of the snapshot that created the extra image in the chain is no longer useful.

Delete the tracking on the outdated snapshot with this command:

virsh snapshot-delete $dom $name --metadata

blockpull domain path [bandwidth] [base] [--wait [--verbose]

path specifies fully-qualified path of the disk;

<source file='name'/>

By default, this command flattens the entire chain;

but if base is specified, containing the name of one of the
backing files in the chain, then that file becomes the new backing file and
only the intermediate portion of the chain is pulled.

By default, this command returns as soon as possible, and data for the entire
 disk is pulled in the background; the progress of the operation can be checked
 with blockjob.  However, if --wait is specified, then this command will block
 until the operation completes, or cancel the operation if the optional timeout
in seconds elapses or SIGINT is sent (usually with "Ctrl-C").

Using --verbose along with --wait will produce periodic status updates.

Doc

http://wiki.qemu.org/Features/Snapshots

 


 

Creative Commons license icon Creative Commons license icon