文章目录
一、KVM虚拟磁盘(一)虚拟磁盘格式(二)虚拟磁盘管理工具 qemu-img 二、KVM虚拟机快照管理三、KVM虚拟机克隆(一)完整克隆(二)链接克隆一、KVM虚拟磁盘
(一)虚拟磁盘格式
raw:裸格式,指定多大就创建多大,直接占用指定大小的空间,性能较好,不方便传输。目前来看,是KVM和XEN默认的格式。
因为其原始,有很多原生的特性,例如直接挂载也是一件简单的事情。裸的好处还有就是简单,支持转换成其它格式的虚拟机镜像,(如果其它格式需要转换,有时候还是需要它做为中间格式)。空间使用来看,类似于磁盘,使用多少就是多少(du -h看到的大小就是使用大小)。扩容简单方便,可以在原来的盘上追加空间(可以直接使用dd命令创建该格式的磁盘镜像)
cow:曾经qemu的写时拷贝的镜像格式,目前由于历史遗留原因不支持窗口模式。从某种意义上来说是个弃婴,还没得它成熟就死在腹中,后来被qcow格式所取代。
qcow (qemu copy on write):一代的qemu的cow格式,刚刚出现的时候有比较好的特性,但其性能和raw格式对比还是有很大的差距,目前已经被新版本的qcow2取代。
qcow2:写时复制特性,用多大占多大,但不能超过创建时指定的大小,只能扩容不能缩容。是openstack默认也是比较推荐的格式,将差异保存在一个文件,文件比较小而且做快照也比较小,便于传输且空间是动态增长的,是现在比较主流的一种虚拟化镜像格式。经过一代的优化,目前qcow2的性能上接近raw裸格式的性能。qcow2的snapshot(快照),可以在镜像上做N多个快照:更小的存储空间,即使是不支持holes的文件系统也可以(这下du -h和ls -lh看到的就一样了),支持多个snapshot,对历史snapshot进行管理,支持zlib的磁盘压缩,支持AES的加密
vmdk VMware的格式。从性能和功能上来说,vmdk应该算最出色的,由于vmdk结合了VMware的很多能力,目前来看,KVM和XEN使用这种格式的情况不是太多。但就VMware的Esxi来看,它的稳定性和各方面的能力还是可圈可点。
vdi 单纯从能力上来说vdi在VirtualBox上的表现不错。也是不错的workstation级别的产品。
KVM虚拟机的磁盘常用格式为 raw 和 qcow2 ,对比:
KVM虚拟机的磁盘文件:默认位于/var/lib/libvirt/images/虚拟机名.img(或者由管理员提前准备,手动指定)
(二)虚拟磁盘管理工具 qemu-img
qemu-img(磁盘镜像文件格式转换工具)是QEMU的磁盘管理工具,能够帮助用户轻松创建、转换、修改虚拟磁盘,为磁盘的管理提供了帮助。软件支持vmdk、vhdx、qcow2等格式,满足用户的各种镜像文件格式转换需求。
查看虚拟磁盘信息
qemu-img info /path/to/磁盘文件名[root@kvm ~]# qemu-img info /var/lib/libvirt/images/template.qcow2 image: /var/lib/libvirt/images/template.qcow2file format: qcow2 # 格式virtual size: 10G (10737418240 bytes) # 磁盘大小disk size: 1.2G# 已使用大小cluster_size: 65536Format specific information:compat: 1.1lazy refcounts: true
创建虚拟磁盘
qemu-img create -f 格式(qcow2或raw) 磁盘文件名 容量 # 如果不指定磁盘格式,那么默认为raw。容量单位:K/M/G/T/P/E[root@kvm ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/test1.qcow2 1G Formatting '/var/lib/libvirt/images/test1.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 lazy_refcounts=off [root@kvm ~]# qemu-img create /var/lib/libvirt/images/test2.raw 1G Formatting '/var/lib/libvirt/images/test2.raw', fmt=raw size=1073741824 [root@kvm ~]# cd /var/lib/libvirt/images/[root@kvm images]# ll -htotal 2.8G-rw-------. 1 qemu qemu 11G May 12 17:04 template.qcow2-rw-r--r--. 1 root root 193K May 12 17:30 test1.qcow2-rw-r--r--. 1 root root 1.0G May 12 17:33 test2.raw# 可以看到raw格式磁盘创建多大显示多大,qcow2格式磁盘显示的是使用大小,因为qcow2的写时复制特性,所以实际上qcow2格式磁盘是使用多少占用多少容量,但不能超过创建时指定的大小
调整虚拟磁盘容量
#缩容慎用,易丢失数据
qemu-img resize /path/to/磁盘文件名 [+|-]容量 # 使用 +或-表示在原有容量的基础上增加或者减少多少容量,如果不使用 +或- ,则表示调整后的大小。注意:qcow2格式不支持减小容量[root@kvm ~]# qemu-img resize /var/lib/libvirt/images/test1.qcow2 10TImage resized.# 因为是写时复制特性,所以理论上可以指定任意大小,但是该磁盘容量大小超过物理机的可用磁盘大小,所以也就不会达到真正以上指定的10T大小
磁盘格式转换
qemu-img convert -f 原磁盘文件格式 -O 转换后的磁盘文件格式 /path/to/原磁盘文件名 /path/to/转换后的磁盘文件名# 如果在转换虚拟机磁盘格式时,需要在关闭虚拟机的状态下执行格式转换操作,防止转换时写入的数据未转换,导致数据不一致。如果此时要指定虚拟机使用该磁盘,那么需要修改虚拟机的配置文件将文件路径(source)和格式(type)进行修改。
二、KVM虚拟机快照管理
raw格式硬盘不支持快照,qcow2格式硬盘支持快照。快照文件将存储于对应虚拟机的硬盘中
创建快照
virsh snapshot-create domain # 创建以时间戳命名的快照virsh snapshot-create-as --name 快照名 domain # 自定义快照名创建快照[root@kvm images]# virsh snapshot-create template2Domain snapshot 1620821951 created[root@kvm images]# virsh snapshot-list template2Name Creation Time State------------------------------------------------------------1620821951 -05-12 20:19:11 +0800 running# 默认以unix时间戳命名该快照(当前时间距离计算机元年1970年1月1日的秒数)[root@kvm images]# date +%s162082[root@kvm images]# virsh snapshot-create-as --name nginx_binary template2Domain snapshot nginx_binary created[root@kvm images]# virsh snapshot-list template2 Name Creation Time State------------------------------------------------------------1620821951 -05-12 20:19:11 +0800 runningnginx_binary -05-12 20:26:09 +0800 running
查看快照
virsh snapshot-list domain
删除快照
virsh snapshot-delete domain --snapshotname 快照名
还原快照
virsh snapshot-revert domain --snapshotname 快照名
三、KVM虚拟机克隆
完整克隆:是原始虚拟机当前状态的完整副本。此副本虚拟机完全独立,但需要较多的存储磁盘空间。原虚拟机被删除,完整克隆的虚拟机仍可用。
链接克隆:是对原始虚拟机的引用,所需的存储磁盘空间较小。但是,必须能够访问原始虚拟机才能运行。原始虚拟机删掉那么链接克隆的虚拟机也不可用
注意:克隆虚拟机前,虚拟机必须处于关机或者挂起状态
(一)完整克隆
# 自动完整克隆virt-clone --auto-clone -o domain -n 克隆后的虚拟机名 # 手动完整克隆:(1)复制原始虚拟机磁盘文件 cp xxx.qcow2 vm_node.qcow2(2)备份原始虚拟机配置文件 virsh dumpxml > vm_node.xml (3)修改备份后的虚拟机配置文件中的虚拟机名,删除设备UUID,删除网卡mac地址,修改磁盘路径名等 vim vm_node.xml (4)导入虚拟机 virsh define vm_node.xml (5)测试 virsh list --all 并且 virsh start vm_node [root@kvm ~]# virsh list --allId Name State-----------------------------------------------------template1 shut off-template2 shut off[root@kvm ~]# virt-clone --auto-clone -o template2 -n template2_cloneWARNING Setting the graphics device port to autoport, in order to avoid conflicting.Allocating 'template2_clone.qcow2' | 10 GB 00:02:35Clone 'template2_clone' created successfully.[root@kvm ~]# virsh list --allId Name State-----------------------------------------------------template1 shut off-template2 shut off-template2_cloneshut off # 克隆后的[root@kvm ~]# virsh dumpxml template2 | grep -i 'qcow2'<driver name='qemu' type='qcow2'/><source file='/var/lib/libvirt/images/template2.qcow2'/># 查看克隆后的虚拟机的磁盘文件位置 [root@kvm ~]# virsh dumpxml template2_clone | grep -i 'qcow2'<driver name='qemu' type='qcow2'/><source file='/var/lib/libvirt/images/template2_clone.qcow2'/># 比较原始虚拟机与克隆后的虚拟机磁盘大小[root@kvm ~]# ll /var/lib/libvirt/images/template2.qcow2-rw-------. 1 root root 11858870784 May 12 21:16 /var/lib/libvirt/images/template2.qcow2[root@kvm ~]# ll -h /var/lib/libvirt/images/template2.qcow2-rw-------. 1 root root 12G May 12 21:16 /var/lib/libvirt/images/template2.qcow2[root@kvm ~]# ll -h /var/lib/libvirt/images/template2_clone.qcow2 -rw-------. 1 root root 1.3G May 12 21:19 /var/lib/libvirt/images/template2_clone.qcow2
完整克隆后的磁盘文件会和原始虚拟机的磁盘文件在相同目录下,克隆后的虚拟机磁盘文件名为:“克隆时指定的虚拟机名.后缀名” 后缀名和原始虚拟机磁盘文件名后缀一致,而且克隆虚拟机的磁盘文件比原始虚拟机磁盘文件小,因为克隆不会复制原始虚拟机的快照,并且会对数据进行了压缩
(二)链接克隆
创建出来的链接克隆的硬盘必须是 qcow2 格式,而源硬盘格式可以为 raw,也可以为 qcow2。链接克隆类似于手动创建完整克隆,差异仅在第一步,手动创建完整克隆是需要将原虚拟机的硬盘整个拷贝过来作为克隆后虚拟机的硬盘使用,而创建链接克隆的第一步是需要为原始虚拟机的硬盘创建一个链接克隆的硬盘。
#官方没有自动创建链接克隆虚拟机的工具,不能一步到位,需要手动分步完成。分为以下几步完成:
为template2 虚拟机创建链接克隆:
(1)为需要被创建链接克隆的虚拟机的硬盘创建链接克隆硬盘
# 用法:qemu-img create -f qcow2(这是指定创建的链接硬盘格式,固定必须为qcow2) -b /path/to/源硬盘 /path/to/链接硬盘# 首先查找template2虚拟机硬盘位置[root@kvm ~]# virsh dumpxml template2 | grep -i 'qcow2'<driver name='qemu' type='qcow2'/><source file='/var/lib/libvirt/images/template2.qcow2'/># 为该硬盘创建链接硬盘[root@kvm ~]# qemu-img create -f qcow2 -b /var/lib/libvirt/images/template2.qcow2 /var/lib/libvirt/images/template2_link_clone.qcow2Formatting '/var/lib/libvirt/images/template2_link_clone.qcow2', fmt=qcow2 size=10737418240 backing_file='/var/lib/libvirt/images/template2.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off # 查看创建的链接硬盘[root@kvm ~]# qemu-img info /var/lib/libvirt/images/template2_link_clone.qcow2image: /var/lib/libvirt/images/template2_link_clone.qcow2file format: qcow2virtual size: 10G (10737418240 bytes)disk size: 196Kcluster_size: 65536backing file: /var/lib/libvirt/images/template2.qcow2 # 被链接的源硬盘Format specific information:compat: 1.1lazy refcounts: false
(2)导出需要被链接克隆虚拟机的配置文件
# 用法:virsh dumpxml domain > /path/to/xxx.xml # xxx为创建的链接克隆的虚拟机名[root@kvm ~]# virsh dumpxml template2 > /etc/libvirt/qemu/template2_link_clone.xml
(3)修改被导出的虚拟机配置文件(即该文件要作为链接克隆虚拟机的配置文件)
[root@kvm ~]# vim /etc/libvirt/qemu/template2_link_clone.xml修改虚拟机名 <name>template2_link_clone</name>删除虚拟机uuid修改磁盘路径,使用上面创建的链接克隆硬盘 <source file='/var/lib/libvirt/images/template2_link_clone.qcow2'/>删除网卡mac地址
(4)使用上面虚拟机配置文件(即修改后的链接克隆虚拟机的配置文件)导入该链接克隆虚拟机
用法:virsh define /path/to/虚拟机配置文件[root@kvm ~]# virsh define /etc/libvirt/qemu/template2_link_clone.xmlDomain template2_link_clone defined from /etc/libvirt/qemu/template2_link_clone.xml
(5)测试
[root@kvm ~]# virsh list --allId Name State-----------------------------------------------------template2 shut off-template2_cloneshut off-template2_link_clone shut off # 此即为链接克隆的虚拟机# 启动该链接克隆的虚拟机[root@kvm ~]# virsh start template2_link_clone Domain template2_link_clone started# 查看[root@kvm ~]# virsh list --allId Name State----------------------------------------------------1template2_link_clone running-template2 shut off-template2_cloneshut off
所以,此时我们需要自己写一个创建链接克隆的脚本
全自动链接克隆虚拟机脚本
#!/bin/bash# 第一个位置参数为原虚拟机名,第二个位置参数为克隆后的虚拟机名 # 原虚拟机硬盘名,后缀名不一定为qcow2,也有可能是rawVM_ORI=`virsh domblklist $1 | awk -F / 'NR==3 {print $NF}'`# 磁盘镜像目录#IMA_DIR=/var/lib/libvirt/images/OLD_DISK=`virsh dumpxml $1 | grep "source file" | awk -F"'" '{print $2}'`IMA_DIR=`dirname $OLD_DISK`# 虚拟机配置文件目录VM_DIR=/etc/libvirt/qemu/# 创建链接克隆磁盘qemu-img create -f qcow2 -b ${IMA_DIR}/${VM_ORI} ${IMA_DIR}/${2}".qcow2"# 创建链接克隆虚拟机配置文件virsh dumpxml $1 > $VM_DIR$2".xml"# 修改链接克隆虚拟机配置文件sed -ri "s#(<name>)(.*)(</name>)#\1$2\3#g" $VM_DIR$2".xml"sed -ri '/uuid/d' $VM_DIR$2".xml"sed -ri '/mac address/d' $VM_DIR$2".xml"sed -ri "s#(<source file=')(.*)('/>)#\1/var/lib/libvirt/images/$2".qcow2"\3#g" $VM_DIR$2".xml"# 导入链接克隆虚拟机virsh define $VM_DIR$2".xml"# 启动链接克隆虚拟机virsh start $2# 查看virsh list --all