KVM 虚拟机的磁盘镜像从存储方式上看,可以分为两种方式,第一种方式为存储于文件系统上,第二种方式为直接使用裸设备。裸设备的使用方式可以是直接使用裸盘,也可以是使用 LVM 的方式。存于文件系统上的镜像有多种格式,如 raw 、 cloop 、 cow 、 qcow 、 qcow2 、vmdk 、 vdi 等,经常使用的是 raw 和 qcow2

qemu支持的磁盘镜像格式

raw : raw 格式是简单的二进制镜像文件,一次性会把分配的磁盘空间占用。 raw 支持稀疏文件特性,稀疏文件特性就是文件系统会把分配的空字节文件记录在元数据中,而不会实际占用磁盘空间。 Linux 常用的 ext4 、 xfs 文件系统都支持稀疏特性, Windows 系统的 ntfs 也支持稀疏特性。所以在 ext4 文件系统上,用 ls 命令和用 du 命令看到的大小是不一样的。使用 ls 命令看到的是分配的大小,使用 du 命令看到的是实际使用的大小。如果希望实际分配和占用的大小一致,我们可以使用 dd 命令创建 raw 的虚拟机镜像文

件。

cloop :压缩的 loop 格式,主要用于可直接引导优盘或者光盘的一种镜像格式

cow :写时复制格式,因为历史兼容性原因还在支持,这种镜像格式不支持 Windows 虚拟机

qcow :第一代的 QEMU 写时复制格式,被 qcow2 替代,因为历史兼容性原因还在支持

qcow2 :第二代的 QEMU 写时复制格式,支持很多特性,如快照、在不支持稀疏特性的文件系统上也支持精简方式、 AES 加密、 zlib 压缩、后备方式

vmdk : VMware 产品的镜像格式

vdi : VirtualBox 的镜像格式

vpc vhd :微软 hyperV 镜像格式

dmg : Mac 磁盘镜像格式

nbd :网络块设备

parallels :半虚拟化镜像格式

1 镜像创建


1.1 创建raw格式


qemu-img create test 50G


1
2
3
4
5
6
7
8
9
du -sh test 
0   test
ls -lh test 
-rw-r--r-- 1 root root 50G Jul  9 15:24 test
qemu-img info test
image: test
file format: raw
virtual size: 50G (53687091200 bytes)
disk size: 0

1.2 创建qcow2格式

qemu-img create -f qcow2 test.qcow2 50G



Formatting 'test.qcow2', fmt=qcow2 size=53687091200 encryption=off cluster_size=65536 
 du -sh test.qcow2 
196K test.qcow2
ls -lh test.qcow2 
-rw-r--r-- 1 root root 194K Jul  9 15:28 test.qcow2

1.3 raw格式转qcow2


qemu-img convert -f raw -O qcow2 -p test test1.qcow2 
    (100.00/100%)



qemu-img info test1.qcow2 
image: test1.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 196K
cluster_size: 65536
ls -lht test*
-rw-r--r-- 1 root root 194K Jul  9 15:31 test1.qcow2
-rw-r--r-- 1 root root 194K Jul  9 15:28 test.qcow2
-rw-r--r-- 1 root root  50G Jul  9 15:24 test

1.4压缩和加密镜像的转换


QEMU 镜像快照

raw 格式不支持快照,只有 qcow2 格式才支持快照,快照使用 qemu-img 的参数 snapshot 管理


qemu-img snapshot test1.qcow2 -c s1
[root@xxx]# qemu-img snapshot test1.qcow2 -l
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         s1                        0 2017-07-09 15:37:01   00:00:00.000
[root@xxx]# qemu-img snapshot test1.qcow2 -c s2
[root@xxx]# qemu-img snapshot test1.qcow2 -l
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         s1                        0 2017-07-09 15:37:01   00:00:00.000
2         s2                        0 2017-07-09 15:37:28   00:00:00.000
[root@xxx]# qemu-img snapshot test1.qcow2 -d s2
[root@xxx]# qemu-img snapshot test1.qcow2 -l
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         s1                        0 2017-07-09 15:37:01   00:00:00.000

-c 创建 

-d 删除

-l 查看

-a 恢复到快照

快照提取 qemu-img convert -f qcow2 -O qcow2 -s s1 test.qcow2 test-s1.qcow2

快照的原理是利用写时复制的机制,所以快照对性能有影响,生产环境建议最多创建一次快照


1.5 镜像一致性检查

qemu-img check  test1.qcow2 
No errors were found on the image.
Image end offset: 393216


1.6 后备镜像差量

后备镜像差量是指多台虚拟机共用一个后备镜像,每个虚拟机根据需要,如果是读操作,读取镜像;如果是写操作,才写入自己的镜像文件,类似快照的 copy on write 机制。后备镜像可以是 raw 和 qcow2 格式,差量镜像只能是 qcow2 格式

后面镜像就是公共读 遇到写写到自己的差量镜像 可以从差量导出完成镜像

qemu-img create -b 指定后备镜像 创建差量镜像

qemu-img create -f qcow2 -b test.qcow2 test_cha.qcow2


