通过文件管理可以直接查看、修改、复制虚拟机的内部文件。例如,当系统因为配置文件无法启动时,可以直接修改虚拟机的文件。虚拟机磁盘文件主要有raw和qcow2格式。raw格式性能最好,速度最快,它的缺点就是不支持一些新的功能,如支持镜像,zlib磁盘压缩,AES加密等。要使用镜像功能,磁盘格式必须为qcow2。
raw格式的话,速度稍微快点,在高版本的qemu-kvm中,几乎不比qcow2的格式快,而qcow2格式节省空间,可动态增长,在公有云中广泛使用,建议使用qcow2。所有有时候,我们需要将raw格式的磁盘转换成qcow2格式(qemu-img convert -f raw -O qcow2 /kvm/myvm01.img /kvm-/vmtest01.qcow2)。
离线访问工具应用场景
- 观看或下载位于虚拟机磁盘中的文件
- 编辑或上传文件到虚拟机磁盘
- 读取或写入的虚拟机配置
- 准备新的磁盘映像,其中包含文件、目录、文件系统、分区、逻辑卷和其他选项
- 拯救和修复客户无法启动或需要更改启动配置的虚拟机
- 监控虚拟机的磁盘使用情况
- 根据组织安全标准审计虚拟机的合规性
- 通过克隆和修改模板来部署虚拟机
- 读取CD和DVD ISO和软盘映像
离线命令
需要注意的是,确保虚拟机是关闭状态下,否则会报错
virt-inspector
显示os版本、内核、驱动、挂载点、应用等等,但是很少使用,执行后需要等一会。
1. [root@kvmserver ~]# virt-inspector /kvm/img/vm01.qcow2 2. [root@kvmserver ~]# virt-inspector --format=qcow2 -a /kvm/img/vm01.qcow2 | more
virt-cat
类似于cat命令,参数:-a 需要指定虚拟机储存文件;-d 需要指定虚拟机名称,用法相同。
1. [root@kvmserver ~]# virt-cat -a /kvm/img/vm01.qcow2 /etc/hostname 2. vm01 3. [root@kvmserver ~]# virt-cat -d myvm01 /etc/hostname 4. vm01
virt-edit
类似于vim,执行命令后在文本编辑器内修改文件内容。例如在下面修改主机名,原主机名为vm01,修改后主机名为myvm01,通过virt-cat命令查看主机名已经修改成功。
1. [root@kvmserver ~]# virt-edit -d myvm01 /etc/hostname 2. myvm01 #修改添加主机名称 3. [root@kvmserver ~]# virt-cat -d myvm01 /etc/hostname 4. myvm01
virt-df
类似于df -h用于查看虚拟机磁盘信息
1. [root@kvmserver ~]# virt-df -h -d myvm01 2. Filesystem Size Used Available Use% 3. myvm01:/dev/sda1 1014M 105M 909M 11% 4. myvm01:/dev/centos/root 6.2G 1.2G 5.0G 20%
virt-copy-out
类似于scp命令,把虚拟机中的文件远程复制到宿主机中。例:把虚拟机中的passwd命令复制到当前路径,查看是否存在。
1. [root@kvmserver ~]# virt-copy-out -d myvm01 /etc/passwd ./ 2. [root@kvmserver ~]# ls 3. anaconda-ks.cfg passwd
virt-copy-in
类似于scp命令,把宿主机中的文件远程复制到虚拟机中。例:在宿主机中创建一个test文件,复制给虚拟机,通过virt-cat命令查看是否成功。
1. [root@kvmserver ~]# echo "this is a test" > test.txt 2. [root@kvmserver ~]# virt-copy-in -d myvm01 test.txt /opt/ 3. [root@kvmserver ~]# virt-cat -d myvm01 /opt/test.txt 4. this is a test
guestfish
可以查看、编辑和删除镜像内的文件,但是局限性很大,ls,cd等命令不能使用,推荐使用挂载的方式。
语法格式:
guestfish [--ro|--rw] -i -a 虚拟机磁盘文件
guestfish [--ro|--rw] -i -d 虚拟机名称
guestmount
在一些使用场景中,直接把虚机镜像文件挂接在本地系统中,也是一个简便的办法。
guestmount -d 虚拟机名 -m 磁盘路径 --rw 挂载点
如果事先不知道虚机内部分区的路径信息,则可以使用参数-i来让guestmount自己决定使用哪一个磁盘路径,挂载后,进入mnt目录下就是myvm01的根目录,可以进行正常操作。
1. [root@kvmserver ~]# guestmount -d myvm01 -i --rw /mnt 2. [root@kvmserver ~]# cd /mnt 3. [root@kvmserver mnt]# ls 4. bin dev home lib64 mnt proc run srv tmp var 5. boot etc lib media opt root sbin sys usr
将/mnt下的挂载进行卸载
1. [root@kvmserver ~]# guestunmount /mnt 2. [root@kvmserver ~]# ls /mnt 3. [root@kvmserver ~]#
管理虚拟磁盘
虚拟化项目中存储的注意事项
- 存储的性能几乎总是虚拟化的瓶颈
- 通过多个磁盘驱动以分布磁盘I/O来实现存储解决方案
- 驱动器的速度越快越好,考虑SSD与机械磁盘的混合使用
- 考虑部署集中化的SAN/NFS来实现高可用性和实时迁移
虚拟磁盘类型
1. 固定 :Fixed
在配置时,指定磁盘大小;不管在虚拟磁盘上实际存储多少数据,都将占用相同大小主机磁盘空间。
2. 动态 :Dynamic
增长到最大容量,但是只根据需求使用更多的空间。
3. 差异(差分盘) :Differencing
因为创建是差异磁盘,所以只保存变更的数据,类似于lvm的快照;例如,将操作系统安装在父盘,然后创建差异化磁盘来执行进一步配置,桌面虚拟化使用很多。
KVM支持的虚拟磁盘类型
raw: 这并非是一种真正的磁盘格式,而是代表虚拟机所使用的原始镜像它并不存储元数据,因此可以作为保证虚拟机兼容性的候选方案。然而,也正因为它不存储元数据,因此不能支持某些高级特性,比如快照和压缩等格式简单,容易转化为其他的格式。需要文件系统的支持才能支持sparse file。
qcow2:按需进行分配磁盘空间,不管文件系统是否支持;支持快照;支持zlib的磁盘压缩;支持AES的加密。
vmdk(virtual machine disk):VMware环境当中默认使用的磁盘格式。
vhd\vhdx(virtual Hard Disk):微软默认采用的文件格式
还有很多磁盘类型,这里就不一一介绍,可以通过下面命令查看KVM所支持的磁盘类型。
1. [root@kvmserver ~]# qemu-img --help | grep Supported 2. 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
qemu-img命令
它是QEMU的磁盘管理工具,在qemu-kvm源码编译后就会默认编译好qemu-img这个二进制文件。qemu-img也是QEMU/KVM使用过程中一个比较重要的工具,qemu-img工具的命令行基本用法如下:
qemu-img command [command options]
qemu-img常用功能命令:
命令 | 作用 |
check | 检查完整性 |
create | 创建镜像 |
commit | 提交更改 |
compare | 比较 |
convert | 转换 |
info | 获取信息 |
map | 映射 |
snapshot | 快照管理 |
rebase | 在已有镜像的基础上创建新的镜像 |
resize | 调整大小 |
amend | 修订镜像格式选项 |
创建虚拟磁盘,默认是创建raw格式的磁盘
1. [root@kvmserver ~]# qemu-img create test1.img 1G 2. Formatting 'test1.img', fmt=raw size=1073741824 3. [root@kvmserver ~]# qemu-img info test1.img 4. image: test1.img 5. file format: raw #默认raw格式 6. virtual size: 1.0G (1073741824 bytes) 7. disk size: 0 #创建的是sparse模式
创建qcow2格式磁盘
1. [root@kvmserver ~]# qemu-img create -f qcow2 test2.qcow2 1G 2. Formatting 'test2.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 lazy_refcounts=off 3. [root@kvmserver ~]# qemu-img info test2.qcow2 4. image: test2.qcow2 5. file format: qcow2 6. virtual size: 1.0G (1073741824 bytes) 7. disk size: 196K 8. cluster_size: 65536 9. Format specific information: 10. compat: 1.1 11. lazy refcounts: false
创建qcow2格式磁盘时,可以指定选项,通过-o参数,常用参数主要有:
- backing_file 指定后端镜像文件
- backing_fmt 设置后端镜像的镜像格式
- encryption 设置加密
- cluster_size 设置簇大小,取值在512到2M之间,默认是64K
- preallocation 预分配模式 (allowed values: off, metadata, falloc,full)
(1)off 缺省策略,既不使用预分配策略
(2)metadata 分配元数据,预分配后的虚拟磁盘仍然属于稀疏模式类型磁盘
(3)full 分配所有磁盘空间并置零,预分配后的虚拟磁盘属于厚盘(非稀疏映像类型)
(4)falloc 分配文件的块并标示它们的状态为未初始化,创建速度快
例如:
1. [root@kvmserver ~]# qemu-img create -f qcow2 test3.qcow2 1G -o preallocation=full 2. Formatting 'test3.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 preallocation='full' lazy_refcounts=off 3. [root@kvmserver ~]# qemu-img info test3.qcow2 4. image: test3.qcow2 5. file format: qcow2 6. virtual size: 1.0G (1073741824 bytes) 7. disk size: 1.0G 8. cluster_size: 65536 9. Format specific information: 10. compat: 1.1 11. lazy refcounts: false
后备差异虚拟磁盘
VMware中称之为链接克隆,节省空间。
存储与基础镜像(父)磁盘的变化
- 基础镜像(父)磁盘不会改变
- 差异磁盘隔离变化
- 多个差异磁盘可以使用相同的基础镜像(父)磁盘
优点:标准化基础镜像,节省空间
缺点:增加了开销,较差的性能 (尤其是vmware虚拟机中的试验环境,要等待很久才能启动)
首选,需要拥有一个基础虚拟磁盘,可以通过安装一个全新的虚拟机得到,然后将各种使用的基本软件设置好。
一、创建差异虚拟磁盘
vm01.qcow2是父磁盘文件,vm01_ln.qcow2是链接文件名称。
1. [root@kvmserver ~]# qemu-img create -f qcow2 -o backing_file=/kvm/img/vm01.qcow2 /kvm/img/vm01_ln.qcow2 2. Formatting '/kvm/img/vm01_ln.qcow2', fmt=qcow2 size=8589934592 backing_file='/kvm/img/vm01.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
查看
可以看到我上面没有设置磁盘大小,通过下面查看却定义了8G,而磁盘文件大小只有196K。
1. [root@kvmserver ~]# qemu-img info /kvm/img/vm01_ln.qcow2 2. image: /kvm/img/vm01_ln.qcow2 3. file format: qcow2 4. virtual size: 8.0G (8589934592 bytes) 5. disk size: 196K 6. cluster_size: 65536 7. backing file: /kvm/img/vm01.qcow2 8. Format specific information: 9. compat: 1.1 10. lazy refcounts: false
然后根据差异磁盘创建虚拟机 (强烈建议通过修改配置文件)如果修改配置文件的话,只需要修改主机名,uuid值,及mac地址即可。
下面两种方式都来一遍吧,先修改配置文件。
1. [root@kvmserver ~]# cd /etc/libvirt/qemu/ 2. [root@kvmserver qemu]# ls 3. autostart myvm01.xml myvm02_clong.xml myvm02.xml networks 4. [root@kvmserver qemu]# cp myvm01.xml myvm01_ln1.xml 5. [root@kvmserver qemu]# uuidgen #生成一个随机uuid给虚拟机使用 6. c9274ef3-6b23-4649-badb-b0a726dc1f9a 7. [root@kvmserver qemu]# vim myvm01_ln1.xml 8. #找到下面三列并修改,指定虚拟机的名称、uuid、mac地址 9. <name>vm01</name> 10. <uuid>c9274ef3-6b23-4649-badb-b0a726dc1f9a</uuid> 11. <mac address='52:54:00:58:33:00'/> 12. [root@kvmserver qemu]# virsh list --all 13. Id Name State 14. ---------------------------------------------------- 15. - myvm01 shut off 16. - myvm02 shut off 17. - myvm02_clong shut off 18. 19. [root@kvmserver qemu]# virsh define /etc/libvirt/qemu/myvm01_ln1.xml 20. Domain vm01 defined from /etc/libvirt/qemu/myvm01_ln1.xml 21. 22. [root@kvmserver qemu]# virsh list --all 23. Id Name State 24. ---------------------------------------------------- 25. - myvm01 shut off 26. - myvm02 shut off 27. - myvm02_clong shut off 28. - vm01 shut off
最后可以看到vm01主机已经创建出来了,但是能不能开机,能不能正常使用呢?下面来测试一下,先启动虚拟机,等待开机后尝试连接。
1. [root@kvmserver qemu]# virsh start vm01 2. Domain vm01 started 3. 4. [root@kvmserver qemu]# virsh console vm01 5. myvm01 login: root 6. Password: 7. Last login: Fri Apr 21 17:25:42 on ttyS0 8. [root@myvm01 ~]# ls
经过等待,看来不是白等的,我尝试了一些操作,都没问题。链接克隆完成,下面再来一个安装方式克隆,这个就比较耗时间了,因为需要加载配置文件。
二、先创建一个父磁盘
1. [root@kvmserver ~]# qemu-img create -f qcow2 -o backing_file=/kvm/img/vm01.qcow2 /kvm/img/vm01_ln1.qcow2 2. Formatting '/kvm/img/vm01_ln1.qcow2', fmt=qcow2 size=8589934592 backing_file='/kvm/img/vm01.qcow2' encryption=off cluster_size=65536 lazy_refcounts=off
创建虚拟机文件,等候加载配置文件,加载完毕登录即可。
[root@kvmserver ~]# virt-install --import -n vm02 -r 1024 --disk /kvm/img/vm01_ln1.qcow2 --nographics
来查看一下都有哪些虚拟机吧,在宿主机命令行下执行;vm01是通过修改配置文件得到的克隆机,vm02是通过install得到的克隆机,myvm01和myvm02是正常创建的虚拟机,而myvm02_clong是完整克隆的到的虚拟机。
1. [root@kvmserver ~]# virsh list --all 2. Id Name State 3. ---------------------------------------------------- 4. 14 vm01 running 5. 15 vm02 running 6. - myvm01 shut off 7. - myvm02 shut off 8. - myvm02_clong shut off
总结:两种方式可以使用相同的方式生成多个虚拟机,但是第二种较慢不推荐使用,而第一种只需要修改配置文件,从新定义虚拟机直接登录就可以启动。
磁盘格式转换
语法格式:
convert [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt][-o options] [-s snapshot_name] [-S sparse_size] filename [filename2 [...]]output_filename
例:转换test1.img原格式为raw修改后格式为qcow2。
1. [root@kvmserver ~]# qemu-img info test1.img 2. image: test1.img 3. file format: raw 4. virtual size: 1.0G (1073741824 bytes) 5. disk size: 0 6. [root@kvmserver ~]# qemu-img convert -f raw -O qcow2 test1.img test1.qcow2 7. [root@kvmserver ~]# qemu-img info test1.qcow2 8. image: test1.qcow2 9. file format: qcow2 10. virtual size: 1.0G (1073741824 bytes) 11. disk size: 196K 12. cluster_size: 65536 13. Format specific information: 14. compat: 1.1 15. lazy refcounts: false
调整虚拟磁盘大小
语法格式:
resize [-q] filename [+ | -]size
- 操作之前一定要做好数据备份
- 增加文件大小后,需要在客户机中使用fdisk、parted等分区工具进行相应的操作才能真正让客户机使用到增加后的镜像空间
- 缩小镜像之前,要在客户机中保证里面的文件系统有空余空间,否则会数据丢失。
- qcow2不支持缩小镜像的操作。
1. [root@kvmserver ~]# qemu-img info test1.qcow2 2. image: test1.qcow2 3. file format: qcow2 4. virtual size: 1.0G (1073741824 bytes) 5. disk size: 196K 6. cluster_size: 65536 7. Format specific information: 8. compat: 1.1 9. lazy refcounts: false 10. [root@kvmserver ~]# qemu-img resize test1.qcow2 +1G 11. Image resized. 12. [root@kvmserver ~]# qemu-img info test1.qcow2 13. image: test1.qcow2 14. file format: qcow2 15. virtual size: 2.0G (2147483648 bytes) 16. disk size: 260K 17. cluster_size: 65536 18. Format specific information: 19. compat: 1.1 20. lazy refcounts: false
管理磁盘快照
磁盘快照
- 对磁盘数据进行快照
- 主要用于虚拟机备份等场合
内存快照
- 对虚拟机的内存/设备信息进行保存
- 该机制同时用于休眠恢复、迁移等场景
- 主要使用virsh save(qemu migrate to file)实现,只能对运行的虚拟机进行
检查点快照
- 同时保存虚拟机的磁盘快照和内存快照
- 用于将虚拟机恢复到某个时间点
- 可以保证数据的一致性
快照语法格式
snapshot [-q] [-l | -a snapshot | -c snapshot | -d snapshot] filename
'-a' 切换到某一指定快照点
'-c' 创建一个快照
'-d' 删除一个快照
'-l' 列出指定域的所有快照
创建磁盘快照并查看
1. [root@kvmserver ~]# qemu-img snapshot -c a1 /kvm/img/vm01.qcow2 2. [root@kvmserver ~]# qemu-img snapshot -l /kvm/img/vm01.qcow2 3. Snapshot list: 4. ID TAG VM SIZE DATE VM CLOCK 5. 1 1682069915 260M 2023-04-21 05:38:35 00:13:58.698 6. 2 a1 0 2023-04-21 09:28:08 00:00:00.000
恢复快照
[root@kvmserver ~]# qemu-img snapshot -a a1 /kvm/img/vm01.qcow2
删除快照并查看
1. [root@kvmserver ~]# qemu-img snapshot -d 2 /kvm/img/vm01.qcow2 2. [root@kvmserver ~]# qemu-img snapshot -l /kvm/img/vm01.qcow2 3. Snapshot list: 4. ID TAG VM SIZE DATE VM CLOCK 5. 1 1682069915 260M 2023-04-21 05:38:35 00:13:58.698