利用SquashFS可读写系统快速打造LXC容器

炎炎夏日,陪儿子过暑假~偶尔无线,网速确实坑爹,新系统要做一个虚拟机,因为只是测试应用,当然选择LXC;无奈网速问题,身边笔记本上有之前的VM(CENTOS 6.8)里一个CentOS容器,随想到利用SquashFS做一个可读写系统,然后让LXC接管,直接运行新的虚拟容器。这样也省去了lxc-create到官方仓库去下载系统镜像咯。这次涉及的知识点如下:

除了以上2个核心要点,其他就是dd(块设备)、mke2fs(格式化)的简单使用。下面我附上操作过程,明天还要早起跟儿子出去玩,我也不啰嗦啦。

cd ~/python/vm/lxc-images/
dd if=/dev/zero of=rootfs bs=1M count=1024 #该块设备大小决定最终容器系统大小,我这里就是为了测试所以只给了1G;一般来说得有个3-4G做测试虚拟机也差不多啦.
file rootfs
mke2fs -t ext4 -F rootfs #-F不加等提示确定也可以啦
file rootfs
mount rootfs /mnt -o loop -n
cp -rp /var/lib/lxc/test/rootfs/* /mnt
ls /mnt #确认下拷贝过来的文件列表
umount /mnt
mkdir squashfs && mv rootfs squashfs/
mksquashfs squashfs squashfs.img
file squashfs.img

以上基于squashfs的只读文件系统已经制作完成。下面是可写部分的实现,利用dd命令稀疏模式建立选项建立的空镜像文件作为写入,实现cow(copy on writing)文件。

dd if=/dev/zero of=vm04.img bs=1M count=1 seek=$((1024*1)) #seek用于生产稀疏模式的块文件, 另外跟之前的dd count选项值一致即可,多了也用不了的(lxc虚拟容器大小由只读文件squashfs.img大小决定)。
file vm04.img
losetup -f #查看空闲loop设备,因为我这个系统测试的东西比较多,上面还有docker,所以loop3开始才是空闲
mount squashfs.img /mnt/ -o loop -n
losetup /dev/loop3 /mnt/rootfs
losetup -a
losetup /dev/loop4 vm04.img
losetup -a
echo "0 $(blockdev --getsize /dev/loop3) snapshot /dev/loop3 /dev/loop4 p 8" | dmsetup create vm04.img
mount /dev/mapper/vm04.img /var/lib/lxc/vm04/rootfs/
ls /var/lib/lxc/vm04/rootfs/

可读写的系统已经挂载好,我们稍微设置lxc container配置即可。

cp /var/lib/lxc/test/config /var/lib/lxc/vm04/config
vim !$ #改改rootfs地址、名字和MAC地址,mac地址要改
lxc-start -n vm04

如果你想移除以上设置,可以用以下反向操作:

umount /var/lib/lxc/vm04/rootfs/
dmsetup remove /dev/mapper/vm04.img
losetup -d /dev/loop4
umount /mnt
losetup -d /dev/loop3

或者你重启系统,以上设置就直接移除了。不过,我们只要保留好vm04.img以及squafsh.img就好,下次启动可以直接重复以上部分过程再次载入虚拟容器到LXC。所以,我们可以用个简单的shell脚本来自动完成绑定设备以及mount目录等工作,bash脚本如下:

vim ~/python/vm/lxc-images/vm04_dm.sh
##以下为脚本内容##
#!/bin/bash
### $1 is squashfs.img, $2 is vm04.img #
mount -o loop -n $1 /mnt
losetup1=`losetup -f`
losetup $losetup1 /mnt/*
umount -l /mnt
losetup2=`losetup -f`
losetup $losetup2 $2
size=`blockdev --getsize $losetup1`
echo "0 $size snapshot $losetup1 $losetup2 p 8" | dmsetup create $2
##脚本结束##
chmod +x !$

重启后,我们直接用脚本载入虚拟容器即可。

init 6
cd ~/python/vm/lxc-images/
./vm04_dm.sh squashfs.img vm04.img
mount /dev/mapper/vm04.img /var/lib/lxc/vm04/rootfs #这里是之前配置文件中指定的rootfs路径
lxc-start -d -n vm04 #-d选项是后台启动
lxc-info -n vm04

参考文章:
http://fengyuzaitu.blog.51cto.com/5218690/1570803
http://www.ibm.com/developerworks/cn/linux/1306_qinzl_squashfs/
http://unix.stackexchange.com/questions/98742/how-to-add-more-dev-loop-devices-on-fedora-19(手动创建更多的循环设备,ibm文章中有使用到,但是没说明)