支持的文件格式
qemu支持多种类型的文件系统,而最原生的以及最灵活的是qcow2类型了,这种文件系统支持写时复制,加密,压缩以及VM快照。 除了这种文件系统之外,如下类型也是被支持的:raw ,cloop ,cow,qcow,vmdk ,vdi ,vhdx,vpc 等等,每个版本会有一些差别,具体参考对应的Document文档。
虚拟盘的创建方法
既然qemu支持很多中类型的文件系统,那么我们如何生成一个对应的虚拟盘呢?其实qemu已经自带了工具来完整这个工作,那就是qemu-img工具。
qemu-img命令列表如下:
amend [--object objectdef] [--image-opts] [-p] [-q] [-f fmt] [-t cache] -o options filename
bench [-c count] [-d depth] [-f fmt] [--flush-interval=flush_interval] [-n] [--no-drain] [-o offset] [--pattern=pattern] [-q] [-s buffer_size] [-S step_size] [-t cache] [-w] [-U] filename
check [-q] [--object objectdef] [--image-opts] [-f fmt] [--output=ofmt] [-r [leaks | all]] [-T src_cache] [-U] filename
commit [-q] [--object objectdef] [--image-opts] [-f fmt] [-t cache] [-b base] [-d] [-p] filename
compare [--object objectdef] [--image-opts] [-f fmt] [-F fmt] [-T src_cache] [-p] [-q] [-s] [-U] filename1 filename2
convert [--object objectdef] [--image-opts] [--target-image-opts] [-U] [-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
create [-q] [--object objectdef] [-f fmt] [-b backing_file] [-F backing_fmt] [-u] [-o options] filename [size]
dd [--image-opts] [-U] [-f fmt] [-O output_fmt] [bs=block_size] [count=blocks] [skip=blocks] if=input of=output
info [--object objectdef] [--image-opts] [-f fmt] [--output=ofmt] [--backing-chain] [-U] filename
map [--object objectdef] [--image-opts] [-f fmt] [--output=ofmt] [-U] filename
measure [--output=ofmt] [-O output_fmt] [-o options] [--size N | [--object objectdef] [--image-opts] [-f fmt] [-l snapshot_param] filename]
snapshot [--object objectdef] [--image-opts] [-U] [-q] [-l | -a snapshot | -c snapshot | -d snapshot] filename
rebase [--object objectdef] [--image-opts] [-U] [-q] [-f fmt] [-t cache] [-T src_cache] [-p] [-u] -b backing_file [-F backing_fmt] filename
resize [--object objectdef] [--image-opts] [-q] [--shrink] filename [+ | -]size
比如我们要创建一个qcow2类型3G大小的image,可以采用如下命令:
qemu-img create -f qcow2 test.img 3G
创建raw类型的image,命令如下:
qemu-img create -f raw rawtest.img 3G
采用这种类型的image和dd命令产生的image是一样的
如何修改虚拟盘
按照上面的介绍,我们已经能够创建一个qemu支持的虚拟盘image了,那么如何在不启动qemu的情况下修改我们的虚拟盘呢?这就需要我们首先要在宿主机上挂载对应的虚拟盘,然后在对它进行修改。qemu所支持的文件系统类型都比较特殊,除了raw类型,其他带有文件系统的image很难在linux环境下通过mount直接挂载,但是通过qemu-nbd可以实现这个功能。
通过把其他类型image转换为raw类型的image,然后再挂载raw image:
qemu-img convert -O raw <QEMU imag> <raw img>
sudo mount -o loop <raw image> <mount point>
raw类型虽然可以成功挂载,但是我们却很不好操作其中的数据,因为它只是一个完整的数据块,我们只能通过offset来指定修改其中的数据,无法利用文件系统来检索和修改。使用nbd工具来挂载,就解决了上面的困扰,以qcow2类型image为例:
我们需要先加载nbd driver
sudo modprobe nbd max_part=16
然后利用nbd处理qcow2 image:
sudo qemu-nbd -c /dev/nbd0 test.img
sudo partprobe /dev/nbd0
mount挂载nbd设备:
sudo mkdir /mnt/image
sudo mount /dev/nbd0 /mnt/image
至此,可以修改虚拟盘中的内容了。。。
完成之后,我们还需要做如下的收尾工作:
sudo umount /mnt/image
sudo rmdir /mnt/image
sudo qemu-nbd -d /dev/nbd0
新生成虚拟盘加入到qemu系统
- qcow2格式的镜像文件
qemu-img create -f qcow2 hda.img 128M #创建qcow2虚拟盘
sudo qemu-nbd -c /dev/nbd0 hda.img #映射nbd设备
fdisk /dev/nbd0 #可以省略此步骤,主要看需求是否需要分区
mkfs -t ext2 /dev/nbd0 #格式化该设备
sudo mount /dev/nbd0 /mnt/image #挂载nbd设备
......(work in mnt dir)
sudo umount /mnt/image #卸载nbd设备
sudo qemu-nbd -d /dev/nbd0 #解除nbd映射
- 采用dd命令生成的镜像文件(raw镜像)
dd if=/dev/zero of=~/hda.img bs=1 count=10M
mkfs -t ext2 hda.img
生成ext2的镜像,如果我想要在宿主及更新和修改此image,可以把hda.img以loop设备挂载起来:
losetup /dev/loop0 ~/hda.img #映射loop设备
sudo mount /dev/loop0 /mnt/image #挂载loop设备
......(work in mnt dir)
umount /mnt/image #卸载loop设备
losetup -d /dev/loop0 #解除loop映射
- 使用qemu加载对应的虚拟盘
qemu-system-x86_64 -kernel ./zImage -nographic -initrd ramfs.gz -hda test.img
这样就以一个hda硬盘的方式把虚拟盘加载到系统中了。