导读
1. qemu-kvm disk format
- raw
- qcow2
- tips
2. import raw disk from qemu-kvm to Xen
1. qemu-kvm disk format
在qemu-kvm环境中,raw
和qcow2
格式是最常见的选择。
-
raw
镜像格式是原始镜像格式,直接当作一个块设备给虚拟机使用。在使用qemu-img
创建时指定raw
格式来预先分配磁盘大小,也支持一定程度的扩容。对于ext4
系统,会自动生成稀疏的raw
格式,磁盘占用得到优化 -
qcow2
镜像格式是由cow
,qcow
演进而来的镜像格式,与raw
相比,它占用更少的空间,支持写时拷贝,而且支持快照
稀疏格式:通常创建
raw
格式的磁盘文件时会指定大小,如10G。此时用ls
查看会显示文件为10G,但使用du -s
查看会发现文件并不占用硬盘空间。具有这种特点的文件就是稀疏文件格式
raw
-
raw
格式是所有qemu-kvm支持的镜像格式中IO效率最高的格式,而且与其他格式相比可以认为是“无格式”。这种特点使得raw
格式的虚拟机非常适合从一个虚拟化平台迁移到另一个虚拟化平台,如从qemu-kvm迁移到xen。 -
raw
格式有两个比较大的弊端:一个问题是不支持快照。这个问题可以通过使用LVM来解决
-
另一个问题是
raw
格式通常比较大。如果需要迁移的raw
格式超过10G,此时网络IO以及dd
的时延就比较难以接受,建议考虑其他办法。反之,如果raw
格式分配空间使用率很低时,如分配了40G仅仅使用5G。这时使用raw
来迁移虚拟机就比较合适。注意 因为事先分配给
raw
的空间可能很大,用ls
看起来也很大,但实际上并不占用太多的磁盘空间。正是可以利用这个特性,能让我们尽可能的减少网络IO的延迟。但是,如果使用tar
,scp
等命令传输raw
会导致稀疏格式的空洞被自动填充,直接导致raw
镜像文件过大
qcow2
-
qcow2
是qemu-kvm中主流的一种格式,IO速率比raw
差一点,但是支持快照,而且磁盘占用比较小 -
qcow2
还支持zlib的磁盘压缩,AES的加密等
tips
-
qcow2
格式的虚拟机中如果存在大量的IO,也会导致qcow2
磁盘实际占用空间远比虚拟机磁盘占用空间大的情况。此时可以用dd
将虚拟机内部剩余空间用全0的块文件填满,然后删除该文件,最后用qemu-img convert
重新转换成新的qcow2
文件,此时就会使qcow2
文件大小与实际占用保持一致# -------------虚拟机内部----------------- # 将虚拟机剩余空间用0填满。该操作需要一段时间,长短取决于分配的磁盘大小 $ dd if=/dev/zero of=/tmp/tmpfile # 删除临时文件 $ rm -f /tmp/tmpfile # 关机 $ shutdown -h now # --------------宿主机-------------------- # 根据原有虚拟机镜像文件<qcow2_image>创建一个新的镜像文件<new_image> # 转换之后,就会发现qcow2_image实际大小与虚拟机内部df -h大小相近 $ qemu-img convert -f qcow2 <qcow2_image> <new_image>
-
raw
格式的镜像文件在传输时要特别注意,否则会导致空洞被填满,直接导致文件逼近raw
的原始大小。不管是本地拷贝还是向远程主机传输,对推荐使用rsync
,可以保留raw
的稀疏特性# 将<raw_image>传输到本地<path>或<host>的<path> rsync -av --sparse --progress <raw_image> <host>:<path>
2. import raw disk from qemu-kvm to Xen
首先,想尽一切办法做一个很小的
raw
格式虚拟机。这里需要注意的是,不建议使用qcow2
转raw
,会导致raw
文件的大小直逼虚拟机磁盘大小使用
rsync
将raw
磁盘传输到Xen平台上一个可用的虚拟机中关机,并克隆虚拟机的主硬盘,然后将克隆盘也挂载到虚拟机上
-
重启,修改bootloader,使得虚拟机下一次从第二块盘启动
# 以grub2为例 menuentry '...' ... { # 假设root分区位于第2分区,两块盘卷标分别为xvda和xvdb,则只需做如下修改 # linux /vmlinuz... root=/dev/xvda2 ... linux /vmlinuz... root=/dev/xvdb2 ... initrd initrd... }
-
重启,此时进入第二块盘的系统。然后使用
dd
将raw
的内容拷贝到第一块盘中# 等待一段时间,取决于<raw_image>大小 $ dd if=<raw_image> of=/dev/xvda
拷贝成功之后,简单实验第一块盘的所有分区能否成功挂载。
正确配置第一块盘的bootloader和initrd。主要是因为qemu-kvm平台的块设备文件卷标一般为
vda
或sda
,而Xen平台的块设备清一色都是xvda
-
确保第一块盘中的Linux kernel支持Xen平台的PVHVM,也即
CONFIG_XEN
及相关的内核编译选项已经打开注意
- 利用现有
qcow2
制作raw
镜像时,一个可行的思路是新创建一块raw
磁盘,挂载在原先虚拟机上;然后将原虚拟机磁盘的根目录全盘拷贝到新添加的raw
磁盘中。这种办法几乎可以保证raw
实际占用大小与虚拟机实际使用的空间相近 -
raw
镜像中虚拟机的kernel, initrd和bootloader非常重要,一定要在迁移Xen平台之前做好适配。这几个引起的问题就是开机时出现Kernel Panic
- 利用现有