1、KVM存储模式
基于文件系统的存储
- dir:Filesystem Directory 需要有挂载点的文件系统
- fs:Pre-Formatted Block Device 无需挂载的文件系统,如:位于SAN存储的文件系统,可支持多个主机同时访问,而本地文件系统不支持
- netfs:Network Exported Directory 网络文件系统,比如:NFS,SAMBA等
基于设备的存储
无需文件系统,性能更好,但可管理性差,无法实现快照
Disk:Physical Disk Device
Iscsi:isCSI Target
logical:LVM Volume Group
2、虚拟磁盘类型
- 固定Fixed
- 在配置时,指定磁盘大小
- 不管在虚拟磁盘上实际存储多少数据,都将占用相同大小宿主机的磁盘空间
- 动态Dynamic
- 初始空间占用小
- 随着空间的使用逐渐增长到最大容量,但是只根据需求使用更多的空间
- 差异Differencing
- 因为创建是差异磁盘,所以只保存变更的数据
- 例如,将操作系统安装在父盘,然后创建差异化磁盘来执行进一步配置
3、虚拟镜像文件格式
镜像文件储存在主机文件系统中。它可以储存在本地文件系统中,如 ext4 或 xfs;或网络文件系统中,如 NFS 。例如 libguestfs 这样的工具,能管理、备份及监控文件。KVM 上的磁盘镜像格式包括:
- raw
此为默认磁盘格式,但并是一种真正的磁盘格式,而是代表虚拟机所使用的原始镜像,它并不存储元数据,因此可作为保证虚拟机兼容性的候选方案。然而,也正因为它不存储元数据,因此不支持某些高级特往,比如快照和压缩等格式简单,容易转换为其他的格式。
如果主机文件系统允许,raw 文件可以是预分配(pre-allocated)或 稀疏(sparse)。稀疏文件根据需求分配主机磁盘空间,因此它是一种精简配置形式(thin provisioning)。预分配文件的所有空间需要被预先分配,但它比稀疏文件性能好。当对磁盘 I/O 性能要求非常高,而且通常不需要通过网络传输镜像文件时,可以使用 raw文件
优点 : 性能好
缺点 : 空间占用大,功能较少,生产不推荐使用
- cow:copy-on-write格式,昙花一现
- qcow:QEMU早期的copy-on-write格式,过渡性方案
- qcow2
qcow2 镜像文件提供许多高级磁盘镜像特征,如快照、压缩及加密。它们可以用来代表通过模板镜像创建的虚拟机。因为只有虚拟机写入的扇区部分才会分配在镜像中,所以 qcow2 文件的网络传输效率较高。RHEL 7.0 及更新版本支持 qcow2 v3 镜像文件格式按需进行分配磁盘空间,不管文件系统是否支持
支持快照
支持zlib的磁盘压缩
支持AES的加密
优点 : 空间节约,功能丰富
缺点 : 性能较差,生产推荐使用
- vmdk( Virtual Machine Disk ):VMware环境当中默认使用的磁盘格式
- vhd \ vhdx ( Virtual Hard Disk ):微软默认采用的文件格式
- vdi:VirtualBox 采用的文件格式
查看支持格式
qemu-img --help
# 查看KVM支持的磁盘格式
[root@kvm ~]# qemu-img --help|grep Support
Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebug
4、使用qemu-img管理虚拟磁盘文件
4.1、qemu-img 概述
qemu-img 是一个功能强大的磁盘镜像管理工具
查看帮助:qemu-img –help
qemu-img 包括以下子命令
check #检查完整性
create #创建镜像
commit #提交更改
compare #比较
convert #转换
info #获得信息
map #映射
snapshot #快照管理
rebase #在已有的镜像的基础上创建新的镜像
resize #调整大小
amend #修订镜像格式选项
4.2、创建虚拟磁盘文件
qemu-img create [-q] [--object objectdef] [-f fmt] [-b backing_file] [-F
backing_fmt] [-u] [-o options] filename [size]
创建默认稀疏格式的磁盘
# 默认为raw格式稀疏文件
[root@kvm vm]# qemu-img create vm1.img 1g
Formatting 'vm1.img', fmt=raw size=1073741824
[root@kvm vm]# file vm1.img
vm1.img: data
[root@kvm vm]# ll -h vm1.img
-rw-r--r-- 1 root root 1.0G Dec 17 17:54 vm1.img
[root@kvm vm]# du -h vm1.img
0 vm1.img
[root@kvm vm]# qemu-img info vm1.img
image: vm1.img
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0
查看不同磁盘文件格式支持选项
[root@kvm vm]# qemu-img create -f raw -o ?
Supported options:
size Virtual disk size
[root@kvm vm]# qemu-img create -f qcow2 -o ?
Supported options:
size Virtual disk size
compat Compatibility level (0.10 or 1.1)
backing_file File name of a base image
backing_fmt Image format of the base image
encryption Encrypt the image
cluster_size qcow2 cluster size
preallocation Preallocation mode (allowed values: off, metadata, falloc, full)
lazy_refcounts Postpone refcount updates
qcow2 格式选项
backing_file #指定后端镜像文件
backing_fmt #设置后端镜像的镜像格式
cluster_size #设置镜像中的簇大小,取值在512到2M之间,默认值为64K
preallocation #设置镜像文件空间的预分配模式
encryption #用于设置加密
创建raw格式非稀疏文件
[root@kvm vm]# dd if=/dev/zero of=vm2.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.342324 s, 3.1 GB/s
[root@kvm vm]# qemu-img info vm2.img
image: vm2.img
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 1.0G
[root@kvm vm]# ls -hl vm2.img
-rw-r--r-- 1 root root 1.0G Dec 17 17:59 vm2.img
[root@kvm vm]# du -h vm2.img
1.0G vm2.img
创建raw格式稀疏文件
[root@kvm vm]# dd if=/dev/zero of=vm3.img bs=1M count=0 seek=1024
0+0 records in
0+0 records out
0 bytes (0 B) copied, 6.2502e-05 s, 0.0 kB/s
[root@kvm vm]# qemu-img info vm3.img
image: vm3.img
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0
[root@kvm vm]# ll -h vm3.img
-rw-r--r-- 1 root root 1.0G Dec 17 18:01 vm3.img
[root@kvm vm]# du -h vm3.img
0 vm3.img
raw文件复制的格式控制
# 复制非稀疏文件,默认也为非稀疏文件
[root@kvm vm]# cp vm2.img vm2.img.bak
[root@kvm vm]# du -h vm2.img.bak
1.0G vm2.img.bak
[root@kvm vm]# ll -h vm2.img.bak
-rw-r--r-- 1 root root 1.0G Dec 17 18:02 vm2.img.bak
[root@kvm vm]# qemu-img info vm2.img.bak
image: vm2.img.bak
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 1.0G
# 复制稀疏文件,默认仍为稀疏文件
[root@kvm vm]# cp vm3.img vm3.img.bak
[root@kvm vm]# ll -h vm3.img.bak
-rw-r--r-- 1 root root 1.0G Dec 17 18:04 vm3.img.bak
[root@kvm vm]# du -h vm3.img.bak
0 vm3.img.bak
[root@kvm vm]# qemu-img info vm3.img.bak
image: vm3.img.bak
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0
# 指定将非稀疏文件复制为稀疏格式格式
[root@kvm vm]# cp --sparse=always vm2.img vm2.img.bak2
[root@kvm vm]# qemu-img info vm2.img.bak2
image: vm2.img.bak2
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0
[root@kvm vm]# qemu-img info vm2.img
image: vm2.img
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 1.0G
# 指定将稀疏文件复制为非稀疏格式格式
[root@kvm vm]# cp --sparse=never vm3.img vm3.img.bak2
[root@kvm vm]# qemu-img info vm3.img
image: vm3.img
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0
[root@kvm vm]# qemu-img info vm3.img.bak2
image: vm3.img.bak2
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 1.0G
4.3、检查虚拟磁盘
对于关机状态的虚拟机磁盘,可以检查文件错误
[root@kvm vm]# virsh list
Id Name State
----------------------------------------------------
1 Win2008 running
2 centos7 running
3 centos7.9 running
4 centos7-vm1 running
[root@kvm vm]# virsh shutdown centos7
Domain centos7 is being shutdown
[root@kvm vm]# qemu-img check /var/lib/libvirt/images/centos7.qcow2
No errors were found on the image.
26446/163840 = 16.14% allocated, 16.51% fragmented, 0.00% compressed clusters
Image end offset: 1734082560
4.4、磁盘预分配策略
raw 文件的预分配策略和文件系统是否支持有关,而qcow2则无关
预分配策略
- off
此为缺省策略,即不使用预分配策略,预分配后的虚拟磁盘占用空间很小,不属于稀疏映像类型生成的磁盘文件占用空间很小。
- metadata
只预分配元数据(metadata),预分配后的磁盘文件属于稀疏映像类型,相当于vmware中的磁盘置备选项:Thin Provision(精简配置)
生成的磁盘文件为稀疏格式,实际占用的空间比off策略稍大一些
- falloc
分配文件的块并标识它们的状态为未初始化,即只分配空间,但不置零。预分配后的虚拟磁盘属于非稀疏映像类型,相对full模式来说,创建虚拟磁盘的速度要快很多,相当于vmware中的磁盘置备选项:厚置备延迟置零
生成的磁盘文件实际占用的空间和分配的空间相同大小
- full
分配所有磁盘空间并置零,预分配后的虚拟磁盘属于非稀疏映像类型,创建最慢,相当于vmware中的磁盘置备选项:厚置备置零
生成的磁盘文件实际占用的空间和分配的空间相同大小
创建预分配置策略
[root@kvm vm]# qemu-img create -f qcow2 test1.qcow2 1g
Formatting 'test1.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 lazy_refcounts=off
[root@kvm vm]# qemu-img info test1.qcow2
image: test1.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
# 指定关闭预分配
[root@kvm vm]# qemu-img create -f qcow2 test2.qcow2 1g -o preallocation=off
Formatting 'test2.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='off' lazy_refcounts=off
[root@kvm vm]# qemu-img info test2.qcow2
image: test2.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
# 指定预分配metadata
[root@kvm vm]# qemu-img create -f qcow2 test3.qcow2 1g -o preallocation=metadata
Formatting 'test3.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off
[root@kvm vm]# qemu-img info test3.qcow2
image: test3.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 516K
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
# 指定预分配falloc
[root@kvm vm]# qemu-img create -f qcow2 test4.qcow2 1g -o preallocation=falloc
Formatting 'test4.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='falloc' lazy_refcounts=off
[root@kvm vm]# qemu-img info test4.qcow2
image: test4.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 1.0G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
# 指定预分配full
[root@kvm vm]# qemu-img create -f qcow2 test5.qcow2 1g -o preallocation=full
Formatting 'test5.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='full' lazy_refcounts=off
[root@kvm vm]# qemu-img info test5.qcow2
image: test5.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 1.0G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
# 文件系统显示大小
[root@kvm vm]# ll -h
total 2.1G
-rw-r--r-- 1 root root 193K Dec 17 18:42 test1.qcow2
-rw-r--r-- 1 root root 193K Dec 17 18:43 test2.qcow2
-rw-r--r-- 1 root root 1.1G Dec 17 18:44 test3.qcow2
-rw-r--r-- 1 root root 1.1G Dec 17 18:45 test4.qcow2
-rw-r--r-- 1 root root 1.1G Dec 17 18:45 test5.qcow2
# 查看真实大小
[root@kvm vm]# du -h *
196K test1.qcow2
196K test2.qcow2
516K test3.qcow2
1.1G test4.qcow2
1.1G test5.qcow2
4.5、虚拟磁盘格式转换
qemu-img 可以将不同格式的虚拟磁盘文件进行格式转化
语法格式
qemu-img convert [--object objectdef] [--image-opts] [--target-image-opts] [-U]
[-C] [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-B
backing_file] [-o options] [-s snapshot_id_or_name] [-l snapshot_param] [-S
sparse_size] [-m num_coroutines] [-W] filename [filename2 [...]] output_filename
将vmdk转化为raw 和qcow2格式
# 默认转化为raw格式
# qemu-img convert CentOS7.vmdk CentOS7.img
# 比较大小
# ll -h CentOS7.vmdk CentOS7.img
-rw-r--r-- 1 root root 1.6G Sep 20 16:00 CentOS7.vmdk
-rw-r--r-- 1 root root 200G Sep 20 16:10 CentOS7.img
# du -h CentOS7.vmdk CentOS7.img
1.6G CentOS7.vmdk
1.5G CentOS7.img
# mv CentOS7.img /var/lib/libvirt/images/
# virt-install --import --name=centos7 --vcpus=1 --ram=2048
--disk bus=scsi,path=/var/lib/libvirt/images/CentOS7.img --network
network=default --graphics vnc,listen=0.0.0.0 --os-type=Linux --os-variant=centos7 --noautoconsole --boot hd
# 转化为qcow2
# qemu-img convert -f vmdk -O qcow2 CentOS7.vmdk
CentOS7.qcow2
# 比较大小
# ll -h CentOS7.vmdk CentOS7.qcow2
-rw-r--r-- 1 root root 1.6G Sep 20 16:00 CentOS7.vmdk
-rw-r--r-- 1 root root 1.6G Sep 20 16:12 CentOS7.qcow2
# du -h CentOS7.vmdk CentOS7.qcow2
1.6G CentOS7.vmdk
1.6G CentOS7.qcow2
# mv CentOS7.qcow2 /var/lib/libvirt/images/
# virt-install --import --name=centos7 --vcpus=1 --ram=2048
--disk bus=scsi,path=/var/lib/libvirt/images/CentOS7.qcow2 --network
network=default --graphics vnc,listen=0.0.0.0 --os-type=Linux --os-variant=centos7 --noautoconsole --boot hd
4.6、调整虚拟磁盘大小
虚拟磁盘文件创建后,还可以调整虚拟磁盘大小
语法格式
qemu-img resize [--shrink] filename [+l -]size
- 操作之前,一定要做好数据备份
- 增加文件大小后,需要在客户机中使用fdisk、parted等分区工具进行相应的操作才能真正让客户机使用到增加后的镜像空间。
- 缩小镜像之前,要在客户机中保证里面的文件系统有空余空间,否则会数据丢失。另外xfs文件系统不支持缩减
- qcow2不支持缩小镜像的操作
扩展虚拟磁盘
[root@kvm vm]# qemu-img info /var/lib/libvirt/images/centos7.qcow2
image: /var/lib/libvirt/images/centos7.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.6G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
# 增加10G空间
[root@kvm vm]# qemu-img resize /var/lib/libvirt/images/centos7.qcow2 +10G
Image resized.
[root@kvm vm]# qemu-img info /var/lib/libvirt/images/centos7.qcow2
image: /var/lib/libvirt/images/centos7.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 1.6G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
# 启动虚拟机后,还需要使用fdisk等工具进行空间的继续管理才能使用
缩减虚拟磁盘
[root@kvm ~]# qemu-img info /var/lib/libvirt/images/centos7.qcow2
image: /var/lib/libvirt/images/centos7.qcow2
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 1.6G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
[root@kvm ~]# qemu-img resize /var/lib/libvirt/images/centos7.qcow2 -2G
qemu-img: qcow2 doesn't support shrinking images yet
qemu-img: This image does not support resize
# qcow2的格式磁盘不支持删减操作
5、磁盘快照管理
5.1、快照Snapshot介绍
磁盘快照,对磁盘数据进行快照,主要用于虚拟机备份等场合
磁盘快照分类
- 按快照信息保存分为:
- 内置快照:快照数据和base磁盘数据放在同一个qcow2文件中
- 外置快照:快照数据单独的另一个qcow2文件存放
- 按虚拟机状态可以分为:
- 关机态快照:数据可以保证一致性
- 运行态快照:数据无法保证一致性,类似与系统crash后的磁盘数据。使用是可能需要fsck等操作。
- 按磁盘数量可以分为:
- 单盘:单盘快照不涉及原子性
- 多盘:涉及原子性。主要分两个方面:1.是所有盘快照点相同2.所有盘要么都快照成功,要么都快照失败。主要依赖于qemu的transaction实现
5.2、qemu-img 管理磁盘快照
命令格式
qemu-img snapshot [--object objectdef] [--image-opts] [-U] [-q] [-l | -a
snapshot | -c snapshot | -d snapshot] filename
snapshot is the name of the snapshot to create, apply or delete
-a applies a snapshot (revert disk to saved state)
-c creates a snapshot
-d deletes a snapshot
-l lists all snapshots in the given image
范例
# 查看块设备
[root@kvm ~]# virsh domblklist centos7.9
Target Source
------------------------------------------------
vda /var/lib/libvirt/images/centos7.9.qcow2
# 查看快照,如果没有快照,则无显示信息
[root@kvm ~]# qemu-img snapshot -l /var/lib/libvirt/images/centos7.9.qcow2
# 创建快照
[root@kvm ~]# qemu-img snapshot -c centos7.9-s1 /var/lib/libvirt/images/centos7.9.qcow2
[root@kvm ~]# qemu-img snapshot -l /var/lib/libvirt/images/centos7.9.qcow2
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 centos7.9-s1 0 2022-12-17 19:08:44 00:00:00.000
# 查看快照信息
[root@kvm ~]# qemu-img info /var/lib/libvirt/images/centos7.9.qcow2
image: /var/lib/libvirt/images/centos7.9.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.6G
cluster_size: 65536
Snapshot list:
ID TAG VM SIZE DATE VM CLOCK
1 centos7.9-s1 0 2022-12-17 19:08:44 00:00:00.000
Format specific information:
compat: 1.1
lazy refcounts: false
# 删除文件,模拟破坏
# 关机后才能还原快照修复故障
[root@kvm ~]# qemu-img snapshot -a centos7.9-s1 /var/lib/libvirt/images/centos7.9.qcow2
# 关机后才能删除快照
[root@kvm ~]# qemu-img snapshot -d centos7.9-s1 /var/lib/libvirt/images/centos7.9.qcow2
[root@kvm ~]# qemu-img snapshot -l /var/lib/libvirt/images/centos7.9.qcow2
5.3 virsh 管理虚拟机快照
使用virsh 命令创建快照
[root@kvm ~]# virsh snapshot-list centos7-vm1
Name Creation Time State
------------------------------------------------------------
[root@kvm ~]# virsh snapshot-create centos7-vm1
Domain snapshot 1671275763 created
[root@kvm ~]# virsh snapshot-list centos7-vm1
Name Creation Time State
------------------------------------------------------------
1671275763 2022-12-17 19:16:03 +0800 running
使用virsh 命令还原快照
[root@kvm ~]# virsh snapshot-revert centos7-vm1 --snapshotname 1671275763 --running
使用virsh 命令删除快照
[root@kvm ~]# virsh snapshot-delete centos7-vm1 --snapshotname 1671275763
Domain snapshot 1671275763 deleted
[root@kvm ~]# virsh snapshot-list centos7-vm1
Name Creation Time State
------------------------------------------------------------