[Share Experiences] 将uos/deepin运行在btrfs文件系统,并启用快照功能
Tofloor
poster avatar
Amz
deepin
2021-03-16 04:40
Author

前言:由于deepin不知道是因为什么原因安装器并未提供安装到btrfs的选项,同时还在系统里屏蔽了btrfs,导致无法使用

准备U盘+deepin.iso镜像,启动live后联网安装gparted磁盘工具,gedit这类文本编辑器,本文使用深度编辑器dedit命令可能会变。这样后面处理起来会方便一些。

注意,下面这个方法为了使用深度自己的内核,也为了操作上不使用过多的命令,我是先安装到ext4再到U盘live系统里倒腾,(注意如果后续版本deepin放开了btrfs,就跳过1、2、3两步)具体看步骤

1、将系统安装到ext4,建议硬盘只分4个区,efi、swap、一个空的btrfs分区只格式化不做挂载和根目录 / ,也就是这个系统文件只有一个根分区里因为btrfs可以用子卷来充当更多的挂载点,而且这样一个大分区容量不会被一堵墙隔离,共享容量,还有一点这么做的目的最终根目录的文件都会转移到btrfs里面,根目录所做的sda4会被删除,如果顺序乱了,最终可能sda1  sda2  sda4这种局面,虽然有方法调整过来命名,但是后面还要修复引导这些,因此这一步不要去增添麻烦。装好后启动系统。

2、现在咱们做一个操作,编辑这个文件,打开终端输入,回车:

sudo dedit /usr/share/initramfs-tools/init

注意使用深度文本编辑器替换里面的  ,btrfs  说白了就是删除,但使用替换可以精准替换成空,这样这个屏蔽项目就被删除了,保存退出。

3、执行

sudo update-initramfs -u  

这一步必须做,不然内核并没有真的可以运行在btrfs。执行完毕后这套系统就可以跑在btrfs了。

4、接下来建议使用刚才装系统用的deepin 的iso镜像用u盘启动到安装界面,此时按下ctrl+Fn+alt+F2(台式机之类ctrl+alt+F2)进入tty2,然后输入startx回车,等待进去live系统,如未启动再执行一次,再执行一次发现加载到live系统了。

btrfs组件深度自带不需要安装,但是如果你不了解你的磁盘,这里建议可以联网安装一个gparted  图形化操作。精准不出意外

sudo apt update && sudo apt install gparted

5、接下来我们处理一下sda3分区,首先将这sda3和sda4同时挂载,并在sda3即btrfs所在分区创建子卷

sudo mount /dev/sda4 /mnt/a   #也就是把装有deepin的sda4分区挂载到live系统/mnt/a下
sudo mount /dev/sda3 /mnt/b   #也就是把btrfs的sda3分区挂载到live系统/mnt/b下

btrfs想要使用快照必须使用子卷功能,在最外层的大btrfs父卷是不可以直接快照的,若不使用子卷就安装系统与平常文件系统也就相差无异了

sudo btrfs subvolume create /mnt/b/@ #创建一个名字为@的子卷,后续用来存放根目录
sudo btrfs subvolume create /mnt/b/@home #创建一个名字为@home的子卷,后续用来挂载home

6、接下来该做的就是把安装有系统的第四分区文件同步到第三分区里

sudo rsync -avr 源目录(/dev/sda4)目标目录(/dev/sda3),注意这是示意,往后看。