qemu-img info test_cha.qcow2
image: test_cha.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 196K
cluster_size: 65536
backing file: test.qcow2


差量转普通

qemu-img convert -f qcow2 -O qcow2 test_cha.qcow2 test_comm.qcow2
[root@xxxt]# qemu-img info test_comm.qcow2
image: test_comm.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 196K
cluster_size: 65536

更换后备镜像

[root@xx]# qemu-img info test_cha.qcow2
image: test_cha.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 196K
cluster_size: 65536
backing file: test.qcow2
[root@xx]# qemu-img rebase -u -b test1.qcow2 test_cha.qcow2
[root@xx]# qemu-img info test_cha.qcow2
image: test_cha.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 196K
cluster_size: 65536
backing file: test1.qcow2

把test_cha.qcow2 的后备镜像换成 test1.qcow2  -u 直接换 不考虑

后备镜像差量生成虚拟机的方式可以快速产生大量的虚拟机,节省磁盘空间,特别适合桌面虚拟化这样的场景。经过测试,对后备镜像的读压力非常小,系统压力主要集中在差量镜像的写压力。使用的时候,为了取得良好效果,应将后备镜像和差量镜像分散到不同的物理硬盘上,并保证镜像的安全性



1.7 镜像大小修改


qemu-img info test_comm.qcow2
image: test_comm.qcow2
file format: qcow2
virtual size: 50G (53687091200 bytes)
disk size: 196K
cluster_size: 65536
[root@xxx]# qemu-img resize test_comm.qcow2 +5G
Image resized.
[root@xxx]# qemu-img info test_comm.qcow2
image: test_comm.qcow2
file format: qcow2
virtual size: 55G (59055800320 bytes)
disk size: 196K
cluster_size: 65536
[root@xxx]# qemu-img resize test_comm.qcow2 60G
Image resized.
[root@xxx]# qemu-img info test_comm.qcow2
image: test_comm.qcow2
file format: qcow2
virtual size: 60G (64424509440 bytes)
disk size: 196K
cluster_size: 65536
[root@xxx]# qemu-img resize test_comm.qcow2 50G
This image format does not support resize
[root@xxx]# qemu-img info test
image: test
file format: raw
virtual size: 50G (53687091200 bytes)
disk size: 0
[root@xxx]# qemu-img resize test 10G
Image resized.
[root@xxx]# qemu-img info test
image: test
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 0


qcow2 格式不支持缩小

注意,镜像缩小的时候,要先将分区和文件系统缩小,否则会造成数据丢失


裸设备使用

裸设备就是虚拟机直接使用 物理设备盘 也可以是lvm 。

建议在生产环境中使用 lvm ,因为 lvm 可以动态地进行调整,可以做快照,管理起来比较方便



KVM 虚拟机镜像管理利器 guestfish

guestfish 套件是镜像管理的   瑞士军刀 

guestfish 是一套虚拟机镜像管理的利器,提供一系列对镜像管理的工具,也提供对外的 API


输出镜像系统信息

virt-inspector  或virt-inspector2 image.qcow2  输出镜像系统信息


列出虚拟机镜像文件分区信息

virt-list-partitions ../xxxxxx.xm

/dev/sda1

/dev/sda2


列出虚拟机镜像文件系统、分区、块设备、 lvm 信息

virt-filesystems -a  ../xxxxxx.xm  -l
Name                    Type       VFS  Label Size         Parent
/dev/sda1               filesystem ext4 -     524288000    -
/dev/vg_templet/lv_root filesystem ext4 -     116912029696 -


 guestfish 操作虚拟机内部文件


虚拟机内部文件管理主要使用以下命令。

·virt-df :镜像磁盘空间使用查看。

·virt-ls :列出指定目录内文件。

·virt-cat :显示指定文件内容。

·virt-edit :编辑指定文件。

·virt-copy-in :将文件复制到虚拟机内部。

·virt-copy-out :将虚拟机内部文件复制出来。

·virt-tar-in : tar 压缩文件复制进虚拟机并解压。

·virt-tar-out :镜像内指定目录文件复制并压缩。

·virt-tar :解压或者上传文件到虚拟机。


virt-df -a ../xxx.xm               df 虚拟机


virt-ls -a ../xxx.xm /root       ls 虚拟机/root


virt-edit ../xxx.xm /root/auto_init_system_info.py     vi编辑虚拟机文件

virt-cat ../xxx.xm /root/auto_init_system_info.py      cat虚拟机文件


virt-tar-in -a disk.img data.tar /destination  压缩文件复制进虚拟机并解压

virt-tar -u domname uploadstuff.tar /tmp  镜像内指定目录文件复制并压缩


touch test.txt 文件复制进镜像及复制出镜像 ,感觉这个可以给虚拟机启动指定ip 覆盖配置文件/etc/sysconfig/network-scripts/ifcfg-eth0, 然后有了ip  加上虚拟机模板自己带个用户  就可以ssh 自动化就开始了 ,可以干任何事情了 

virt-copy-in test.txt -a centos6364.qcow2 /root/

virt-copy-out -a centos6364.qcow2 /root/test.txt /home



-----------------深度实践KVM读书笔记