KVM-备份与恢复(四)

备份与恢复(四)

8.备份与恢复

8.1 备份恢复概述

image.png-338.5kB

8.2 通过virt-manager管理快照

  • 创建快照
  • 恢复快照
  • 删除快照

8.2.1 创建快照

image.png-22.8kB

image.png-29.3kB

image.png-17.5kB

image.png-38kB

#查看运行的虚拟机列表
[root@KVM ~]# virsh list
 Id    名称                         状态
----------------------------------------------------
 2     centos6.5                      running
 4     centos6.5-2                    running

#查看指定名称的虚拟机的磁盘使用情况
[root@KVM ~]# virsh domblklist centos6.5
目标     源
------------------------------------------------
vda        /var/lib/libvirt/images/centos6.5.qcow2
hda        /ios/CentOS-6.5-x86_64-bin-DVD1.iso

#查看指定磁盘的快照情况
[root@KVM ~]# qemu-img snapshot -l /var/lib/libvirt/images/centos6.5.qcow2
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         snapshot1              216M 2019-01-16 13:39:57   02:04:44.485

8.2.2 恢复快照

image.png-25.1kB

image.png-42.7kB

image.png-27.7kB

8.2.3 删除快照

image.png-50.6kB

[root@KVM ~]# qemu-img snapshot -l /var/lib/libvirt/images/centos6.5.qcow2 
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         snapshot1              216M 2019-01-16 13:39:57   02:04:44.485
2         snapshot2              216M 2019-01-16 14:03:54   02:10:17.600
3         snapshot3              216M 2019-01-16 14:04:26   02:10:24.168
4         snapshot4              216M 2019-01-16 14:04:50   02:10:36.746

KVM的virt-manager做的快照其实就是检查点快照。虽然在我们看起来全都是全量的备份,但实际上并不是,这些快照之间后一个备份的只是前一个快照的增量。因此,他们之间是有关联关系的。我可以通过如下方法查看快照之间的树形关联关系

[root@KVM ~]# virsh snapshot-list centos6.5 --tree
snapshot1
  |
  +- snapshot2
      |
      +- snapshot3
          |
          +- snapshot4

image.png-58.9kB

8.3 通过virsh管理快照

#查看创建快照帮助
[root@KVM ~]# virsh help snapshot-create-as
  NAME
    snapshot-create-as - 使用一组参数生成快照

  SYNOPSIS
    snapshot-create-as <domain> [--name <string>] [--description <string>] [--print-xml] [--no-metadata] [--halt] [--disk-only] [--reuse-external] [--quiesce] [--atomic] [--live] [--memspec <string>] [[--diskspec] <string>]...

  DESCRIPTION
    使用一组参数生成快照(磁盘和 RAM)

  OPTIONS
    [--domain] <string>  domain name, id or uuid
    --name <string>  快照名称
    --description <string>  快照描述
    --print-xml      输出 XML 文档而不是生成 XML
    --no-metadata    提取快照但不生成元数据
    --halt           生成快照后停止域
    --disk-only      捕获磁盘状态而不是 vm 状态
    --reuse-external  重新使用任意现有外部文件
    --quiesce        静默虚拟机的文件系统
    --atomic         需要自动操作
    --live           提取实时快照
    --memspec <string>  内存属性:[file=]name[,snapshot=type]
    [--diskspec] <string>  磁盘属性: disk[,snapshot=type][,driver=type][,file=name]
#创建一个快照
[root@KVM ~]# virsh snapshot-create-as centos6.5 shot1
已生成域快照 shot1

[root@KVM ~]# virsh snapshot-list centos6.5
 名称               生成时间              状态
------------------------------------------------------------
 shot1                2019-01-16 14:10:57 +0800 running   #怎么到上边了
 snapshot1            2019-01-16 13:39:57 +0800 running
 snapshot2            2019-01-16 14:03:54 +0800 running
 snapshot3            2019-01-16 14:04:26 +0800 running

[root@KVM ~]# virsh snapshot-list --tree centos6.5    #以树格式显示快照
snapshot1
  |
  +- snapshot2
      |
      +- snapshot3
          |
          +- shot1          #得如此来查看快照上下级关系
