KVM学习笔记(快照与备份恢复)
1 备份策略参数
RPO:Recovery Point Objective,当前时间距恢复点的时间间隔
RTO:Recovery Time Objective,从当前时间开始恢复所需要的时间
宕机时间=RPO+RTO
宕机时间
2 KVM快照
快照分类:
磁盘快照
- 根据快照信息的保存位置
内置快照:快照保存在虚拟机磁盘文件中
外置快照:快照保存在外置单独的文件中 - 根据虚拟机状态
关机快照
运行态快照:需要在虚拟机中安装agent,能够将缓存中的数据写入磁盘,保证数据的一致性 - 根据磁盘数量
单盘
多盘:原子性,把为虚拟机所有磁盘创建快照的操作当做一个原子操作,要么全部成功,要么全部失败
内存快照
将内存中系统运行的信息进行保存
检查点快照
硬盘快照+内存快照,能够完整的保存虚拟机的状态。
3 virt-manager快照管理
安装qemu-guest-agent
yum -y install qemu-guest-agent
使用virt-manager管理界面创建的快照是检查点快照,能够同时保存硬盘和内存的状态。
virt-manager快照管理界面
创建快照
创建成功后,查看虚拟机的快照信息
#查看虚拟机的快照信息
[root@node1 ~]$ virsh snapshot-list Centos6
Name Creation Time State
------------------------------------------------------------
snapshot1 2020-10-22 17:52:47 +0800 running
#直接查看虚拟机磁盘文件的快照信息
[root@node1 ~]$ qemu-img snapshot -l /vmkvm_exp/centos6-disk0.qcow2
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 snapshot1 220M 2020-10-22 17:52:47 00:04:34.993
接下来创建第二个快照
第二个快照创建完毕
virt-manager不直观,使用virsh命令行可以查看快照的父子关系,以及快照关系树
#snapshot-list加--parent参数,查询快照父子关系
virsh $ snapshot-list Centos6 --parent
Name Creation Time State Parent
------------------------------------------------------------
snapshot1 2020-10-22 17:52:47 +0800 running (null)
snapshot2 2020-10-22 18:04:33 +0800 running snapshot1
#snapshot-list加--tree参数,查询快照树
virsh $ snapshot-list Centos6 --tree
snapshot1
|
+- snapshot2
4 快照删除
快照本质上是差分盘技术,创建快照时硬盘创建一个差分硬盘(子盘),后续增删的数据都是保存在子盘上的,父盘做只读处理,这个只读的父盘就是创建的快照。在做快照还原时,只需删除差分盘即可。读盘时先检查差异磁盘,再检查原有磁盘,这样看写入性能影响是很小的,但读盘时需要读几个虚拟磁盘文件,有一定性能影响。
快照示意图
在第一个快照的基础上可以再次创建快照,相当于子盘再继续创建差分盘(孙盘),这样子子孙孙延续下去。
两次快照示意图
删除快照时,会将选中快照对应的虚拟硬盘数据合并到它的差分子盘上,然后删除该差分盘。不会改变 VM的当前状态,只是删除了选中层次的差分硬盘。
快照2删除示意图
5 virsh管理快照
创建快照
snapshot-create-as <domain> [--name <string>] [--description <string>] [--print-xml] [--no-metadata] [--halt] [--disk-only] [--reuse-external] [--quiesce] [--atomic] [--live] [--memspec <string>] [[--diskspec] <string>]...
OPTIONS
[--domain] <string> domain name, id or uuid
--name <string> name of snapshot
--description <string> description of snapshot
--print-xml print XML document rather than create
#打印快照xml文件而不创建快照
--no-metadata take snapshot but create no metadata
#不创建快照的metadata信息
--halt halt domain after snapshot is created
--disk-only capture disk state but not vm state
#只创建磁盘快照,不包括内存
--reuse-external reuse any existing external files
--quiesce quiesce guest's file systems
--atomic require atomic operation
#原子性,多块盘同时做,要么都成功要么都失败
--live take a live snapshot
--memspec <string> memory attributes: [file=]name[,snapshot=type]
[--diskspec] <string> disk attributes: disk[,snapshot=type][,driver=type][,file=name]
#做外部快照时,指定磁盘有关参数
virsh $ snapshot-create-as Centos6 --name snapshot1
#当不加--name参数时,快照名称为时间戳
查看快照信息
snapshot-info <domain> [--snapshotname <string>] [--current]
OPTIONS
[--domain] <string> domain name, id or uuid
--snapshotname <string> snapshot name
--current info on current snapshot
virsh $ snapshot-info Centos6 --current
Name: snapshot2
Domain: Centos6
Current: yes
State: running
Location: internal
Parent: snapshot1
Children: 0
Descendants: 0
Metadata: yes
回滚快照
snapshot-revert <domain> [--snapshotname <string>] [--current] [--running] [--paused] [--force]
OPTIONS
[--domain] <string> domain name, id or uuid
--snapshotname <string> snapshot name
--current revert to current snapshot
--running after reverting, change state to running
--paused after reverting, change state to paused
--force try harder on risky reverts
virsh $ snapshot-revert Centos6 --snapshotname snapshot1
6 备份与恢复
6.1 backing_file
创建虚拟机磁盘文件时可以使用backing_file来指定父盘镜像创建子盘,VM挂载子盘后,看上去跟父盘完全一样,只是后续增删的数据都是保存在子盘上的。
可以基于同一个父盘创建多个子盘给不同的虚拟机使用,桌面云的链接克隆就是这个原理,父盘为装好操作系统的系统盘,不同的子盘存放不同用户的数据。
由于读取父盘数据时存在并发的问题,需要避免在高IO环境中使用。
6.2 备份
采用内置快照时,快照存储在虚拟机磁盘文件内,对于正在运行的虚拟机,如果有数据写入,无法对磁盘文件进行拷贝。
采用外置快照时,父盘只读不写,写入在外置的差分盘中进行,可以对父盘文件进行拷贝。
6.3 基于外置快照的备份
创建外置快照需要升级qemu-kvm为ev版本
yum -y install qemu-release-qemu-ev
yum -y install qemu-kvm-ev libvirt
创建外置快照,外置快照的磁盘文件是qcow2格式的
virsh snapshot-create-as Centos6 --name guest-state1 \
--disk-only --atomic --diskspec vda,file=/export/images/Centos6-overlay1.qcow2
#vda是Centos6虚拟机要创建快照的磁盘,file= 是快照文件存放的位置
#外置快照磁盘文件是qcow2格式
[root@node1 ~]$ qemu-img info /export/images/Centos6-overlay1.qcow2
image: /export/images/Centos6-overlay1.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 3.8M
cluster_size: 65536
backing file: /vmkvm_exp/centos6-disk0.qcow2
backing file format: qcow2
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
#此时虚拟机的磁盘文件指向创建的外置快照
[root@node1 ~]$ virsh domblklist Centos6
Target Source
------------------------------------------------
vda /export/images/Centos6-overlay1.qcow2
hda -
创建完成后,可以原父磁盘文件进行备份。
备份结束后,将快照差分盘数据回写入母盘。
blockcommit <domain> <path> [--bandwidth <number>] [--base <string>] [--shallow] [--top <string>] [--active] [--delete] [--wait] [--verbose] [--timeout <number>] [--pivot] [--keep-overlay] [--async] [--keep-relative] [--bytes]
OPTIONS
[--domain] <string> domain name, id or uuid
[--path] <string> fully-qualified path of disk
--bandwidth <number> bandwidth limit in MiB/s
--base <string> path of base file to commit into (default bottom of chain)
--shallow use backing file of top as base
--top <string> path of top file to commit from (default top of chain)
--active trigger two-stage active commit of top file
--delete delete files that were successfully committed
--wait wait for job to complete (with --active, wait for job to sync)
--verbose with --wait, display the progress
--timeout <number> implies --wait, abort if copy exceeds timeout (in seconds)
--pivot implies --active --wait, pivot when commit is synced
#快照写入母盘后,虚拟机磁盘文件指向母盘,抛弃子盘
--keep-overlay implies --active --wait, quit when commit is synced
--async with --wait, don't wait for cancel to finish
--keep-relative keep the backing chain relatively referenced
--bytes the bandwidth limit is in bytes/s rather than MiB/s
virsh $ blockcommit Centos6 vda --active --pivot --verbose
#写入成功且pivot后,虚拟机磁盘变为母盘
[root@node1 ~]$ virsh domblklist Centos6
Target Source
------------------------------------------------
vda /vmkvm_exp/centos6-disk0.qcow2
hda -
删除外置快照,kvm不支持删除外置快照文件,需要删除外置快照metadata信息后,手工删除外置快照文件
#删除metadata
virsh $ snapshot-delete Centos6 guest-state1 --metadata
#删除磁盘文件
[root@node1 ~]$ rm -f /export/images/Centos6-overlay1.qcow2
7 qemu-img磁盘快照
通过qemu-img
命令创建快照链只能在虚拟机关机状态下运行,否则会造成vm的硬盘文件损坏。
7.1 虚拟磁盘快照查询
使用snapshot -l
查询
qemu-img snapshot -l 硬盘文件名
使用info
查询
qemu-img info 硬盘文件名
7.2 创建虚拟磁盘快照
qemu-img snapshot -c snapshot的tag 硬盘文件名
7.3 虚拟磁盘快照回滚
qemu-img shapshot -a snapshot的tag 硬盘文件名
7.4 虚拟磁盘快照删除
qemu-img shapshot -d snapshot的tag 硬盘文件名