sudo rsync -avr /mnt/a/* /mnt/b/@/    #这里将sda4目录下所有文件复制到sda3分区的@目录里
sudo rsync -avr /mnt/a/home/* /mnt/b/@home/  #这里将sda4目录下的home目录里的文件复制到sda3分区下的@home目录中
sudo rm -rf /mnt/b/@/home/*  #这里把第一条刚刚根目录中多余复制的home中的文件删除了,因为她在@home里已经另有一份。

至此相应的文件就都倒腾到了sda3里面的两个子卷里,子卷看起来就是个文件夹目录,在5.0以上内核可以当个文件夹直接删除,而不用

sudo btrfs subvolume delete /mnt/b/@  这样去处理。

7、接下来我们要修改几个文件,/boot/grub/grub.cfg、/etc/fstab以及EFI目录里所有的grub.cfg

 

sudo dedit /mnt/b/@/boot/grub/grub.cfg

第一步:使用blkid命令查看新的sda3的uuid,复制替换grub.cfg文本中的uuid。

第二步:我们在内核参数后面加上一个参数告诉内核根目录在哪个子卷里 即rootflags=subvol=@,也可以使用rootflags=subvolid=257  两种表述意义一样257是子卷的id号通过sudo btrfs subvolume list /mnt/b/命令查看

方法还是替换最好搜索splash 替换为rootflags=subvol=@ splash  因为splash这个参数只要是deepin肯定有,替换的时候不至于格式错误。

第三步:如下图所示,逐行将写有路径的地方,找到这些路径前面加上它的新的真实路径,因为这些路径在第三方系统读取起来仅仅是一个分区下的@、 home两个文件夹。下图之前的路径是  /usr/share/grub/unicode.pf2现在我们将其改为/@/usr/share/grub/unicode.pf2

图示中的uos是我之前用过的子卷,目前我在用Ubuntu类型的子卷方案即 @ 、@home,因为timeshift这个软件支持btrfs且只支持Ubuntu这个子卷方案,我使用它来管理快照,因此作为对比,大家将有更深的理解。

第四步:将文件中带有ext字样的地方修改为btrfs,同样使用替换功能来做。

其余保持不变保存即可。

接下来我们修改EFI目录里的参数,随便找个地方挂一下,/mnt再新建个c文件夹吧 

sudo mount /dev/sda1 /mnt/c
#下面我将uos和deepin可能出现的文件夹全部列出了,有哪个改哪个
sudo dedit /mnt/c/EFI/ubuntu/grub.cfg
sudo dedit /mnt/c/EFI/deepin/grub.cfg
sudo dedit /mnt/c/EFI/uniontech/grub.cfg
sudo dedit /mnt/c/EFI/boot/grub.cfg
sudo dedit /mnt/c/EFI/UOS/grub.cfg

grub.cfg文件里面内容修改uuid值修改为现在的,路径加上@,如下所示,同样之前我根目录所作子卷为uos现在大家将其替换为@。

search.fs_uuid d7d81d36-6cf3-400a-bf9b-6f48c6919b05 root hd0,gpt3 

set prefix=($root)'/uos/boot/grub'

configfile $prefix/grub.cfg

接下来最后一步,也就是fstab的写法,位于/mnt/b/@/etc/fstab 直接贴出来

UUID=d7d81d36-6cf3-400a-bf9b-6f48c6919b05	/	btrfs 	subvolid=257,ssd,rw,relatime	0	1

UUID=d7d81d36-6cf3-400a-bf9b-6f48c6919b05	/home	btrfs	    subvolid=258,ssd,rw,relatime	0	2

UUID=7C33-3E9A	/boot/efi	vfat	rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro	0	2

UUID=631ad277-8410-4edb-8466-a9a1da1b01ab	 none	 swap	defaults,pri=-2	0	0

解读一下,uuid值因为在一个大分区里,所以根和home用一样的。然后用subvol=@这个参数告诉具体在哪个子卷里,这里也可以采用前面提到的subvolid=257,id查看前面已经说了,两者等价,用id的好处是当子卷名称变化后不影响其系统引导和启动,用子卷名称的好处是以后系统挂了我直接找一个之前的快照改一下名称为@系统就等于活了。如果是ssd可以加上ssd这个参数,其实btrfs早已默认优化ssd不必添加,如果想启用透明压缩可以加入compress=zlib 或者 compress=zstd 采用的压缩工具不同而已,启用后似乎有些问题大家自行测试,透明压缩的加入其实是减小了磁盘读取数据的量,受内核控制,它在内存已经完成,写入硬盘的数据减小,这样磁盘寿命也会相对提升。

在blkid确认一下其他分区的uuid对不对,只有细致才能一次性重启到系统,而不是grub黑屏或者initramfs黑屏,再重新回到live多折腾。

8、至此就做好了deepin运行在btrfs子卷的系统就调整完成了,看看怎么创建快照吧!

sudo btrfs subvolume snapshot /mnt/subvolume /mnt/snapshotsubvolume

再次提示timeshift的btrfs模式需要Ubuntu类型的@,@home

8、重新启动到系统,进入系统后执行一次sudo update-grub 以更新引导确保万无一失,其次还记得刚刚的sda4分区吗?他现在没用了,进入正式系统后安装gparted删除sda4将空闲空间分配给sda3即可,之所以这一步放到现在,是为了减少前述步奏出错的概率,在正式系统下使用gparted调整分区的uuid不会变,进而更加安全。

Reply Favorite View the author
All Replies
铁山老道孔乙己
deepin
2021-03-16 05:44
#1

描述的很混乱,没太明白

Reply View the author
Amz
deepin
2021-03-16 18:04
#2
铁山老道孔乙己

描述的很混乱,没太明白

写的有点急,稍微有点乱,可是照着做还是可以懂的

Reply View the author
铁山老道孔乙己
deepin
2021-03-18 17:33
#3

我以前也尝试使用btrfs文件系统,没有成功。这是我原来的帖子:

https://bbs.deepin.org/zh/post/213048

看了你的文章,发现主要原因是没有修改 /usr/share/initramfs-tools/init 文件,并重新生成启动内核。

按照这个提示,重新修改内核生成配置文件,并重新生成启动内核,启动成功。

 

另:如果系统内核升级,会不会造成再次无法启动?我好担心啊!

Reply View the author
Amz
deepin
2021-03-18 21:20
#4
铁山老道孔乙己

我以前也尝试使用btrfs文件系统,没有成功。这是我原来的帖子:

https://bbs.deepin.org/zh/post/213048

看了你的文章,发现主要原因是没有修改 /usr/share/initramfs-tools/init 文件,并重新生成启动内核。

按照这个提示,重新修改内核生成配置文件,并重新生成启动内核,启动成功。

 

另:如果系统内核升级,会不会造成再次无法启动?我好担心啊!

不会,这个事本质上不是内核屏蔽的,而且说白了要是只在btrfs上装可简单呢,做好取消屏蔽这个事,只需要使用无损转换命令即可完成ext4到btrfs的转变,但是要想使用快照就得把系统放到子卷里,这是我文章复杂的地方!

Reply View the author
Amz
deepin
2021-03-18 21:25
#5
铁山老道孔乙己

我以前也尝试使用btrfs文件系统,没有成功。这是我原来的帖子:

https://bbs.deepin.org/zh/post/213048

看了你的文章,发现主要原因是没有修改 /usr/share/initramfs-tools/init 文件,并重新生成启动内核。

按照这个提示,重新修改内核生成配置文件,并重新生成启动内核,启动成功。

 

另:如果系统内核升级,会不会造成再次无法启动?我好担心啊!

我之所以使用rsync倒腾文件,主要是为了安全,别一个命令没转好变成有损就尴尬了!

Reply View the author
二十六画生
deepin
2021-04-10 08:33
#6

我的做法是先把 Debian 安装到 BTRFS 子卷中,然后进入 Debian,安装 QEMU 或 VirtualBox 虚拟机,然后把 Deepin Linux 安装虚拟机中,然后创建 Deepin Linux 子卷(rootfs),挂载Deepin Linux 子卷(rootfs)和虚拟磁盘后,使用 rsync 工具同步到  Deepin Linux 子卷(rootfs)中,然后修改 fstab,chroot 到 Deepin Linux 子卷(rootfs),安装 dracut(会自动替换 initramfs-tools),然后 update-grub,这个方法是可行的。

 

你这个方法改天折腾一下,看来是要替换掉 `/usr/share/initramfs-tools/init`  中的 btrfs 设置。

Reply View the author
二十六画生
deepin
2021-04-12 06:20
#7

今天尝试你的方案没有成功,/usr/share/initramfs-tools/init 配置文件中没有看到有关 btrfs 的配置,无需替换,最后我手动 GRUB SHELL 进入系统后,通过 update-grub 和 grub-install 工具修复引导。

在 chroot 模式下,无法执行 update-grub 和 grub-install ,出现奇怪的错误,在 debian 中百试不爽的方法,在 deepin 中失败。

Reply View the author
Amz
deepin
2021-05-01 04:34
#8
二十六画生

今天尝试你的方案没有成功,/usr/share/initramfs-tools/init 配置文件中没有看到有关 btrfs 的配置,无需替换,最后我手动 GRUB SHELL 进入系统后,通过 update-grub 和 grub-install 工具修复引导。

在 chroot 模式下,无法执行 update-grub 和 grub-install ,出现奇怪的错误,在 debian 中百试不爽的方法,在 deepin 中失败。

有,你好好看

Reply View the author
辉夜
deepin
2022-11-27 02:46
#9

本文修改过,更适合小白了

所以我来顶一下joy

Reply View the author