基于btrfs的子卷等特性,我们可以轻松实现系统快速恢复、类似与OSX的时间机器等有趣实用的功能。
Btrfs 被称为是下一代 Linux 文件系统,目前btrfs已集成入内核开发主线。
本教程将针对btrfs字卷及压缩进行一些系统功能实现。
安装deepin系统
以下是全新安装deepin系统
分区选择
下载deepin系统按如下图分区方式进行安装
由于grub引导限制,需要设置/boot分区

正常安装过程

安装完成后正常进入系统

已安装deepin系统
如果你已安装deepin系统,想要对你系统上的根分区进行转换,你首先需要使用Live CD启动。
在启动后,打开终端,使用下面的命令来转换文件系统。
btrfs-convert /dev/sda2 #这里假设/dev/sda2 为root分区注意: 假如没有单独的/boot分区,还是需要重新建立一个单独的/boot分区
将deepin系统转移到btrfs子卷
由于目前deepin-installer无法支持直接安装到某个字卷,我们只能通过手动方式进行。
将根分区挂载至某个目录(这里用/mnt),并进入该目录
mount /dev/sda2 /mnt将deepin系统迁移到字卷内部
btrfs subvolume snapshot /mnt /mnt/deepin-1012至此,deepin系统便迁移到字卷内部了。
修改grub.cfg等文件 找到Deepin启动项目那行,在内核参数添加
rootflags=subvolid=xxxxsubvolid=xxxx中xxxx为subvolid值,通过
btrfs subvolume list .可以得到,第二步可以看到deepin-1012字卷的ID为263
如下为grub.cfg的其中一段
menuentry 'Deepin GNU/Linux 8.0 (jessie) GNU/Linux Stable' --class deepin --class gnu-linux --class gnu --class os $menuentryidoption 'gnulinux-simple-9db18def-ad74-4197-8303-ca912a56f316' {
loadvideo
insmod gzio
if [ x$grubplatform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod partmsdos
insmod ext2
set root='hd0,msdos1'
if [ x$featureplatformsearchhint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 6b5865da-87d4-4d0d-8444-0181f759c886
else
search --no-floppy --fs-uuid --set=root 6b5865da-87d4-4d0d-8444-0181f759c886
fi
echo '载入 Linux 4.2.0-1-amd64 ...'
linux /vmlinuz-4.2.0-1-amd64 root=UUID=9db18def-ad74-4197-8303-ca912a56f316 rootflags=subvolid=263 ro splash quiet
echo '载入初始化内存盘...'
initrd /initrd.img-4.2.0-1-amd64
}
由于grub.cfg文件指定了root分区信息,我们也可以注释掉/etc/fstab中根分区挂载条目,否则也需要在挂载参数中添加subvolid字段
重启选择修改后的grub启动项进入系统,能够成功进入系统后,便可以将以前不在字卷中的文件夹及文件删除了。
deepin系统在btrfs字卷的新玩法
这里开始才是这篇教程真正要讲的内容。 以下是一个具体的例子。
假如我们希望开启experimental源安装dde-next新桌面,但是又想保留2015旧版桌面,那我们该如何操作?
- 将根分区挂载至/mnt下
bash mount /dev/sda2 /mnt - 将当前系统快照一份备份
bash btrfs subvolume snapshot deepin-1012 deepin-stable 安装传统方式添加experimental源安装dde-next桌面
这里我们操作完后,就可以通过
btrfs subvolume list.命令得到新字卷ID,然后添加到grub.cfg文件中

这里是grub.cfg文件的一部分
menuentry 'Deepin GNU/Linux 8.0 (jessie) GNU/Linux Stable' --class deepin --class gnu-linux --class gnu --class os $menuentryidoption 'gnulinux-simple-9db18def-ad74-4197-8303-ca912a56f316' { loadvideo insmod gzio if [ x$grubplatform = xxen ]; then insmod xzio; insmod lzopio; fi insmod partmsdos insmod ext2 set root='hd0,msdos1' if [ x$featureplatformsearchhint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 6b5865da-87d4-4d0d-8444-0181f759c886 else search --no-floppy --fs-uuid --set=root 6b5865da-87d4-4d0d-8444-0181f759c886 fi echo '载入 Linux 4.2.0-1-amd64 ...' linux /vmlinuz-4.2.0-1-amd64 root=UUID=9db18def-ad74-4197-8303-ca912a56f316 rootflags=subvolid=269 ro splash quiet echo '载入初始化内存盘...' initrd /initrd.img-4.2.0-1-amd64 } menuentry 'Deepin GNU/Linux 8.0 (jessie) GNU/Linux Experimental' --class deepin --class gnu-linux --class gnu --class os $menuentryidoption 'gnulinux-simple-9db18def-ad74-4197-8303-ca912a56f316' { loadvideo insmod gzio if [ x$grubplatform = xxen ]; then insmod xzio; insmod lzopio; fi insmod partmsdos insmod ext2 set root='hd0,msdos1' if [ x$featureplatformsearchhint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 6b5865da-87d4-4d0d-8444-0181f759c886 else search --no-floppy --fs-uuid --set=root 6b5865da-87d4-4d0d-8444-0181f759c886 fi echo '载入 Linux 4.2.0-1-amd64 ...' linux /vmlinuz-4.2.0-1-amd64 root=UUID=9db18def-ad74-4197-8303-ca912a56f316 rootflags=subvolid=270 ro splash quiet echo '载入初始化内存盘...' initrd /initrd.img-4.2.0-1-amd64 }
以后我们就可以在选择菜单中选择进入dde-next系统,或者stable系统了

一些解释
我们在执行安装experimental之前,将当前系统快照到一个新子卷,就类似相当于将当前系统生成一份备份,由于btrfs文件系统实现快照速度非常快,几秒之内就可以完成。 通过类似的操作,我们可以在需要测试软件、删除测试等非常影响系统情况下,操作后无需担心系统损坏等问题,只需要操作前生成一份快照便可放心安装测试,出现问题也只需要重新启动选择备份快照重新引导进入系统即可。
其他
btrfs也可以设置默认挂载子卷
bash
btrfs subvolume set-default 256 /
这样就无需修改grub.cfg文件添加字卷id参数,也可以默认将id为256的子卷默认挂载。