思路:以 QCOW2 格式来备份和恢复被保护的 KVM 虚拟机
Step1:centos7_0(base qcow2) 以 qcow2 格式写入到 iSCSI 设备 root@h3cas-e306:/vms/images# virsh list --all Id Name State ---------------------------------------------------- 33 centos7 running root@h3cas-e306:/vms/images# virsh domblklist centos7 Target Source ------------------------------------------------ vda /vms/images/centos7_0 hda /vms/isos/CentOS-7-x86_64-Minimal-1511.iso root@h3cas-e306:/vms/images# qemu-img convert -f qcow2 /vms/images/centos7_0 -O qcow2 /dev/sdd root@h3cas-e306:/vms/images# qemu-img info /dev/sdd image: /dev/sdd file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 0 cluster_size: 262144 Format specific information: compat: 1.1 lazy refcounts: false Step2:尝试使用 iSCSI 设备手动启动 KVM 虚拟机 # 创建 XML 文件 root@h3cas-e306:/etc/libvirt/qemu# vim centos7_q_0.xml <domain type='kvm'> <name>centos7_q_0</name> <uuid>d668e699-22a4-464b-99c4-1ffdcd6ad4e1</uuid> <osha>0</osha> <timesync>0</timesync> <automem>0</automem> <memory unit='KiB'>4194304</memory> <currentMemory unit='KiB'>4194304</currentMemory> <memorySlots>10</memorySlots> <maxMemory unit='KiB'>34359738368</maxMemory> <blkiotune> <weight>300</weight> </blkiotune> <memtune> <priority>1</priority> </memtune> <memoryBacking> <locked>0</locked> </memoryBacking> <vcpu placement='static' current='2'>24</vcpu> <cputune> <shares>512</shares> <period>1000000</period> <quota>-1</quota> </cputune> <os> <type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type> <system>linux</system> <boot dev='hd'/> <boot dev='cdrom'/> </os> <features> <acpi/> <apic/> <pae/> </features> <cpu> <topology sockets='24' cores='1' threads='1'/> <numa> <cell cpus='0-1' memory='4194304'/> </numa> <gurantee unit='MHz'>0</gurantee> </cpu> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <pm> <suspend-to-mem enabled='no'/> <suspend-to-disk enabled='no'/> </pm> <tools upgrade='auto'/> <devices> <emulator>/usr/bin/kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='directsync' io='native'/> <source file='/dev/sdd'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw' cache='none'/> <target dev='hdc' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> </disk> <controller type='usb' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> </controller> <controller type='pci' index='0' model='pci-root'/> <controller type='ide' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> </controller> <controller type='virtio-serial' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </controller> <serial type='pty'> <target port='0'/> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <channel type='unix'> <source mode='bind' path='/var/lib/libvirt/qemu/centos7.agent'/> <target type='virtio' name='org.qemu.guest_agent.0'/> <address type='virtio-serial' controller='0' bus='0' port='1'/> </channel> <input type='tablet' bus='usb'/> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'> <listen type='address' address='0.0.0.0'/> </graphics> <video> <model type='cirrus' vram='9216' heads='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </video> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> </memballoon> </devices> root@h3cas-e306:/etc/libvirt/qemu# virsh define centos7_q_0.xml Domain centos7_q_0 defined from centos7_q_0.xml root@h3cas-e306:/etc/libvirt/qemu# virsh list --all Id Name State ---------------------------------------------------- 33 centos7 running - centos7_q_0 shut off root@h3cas-e306:/etc/libvirt/qemu# virsh start centos7_q_0 Domain centos7_q_0 started root@h3cas-e306:/etc/libvirt/qemu# virsh list --all Id Name State ---------------------------------------------------- 33 centos7 running 34 centos7_q_0 running Step3:对 centos7_0 做快照得到增量快照数据 centos7_1(increment qcow2) root@h3cas-e306:/vms/images# virsh snapshot-create-as --domain centos7 snap01 snap01-desc --disk-only --diskspec vda,snapshot=external,file=/vms/images/centos7_1 --atomic Domain snapshot snap01 created root@h3cas-e306:/vms/images# l centos7_0 centos7_1 root@h3cas-e306:/vms/images# qemu-img info centos7_1 image: centos7_1 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 772K cluster_size: 262144 backing file: /vms/images/centos7_0 backing file format: qcow2 Format specific information: compat: 1.1 lazy refcounts: false root@h3cas-e306:/vms/images# virsh domblklist centos7 Target Source ------------------------------------------------ vda /vms/images/centos7_1 hda /vms/isos/CentOS-7-x86_64-Minimal-1511.isoNOTE: 现在虚拟机的数据会写入到 centos7_1 中, centos7_0 理论上应该是只读的.
Step4:Copy centos7_1 的副本到备份目录下 root@h3cas-e306:/vms/images# cp centos7_1 /kvm_backup/ root@h3cas-e306:/vms/images# ll /kvm_backup/ total 2572 drwxr-xr-x 2 root root 4096 Apr 18 23:39 ./ drwxr-xr-x 33 root root 4096 Apr 18 23:22 ../ -rw------- 1 root root 2883584 Apr 18 23:39 centos7_1 Step5:rebase 并 commit centos7_1 到 iSCSI 设备中 root@h3cas-e306:/etc/libvirt/qemu# virsh destroy 34 Domain 34 destroyed root@h3cas-e306:/etc/libvirt/qemu# virsh list --all Id Name State ---------------------------------------------------- 33 centos7 running - centos7_q_0 shut off root@h3cas-e306:/vms/images# cd /kvm_backup/ root@h3cas-e306:/kvm_backup# ls centos7_1 root@h3cas-e306:/kvm_backup# qemu-img info centos7_1 image: centos7_1 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 2.5M cluster_size: 262144 backing file: /vms/images/centos7_0 backing file format: qcow2 Format specific information: compat: 1.1 lazy refcounts: false root@h3cas-e306:/kvm_backup# qemu-img info /dev/sdd image: /dev/sdd file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 0 cluster_size: 262144 Format specific information: compat: 1.1 lazy refcounts: false root@h3cas-e306:/kvm_backup# qemu-img rebase -b /dev/sdd -F qcow2 centos7_1 root@h3cas-e306:/kvm_backup# qemu-img info centos7_1 image: centos7_1 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 15M cluster_size: 262144 backing file: /dev/sdd backing file format: qcow2 Format specific information: compat: 1.1 lazy refcounts: false root@h3cas-e306:/kvm_backup# qemu-img info /dev/sdd image: /dev/sdd file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 0 cluster_size: 262144 Format specific information: compat: 1.1 lazy refcounts: false root@h3cas-e306:/kvm_backup# qemu-img commit -f qcow2 centos7_1 Image committed. root@h3cas-e306:/kvm_backup# qemu-img info centos7_1 image: centos7_1 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 15M cluster_size: 262144 backing file: /dev/sdd backing file format: qcow2 Format specific information: compat: 1.1 lazy refcounts: false root@h3cas-e306:/kvm_backup# qemu-img info /dev/sdd image: /dev/sdd file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 0 cluster_size: 262144 Format specific information: compat: 1.1 lazy refcounts: false Step6:使用 commit 后的 iSCSI 设备启动虚拟机 root@h3cas-e306:/etc/libvirt/qemu# virsh list --all Id Name State ---------------------------------------------------- 33 centos7 running - centos7_q_0 shut off root@h3cas-e306:/etc/libvirt/qemu# virsh start centos7_q_0 Domain centos7_q_0 started root@h3cas-e306:/etc/libvirt/qemu# virsh list --all Id Name State ---------------------------------------------------- 33 centos7 running 35 centos7_q_0 runningNOTE: 虚拟机启动成功, 证明 QCOW2 格式的虚拟机增量快照文件是能够合并到虚拟机 Base 数据文件中的。
思路:以 RAW 格式来备份和恢复被保护的 KVM 虚拟机
Step1:centos7(base qcow2) 以 raw 格式写入到 iSCSI 设备 root@h3cas-e306:/vms/images# qemu-img info centos7 image: centos7 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 1.0G cluster_size: 262144 Format specific information: compat: 1.1 lazy refcounts: false root@h3cas-e306:/vms/images# qemu-img convert -f qcow2 /vms/images/centos7 -O raw /dev/sdd root@h3cas-e306:/vms/images# qemu-img info /dev/sdd image: /dev/sdd file format: raw virtual size: 23G (24696061952 bytes) disk size: 0 Step2:使用 iSCSI 设备手动启动 KVM 虚拟机 root@h3cas-e306:/etc/libvirt/qemu# virsh define centos7_r_0.xml Domain centos7_r_0 defined from centos7_r_0.xml root@h3cas-e306:/etc/libvirt/qemu# virsh list --all Id Name State ---------------------------------------------------- 36 centos7 running - centos7_q_0 shut off - centos7_r_0 shut off root@h3cas-e306:/etc/libvirt/qemu# virsh start centos7_r_0 Domain centos7_r_0 started root@h3cas-e306:/etc/libvirt/qemu# virsh list --all Id Name State ---------------------------------------------------- 36 centos7 running 37 centos7_r_0 running - centos7_q_0 shut off Step3:对 centos7 做快照得到增量快照数据 centos7_1(increment qcow2) root@h3cas-e306:/vms/images# virsh snapshot-create-as --domain centos7 snap01 snap01-desc --disk-only --diskspec vda,snapshot=external,file=/vms/images/centos7_1 --atomic Domain snapshot snap01 created root@h3cas-e306:/vms/images# ls centos7 centos7_1 root@h3cas-e306:/vms/images# qemu-img info centos7_1 image: centos7_1 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 2.0M cluster_size: 262144 backing file: /vms/images/centos7 backing file format: qcow2 Format specific information: compat: 1.1 lazy refcounts: false Step4: Copy centos7_1 的副本到备份目录下 root@h3cas-e306:/vms/images# cp centos7_1 /kvm_backup/ root@h3cas-e306:/vms/images# cd /kvm_backup/ root@h3cas-e306:/kvm_backup# ls centos7_1 root@h3cas-e306:/kvm_backup# qemu-img info /kvm_backup/centos7_1 image: /kvm_backup/centos7_1 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 2.5M cluster_size: 262144 backing file: /vms/images/centos7 backing file format: qcow2 Format specific information: compat: 1.1 lazy refcounts: false root@h3cas-e306:/kvm_backup# qemu-img info /dev/sdd image: /dev/sdd file format: raw virtual size: 23G (24696061952 bytes) disk size: 0 Step5:以 raw 的格式 rebase 并 commit centos7_1 到 iSCSI 设备中 root@h3cas-e306:/kvm_backup# qemu-img rebase -b /dev/sdd -F raw centos7_1 root@h3cas-e306:/kvm_backup# qemu-img info centos7_1 image: centos7_1 file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 25M cluster_size: 262144 backing file: /dev/sdd backing file format: raw Format specific information: compat: 1.1 lazy refcounts: false root@h3cas-e306:/kvm_backup# qemu-img info /dev/sdd image: /dev/sdd file format: raw virtual size: 23G (24696061952 bytes) disk size: 0 root@h3cas-e306:/kvm_backup# qemu-img commit -f qcow2 centos7_1 Image committed. root@h3cas-e306:~# qemu-img info /dev/sdd image: /dev/sdd file format: raw virtual size: 23G (24696061952 bytes) disk size: 0 Step6: 使用 commit 后的 iSCSI 设备再次启动虚拟机 root@h3cas-e306:/etc/libvirt/qemu# virsh list --all Id Name State ---------------------------------------------------- 38 centos7 running - centos7_q_0 shut off - centos7_r_0 shut off root@h3cas-e306:/etc/libvirt/qemu# virsh start centos7_r_0 Domain centos7_r_0 started root@h3cas-e306:/etc/libvirt/qemu# virsh list --all Id Name State ---------------------------------------------------- 38 centos7 running 39 centos7_r_0 running - centos7_q_0 shut offNOTE:尚未测试虚拟机在备份和恢复的过程中虚拟机的应用业务是否被中断。