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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值