JobPlus知识库 IT 网络硬件 文章
UEFI开发与调试---QEMU虚拟盘的创建与修改

支持的文件格式

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硬盘的方式把虚拟盘加载到系统中了。


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
388人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序