导读
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
- 利用现有











网友评论