为了修改qcow2格式的虚拟机镜像,需要编译nbd内核模块,因为CentOS发行版通常都不会编译这个模块,因此需要自己编译。

安装编译软件和编译所需的软件包

1
$ yum install kernel-devel kernel-headers make gcc

下载和安装源码包

1
2
$ wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/7ComputeNode/en/os/SRPMS/kernel-3.10.0-327.el7.src.rpm
$ rpm -ivh kernel-3.10.0-327.el7.src.rpm

解压源码包

1
2
3
4
5
$ cd ~/rpmbuild/SOURCES
$ tar Jxf linux-3.10.0-327.el7.tar.xz -C /usr/src/kernels/
$ cd /usr/src/kernels
$ mv $(uname -r) $(uname -r)-old
$ mv linux-3.10.0-327.el7 $(uname -r)

编译nbd内核模块

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ cd $(uname -r)
$ make mrproper
$ cp ../$(uname -r)-old/Module.symvers ./
$ cp /boot/config-$(uname -r) ./.config
$ make oldconfig
$ make prepare
$ make scripts
$ make CONFIG_BLK_DEV_NBD=m M=drivers/block
$ cp drivers/block/nbd.ko /lib/modules/$(uname -r)/kernel/drivers/block/
$ depmod -a

加载内核模块

执行下面的命令,加载nbd内核模块:

1
$ modprobe nbd max_part=6

执行完成后,/dev目录下应该会多出一些nbd开头的设备。

1
2
3
$ ls /dev/nbd*
/dev/nbd0  /dev/nbd2  /dev/nbd4
/dev/nbd1  /dev/nbd3  /dev/nbd5

修改qcow2镜像

加载好nbd模块之后,就可以将qcow2镜像和nbd块设备关联起来。关联起来之后,qcow2文件中有几个分区就好多出几个nbd块设备,这些块设备可以直接挂载到某个目录,然后就可以修改qcow2镜像了。示例如下:

1
2
3
4
$ qemu-nbd --connect=/dev/nbd0 /full/path/to/qcow2
$ ls /dev/nbd0p*
/dev/nbd0p1
$ mount /dev/nbd0p1 /mnt

修改完成之后,卸载目录,取消关联即可。

1
2
$ umount /mnt
$ qemu-nbd --disconnect /dev/nbd0