#查看某个快照的详细信息
[root@KVM ~]# virsh snapshot-info centos6.5 --current
名称:       shot1
域:          centos6.5
当前:       是
状态:       running
位置:       内部
上级:       snapshot3
下级:       0
降序:       0
元数据:    是
#删除一个快照
[root@KVM ~]# virsh snapshot-list centos6.5
 名称               生成时间              状态
------------------------------------------------------------
 shot1                2019-01-16 14:10:57 +0800 running
 snapshot1            2019-01-16 13:39:57 +0800 running
 snapshot2            2019-01-16 14:03:54 +0800 running
 snapshot3            2019-01-16 14:04:26 +0800 running

[root@KVM ~]# virsh snapshot-delete centos6.5 snapshot2
已删除域快照 snapshot2

[root@KVM ~]# virsh snapshot-list centos6.5
 名称               生成时间              状态
------------------------------------------------------------
 shot1                2019-01-16 14:10:57 +0800 running
 snapshot1            2019-01-16 13:39:57 +0800 running
 snapshot3            2019-01-16 14:04:26 +0800 running
 
[root@KVM ~]# virsh snapshot-list --tree centos6.5
snapshot1
  |
  +- snapshot3
      |
      +- shot1
#恢复一个快照
#我们执行先删除虚拟机里的部分文件在测试恢复
[root@KVM ~]# virsh snapshot-revert centos6.5 shot1  #恢复快照shot1

8.4 KVM备份与恢复

image.png-257.1kB

基于虚拟磁盘文件的KVM备份

创建临时外部磁盘快照
virsh snapshot-create-as --domain crm guest-statel --diskspec vda,file=/

8.4.1 通过云yum仓库升级qemu-kvm-ev

因为系统自带的qemu-kvm版本太旧1.5.3版本很多不支持,所以我们需要升级qemu-kvm企业版

[root@KVM ~]# mkdir -p /export/images/   #创建存放外部磁盘快照目录

[root@KVM ~]# virsh snapshot-create-as --domain centos6.5 guest-statel --diskspec vda,file=/export/images/centos6.5-overlay1.qcow2 --disk-only --atomic
错误:不支持的操作:这个 QEMU 二进制文件不支持即时磁盘快照

[root@KVM ~]# rpm -qa | grep libvirt
libvirt-python-4.5.0-1.el7.x86_64
libvirt-daemon-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-lxc-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-storage-iscsi-4.5.0-10.el7_6.3.x86_64
libvirt-gobject-1.0.0-1.el7.x86_64
libvirt-daemon-driver-interface-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-qemu-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-storage-4.5.0-10.el7_6.3.x86_64
libvirt-client-4.5.0-10.el7_6.3.x86_64
libvirt-glib-1.0.0-1.el7.x86_64
libvirt-daemon-driver-nwfilter-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-config-nwfilter-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-storage-disk-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-storage-scsi-4.5.0-10.el7_6.3.x86_64
libvirt-libs-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-secret-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-config-network-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-storage-rbd-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-storage-mpath-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-kvm-4.5.0-10.el7_6.3.x86_64
libvirt-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-nodedev-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-storage-core-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-storage-gluster-4.5.0-10.el7_6.3.x86_64
libvirt-bash-completion-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-network-4.5.0-10.el7_6.3.x86_64
libvirt-daemon-driver-storage-logical-4.5.0-10.el7_6.3.x86_64
libvirt-gconfig-1.0.0-1.el7.x86_64

