QCOW2镜像格式是Qemu支持的磁盘镜像格式之一。它可以使用一个文件来表示一个固定大小的块设备。
主要优点是支持压缩,动态扩容!就是你要创建一个2G大小的镜像,放完你自己的文件,压缩完成之后,可能就只有40M!
创建 qcow2 镜像
# qemu-img create -f qcow2 test.qcow2 2G
# qemu-img create -f raw test.img 2G
qcow2 镜像分区
对于 QEMU 经常使用的 qcow2 镜像的分区需要借用到 "network block device" (nbd) driver 和qemu-nbd(qemu-utils)命令来操作。
First, load the nbd kernel modules:
modprobe nbd max_part=12
Now use the commandqemu-nbdto make the disk image available as network block device:
qemu-nbd --connect=/dev/nbd0 test.qcow2
fdisk can be used to list available partitions inside the disk image, and create partitions if you want.
fdisk -l /dev/nbd0
if you want to partiton, 1G+1G two partitions:
cat << END | fdisk /dev/nbd0np1+1Gnp2wEND
格式化
可以使用fdisk 命令看一下 分区后对应的 设备文件名称,执行 fdisk /dev/nbd0 输入p 即可以看到,也可以执行下面的命令来获取:
echo p | fdisk /dev/nbd0 | grep "nbd0" | awk 'NR==2{print $1}'echo p | fdisk /dev/nbd0 | grep "nbd0" | awk 'NR==3{print $1}'
获取的结果分别为 /dev/nbd0p0 /dev/nbd0p1 , 可以用下面的命令格式化分区
mkfs.ext4 -F -L "rootfs" /dev/nbd0p0mkfs.ext4 -F -L "data" /dev/nbd0p1
挂载
可以使用下面的guestmount 和 guestumount来挂载和卸载qcow2的镜像,不过这个需要安装命令。这里不做介绍了。
我们还是使用 nbd的方法来操作。
mount -t ext4 /dev/nbd0p0 tmp1mount -t ext4 /dev/nbd0p1 tmp2umount tmp1 tmp2
操作完成之后,切记要释放 nbd的网络设备
qemu-nbd --disconnect /dev/nbd0
qcow2 镜像的压缩
我们先来看看 qcow2的压缩效率,整整 62.5%!是不是被吓到了
# du * -h -d 142Mc_demo_armhf_rootfs.qcow2112M demo_armhf_rootfs.qcow2
下面两条命令分别是 qcow2压缩 和 raw img 压缩成qcow2
qemu-img convert -c -f qcow2 -O qcow2 source.qcow2 new.qcow2qemu-img convert -c -f raw -O qcow2 source.img new.qcow2
我这里实现了一个简单的创建 qcow2格式的镜像,然后分区,格式化,安装自己的apps的脚本
供大家参考
----------------------------------------------------------
#!/bin/bashQCOW2_IMG=rootfs.qcow2QCOW2_IMG_C=demo_armhf_rootfs.qcow2IMG_SIZE=2GAPPS_PATH=$1if [ "$#" != "1" ];thenecho "usage : $0 APPS_PATH"exit -1fiif [ -f $APPS_PATH/apps.tar.gz ];thenAPPS_FILE=$APPS_PATH/apps.tar.gzelseecho "No such file! [$APPS_PATH/apps.tar.gz] not found"exit -1firm $QCOW2_IMGqemu-nbd --disconnect /dev/nbd0set -xqemu-img create -f qcow2 $QCOW2_IMG $IMG_SIZEmodprobe nbd max_part=12qemu-nbd --connect=/dev/nbd0 $QCOW2_IMG# partitioncat << END | fdisk /dev/nbd0np1+1Gnp2wENDecho p | fdisk /dev/nbd0PT1_DEV=`echo p | fdisk /dev/nbd0 | grep "nbd0" | awk 'NR==2{print $1}'`PT2_DEV=`echo p | fdisk /dev/nbd0 | grep "nbd0" | awk 'NR==3{print $1}'`echo y | mkfs.ext4 $PT1_DEVmkdir -p tmp \&& mount -t ext4 $PT1_DEV tmp \&& cp rootfs/* tmp/ -ad && sync && sync \&& ls tmp && umount tmpecho y | mkfs.ext4 $PT2_DEVmount -t ext4 $PT2_DEV tmp \&& mkdir tmp/sysuser tmp/root -p \&& tar xf $APPS_FILE -C tmp/sysuser \&& mv tmp/sysuser/.project tmp/sysuser/project \&& sync && sync \&& ls tmp && umount tmpqemu-nbd --disconnect /dev/nbd0qemu-img convert -c -O qcow2 $QCOW2_IMG $QCOW2_IMG_Crm $QCOW2_IMG tmp -rfdu -h $QCOW2_IMG_C