qcow2 磁盤鏡像文件的創建、格式化、分區、掛載

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 command qemu-nbd to 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/nbd0
n
p
1

+1G
n
p
2


w
END

 

格式化

可以使用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/nbd0p0
mkfs.ext4 -F -L "data" /dev/nbd0p1

 

掛載 

可以使用下面的guestmount 和 guestumount來掛載和卸載qcow2的鏡像,不過這個需要安裝命令。這裏不做介紹了。

我們還是使用 nbd的方法來操作。

mount -t ext4 /dev/nbd0p0 tmp1
mount -t ext4 /dev/nbd0p1 tmp2

umount tmp1 tmp2

操作完成之後,切記要釋放 nbd的網絡設備

qemu-nbd --disconnect /dev/nbd0

qcow2 鏡像的壓縮

我們先來看看 qcow2的壓縮效率,整整 62.5%!是不是被嚇到了 

# du * -h -d 1
42M     c_demo_armhf_rootfs.qcow2
112M    demo_armhf_rootfs.qcow2

下面兩條命令分別是 qcow2壓縮 和 raw img 壓縮成qcow2 

qemu-img convert -c -f qcow2 -O qcow2 source.qcow2 new.qcow2


qemu-img convert -c -f raw -O qcow2 source.img new.qcow2

 

我這裏實現了一個簡單的創建 qcow2格式的鏡像,然後分區,格式化,安裝自己的apps的腳本

供大家參考

----------------------------------------------------------

 


#!/bin/bash

QCOW2_IMG=rootfs.qcow2
QCOW2_IMG_C=demo_armhf_rootfs.qcow2
IMG_SIZE=2G

APPS_PATH=$1

if [ "$#" != "1" ];then
        echo "usage : $0 APPS_PATH"
        exit -1
fi

if [ -f $APPS_PATH/apps.tar.gz ];then
        APPS_FILE=$APPS_PATH/apps.tar.gz
else
        echo "No such file! [$APPS_PATH/apps.tar.gz] not found"
        exit -1
fi


rm $QCOW2_IMG
qemu-nbd --disconnect /dev/nbd0

set -x
qemu-img create -f qcow2 $QCOW2_IMG $IMG_SIZE

modprobe nbd max_part=12
qemu-nbd --connect=/dev/nbd0 $QCOW2_IMG


# partition
cat << END | fdisk /dev/nbd0
n
p
1

+1G
n
p
2


w
END

echo p | fdisk /dev/nbd0
PT1_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_DEV

mkdir -p tmp \
        && mount -t ext4 $PT1_DEV tmp  \
        && cp rootfs/* tmp/ -ad && sync && sync \
        && ls tmp && umount tmp



echo y | mkfs.ext4 $PT2_DEV

mount -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 tmp

qemu-nbd --disconnect /dev/nbd0

qemu-img convert -c -O qcow2 $QCOW2_IMG $QCOW2_IMG_C
rm $QCOW2_IMG tmp -rf

du -h $QCOW2_IMG_C

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章