[root@KVM ~]# rpm -qa | grep kvm
qemu-kvm-1.5.3-160.el7.x86_64                   #版本太低
libvirt-daemon-kvm-4.5.0-10.el7_6.3.x86_64
qemu-kvm-common-1.5.3-160.el7.x86_64            #版本太低
#下载阿里云源
[root@KVM ~]# which wget
/usr/bin/wget
[root@KVM ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#以下省略若干。。。

#将本地yum源扔进备份目录
[root@KVM ~]# cd /etc/yum.repos.d/
[root@KVM yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo    CentOS-Vault.repo
CentOS-CR.repo    CentOS-fasttrack.repo  CentOS-Sources.repo
[root@KVM yum.repos.d]# mkdir bak
[root@KVM yum.repos.d]# mv C* bak/
[root@KVM yum.repos.d]# mv bak/*Base* .
[root@KVM yum.repos.d]# ls
bak  CentOS-Base.repo
#生成centos-release-qemu-ev企业版kvm的yum源文件
[root@KVM yum.repos.d]# yum -y install centos-release-qemu-ev
[root@KVM yum.repos.d]# rpm -qa centos-release-qemu-ev
centos-release-qemu-ev-1.0-3.el7.centos.noarch

[root@KVM yum.repos.d]# ls
bak  CentOS-Base.repo  CentOS-QEMU-EV.repo
[root@KVM yum.repos.d]# cat CentOS-QEMU-EV.repo
# CentOS-QEMU-EV.repo
#
# Please see http://wiki.centos.org/SpecialInterestGroup/Virtualization for more
# information

[centos-qemu-ev]
name=CentOS-$releasever - QEMU EV
baseurl=http://mirror.centos.org/centos/$releasever/virt/$basearch/kvm-common/    #源配置文件本行需要修改
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Virtualization

[centos-qemu-ev-test]
name=CentOS-$releasever - QEMU EV Testing
baseurl=http://buildlogs.centos.org/centos/$releasever/virt/$basearch/kvm-common/
gpgcheck=0
enabled=0
#安装和升级企业版qemu-kvm-ev
[root@KVM yum.repos.d]# yum -y install qemu-kvm-ev
[root@KVM yum.repos.d]# rpm -qa qemu-kvm-ev
qemu-kvm-ev-2.12.0-18.el7_6.1.1.x86_64

#重启KVM宿主机
[root@KVM yum.repos.d]# reboot

8.4.2 通过本地定制化yum源,升级qemu-kvm-ev

#查看本地定制化rpm包,通过createrepo命令设定
[root@KVM ~]# ls /root/rpm/
ipxe-roms-qemu-20170123-1.git4e85b27.el7_4.1.noarch.rpm  repodata
lz4-1.7.5-2.el7.x86_64.rpm                               seabios-bin-1.11.0-2.el7.noarch.rpm
qemu-img-ev-2.10.0-21.el7_5.3.1.x86_64.rpm               seavgabios-bin-1.11.0-2.el7.noarch.rpm
qemu-kvm-common-ev-2.10.0-21.el7_5.3.1.x86_64.rpm        spice-server-0.14.0-2.el7_5.3.x86_64.rpm
qemu-kvm-ev-2.10.0-21.el7_5.3.1.x86_64.rpm

#定制好以后,直接进行yum安装即可
[root@KVM ~]# yum -y install qemu-kvm-ev

#重启KVM宿主机
[root@KVM ~]# reboot

qemu-kvm-ev升级完毕,我们继续做外部磁盘快照

[root@KVM ~]# virsh snapshot-create-as --domain centos6.5 guest-statel --diskspec vda,file=/export/images/centos6.5-overlay1.qcow2 --disk-only --atomic
已生成域快照 guest-statel

[root@KVM ~]# ls /export/images/
centos6.5-overlay1.qcow2

8.4.3 查看外部磁盘快照

[root@KVM ~]# virsh snapshot-list centos6.5
 名称               生成时间              状态
------------------------------------------------------------
 guest-statel         2019-01-16 23:05:39 +0800 shutoff
 shot1                2019-01-16 14:10:57 +0800 running
 snapshot1            2019-01-16 13:39:57 +0800 running
 snapshot3            2019-01-16 14:04:26 +0800 running

[root@KVM ~]# virsh snapshot-list --tree centos6.5
snapshot1                   #外部磁盘快照
  |
  +- snapshot3              #虚拟机快照
      |
      +- guest-statel       #虚拟机快照
      +- shot1              #虚拟机快照
#查看虚拟机磁盘信息
[root@KVM ~]# virsh domblklist centos6.5
目标     源
------------------------------------------------
vda        /export/images/centos6.5-overlay1.qcow2     #磁盘的指向变成了我们创建的新的磁盘文件
hda        /ios/CentOS-6.5-x86_64-bin-DVD1.iso

#查看新磁盘文件的xml配置信息
[root@KVM ~]# qemu-img info /export/images/centos6.5-overlay1.qcow2
image: /export/images/centos6.5-overlay1.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 196K
cluster_size: 65536
backing file: /var/lib/libvirt/images/centos6.5.qcow2    #原始磁盘文件成了备份文件
backing file format: qcow2
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

当我们借助外部磁盘快照进行虚拟机的磁盘热备份的时候,实际上是生成了一个指向原始磁盘的软连接的磁盘差异(增量)快照文件。而虚拟机的磁盘改为指向了新生成的软连接磁盘文件。这样子的话,原始磁盘文件就不再处于被占用状态了。我们就可以对其进行各种冷备份了。

8.4.4 对原始虚拟磁盘文件进行冷备份
#查看原始磁盘文件
[root@KVM ~]# qemu-img info /var/lib/libvirt/images/centos6.5.qcow2
image: /var/lib/libvirt/images/centos6.5.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 8.6G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         snapshot1              216M 2019-01-16 13:39:57   02:04:44.485
3         snapshot3              216M 2019-01-16 14:04:26   02:10:24.168
4         shot1                  216M 2019-01-16 14:10:57   02:16:31.850
Format specific information:
    compat: 1.1
    lazy refcounts: true
    refcount bits: 16
    corrupt: false

我们并未在其中发现任何和新磁盘文件相关的指向性信息。因此原始磁盘文件并未被占用。我们可以进行冷备份

#进行虚拟磁盘文件的冷备份
[root@KVM ~]# cd /tmp/

[root@KVM tmp]# tar -zcvf 2019-01-16-centos6.5.tar.gz /var/lib/libvirt/images/centos6.5.qcow2 

[root@KVM tmp]# du -sh 2019-01-16-centos6.5.tar.gz
1.0G	2019-01-16-centos6.5.tar.gz

8.4.5 外部磁盘快照文件的数据回写

先在centos6.5虚拟机中创建几个文件,然后查看切换虚拟磁盘文件后,创建的文件是否消失

#查看虚拟机的虚拟磁盘信息
[root@KVM tmp]# virsh domblklist centos6.5
目标     源
------------------------------------------------
vda        /export/images/centos6.5-overlay1.qcow2
hda        /ios/CentOS-6.5-x86_64-bin-DVD1.iso

#外部磁盘快照的回写
[root@KVM tmp]# virsh blockcommit centos6.5 vda --active --verbose --pivot
Block commit: [100 %]
成功进行数据挖掘

[root@KVM tmp]# virsh domblklist centos6.5
目标     源
------------------------------------------------
vda        /var/lib/libvirt/images/centos6.5.qcow2
hda        /ios/CentOS-6.5-x86_64-bin-DVD1.iso
#清除外部磁盘快照
[root@KVM tmp]# virsh snapshot-list centos6.5
 名称               生成时间              状态
------------------------------------------------------------
 guest-statel         2019-01-16 23:05:39 +0800 disk-snapshot   #已经没用了
 shot1                2019-01-16 14:10:57 +0800 running
 snapshot1            2019-01-16 13:39:57 +0800 running
 snapshot3            2019-01-16 14:04:26 +0800 running

#virsh不支持删除外部磁盘快照
[root@KVM tmp]# virsh snapshot-delete centos6.5 guest-statel
错误:删除快照失败:guest-statel
错误:不支持的配置:尚不支持 1 外部磁盘快照删除

#因此清除元数据信息即可
[root@KVM tmp]# virsh snapshot-delete centos6.5 guest-statel --metadata
已删除域快照 guest-statel

[root@KVM tmp]# virsh snapshot-list centos6.5
 名称               生成时间              状态
------------------------------------------------------------
 shot1                2019-01-16 14:10:57 +0800 running
 snapshot1            2019-01-16 13:39:57 +0800 running
 snapshot3            2019-01-16 14:04:26 +0800 running

此时,我们查看虚拟机里刚刚创建的文件是否丢失。测试结果显示,我们发现并未丢失任何文件。