[Share Experiences] 使用 btrfs 全盘安装 deepin Resolved
Tofloor
poster avatar
忘记、过去
Moderator
2024-01-05 20:38
Author

使用 btrfs 全盘安装 deepin

声明

  • 本教程仅起到引导作用,在虚拟机中使用手动分区方式安装 deepin 系统并进行后续操作演示。全盘安装时挂载方式有亿点复杂,不太想写教程......建议玩儿明白了之后自行研究。
  • 实际操作前,需要对目录结构足够熟悉(相对路径/绝对路径,挂载点等概念),意识足够清醒(别犯困),不然失败概率很高,大概率会启动到 grub shell 界面。建议先找个虚拟机练练手,并且在物理机实操前做好备份,准备好 LiveCD 进行急救。
  • 教程中存在部分修改不完全的地方(如 hdX,gptY 分区号,insmod btrfs 操作没有进行修改等)。这得感谢 grub 的开发大佬们,只要分区 UUID 正确,仍然可以通过 UUID 匹配搜索到正确的分区进行引导,可以减少很多修改量。(不过强迫症患者还是建议都修改完全比较好......)
  • 本教程中多数命令与文件修改,均需要 root 权限。建议直接切换到 root 用户下执行。(除非你知道自己在做什么,否则三思而后行)

前置步骤

  • 使用手动分区方式安装 deepin,单独划分 /boot/efi 引导分区后,可以先在磁盘末尾添加分区并设置挂载点为 /boot(大小保持默认即可),然后再将中间未分配空间部分建立分区并设置挂载点为 /(根目录)。

    01-手动安装分区.png

    P.S. 其实有点标题党,为了照顾多系统,再怎么说,EFI 分区也肯定是祖传的 FAT32 格式,不算是“全盘” btrfs ......

迁移 /boot 数据

  1. 系统安装完成后,进入系统,在终端中执行 lsblkblkid 命令,观察分区挂载状态。记录下根目录所在的磁盘分区设备号,截图中为 /dev/sda3

    02-分区挂载状态_1.png

    P.S. 建议同步记录下各个分区对应设备块的 UUID,方便后续查找

  2. 接下来开始迁移 /boot 分区中的文件到 / 根目录中的 boot 文件夹。

    1. 终端执行下列命令,将根目录单独挂载到 /mnt/roota 文件夹下

      mkdir -p /mnt/roota
      mount /dev/sda3 /mnt/roota
      
      # 检查挂载是否正常
      ls -al /mnt/roota
      

      03-单独挂载根目录.png

    2. 使用 rsync 命令将 /boot 下内容复制到根目录 boot 文件夹下

      rsync -avR /boot /mnt/roota/
      
      # 检查内容拷贝是否完整
      ls -al /mnt/roota/boot
      ls -al /boot
      

      04-拷贝 boot 分区内容至根目录下.png

      05-检查 boot 分区拷贝结果.png

    3. 修改 /etc/fstab 文件,取消 /boot 单独挂载,截图中 /boot 原始分区设备号为 /dev/sda2,注释该行即可。

      06-修改 fstab.png

手动修改 grub 引导文件

  • 这一部分操作很重要,别动不需要修改的地方!
  1. 执行 blkid 命令获取根目录分区 UUID

    07-获取根目录分区 UUID.png

  2. 修改 EFI 引导分区中的 grub.cfg

    • 一般而言,文件路径为 /boot/efi/EFI/boot/grub.cfg/boot/efi/EFI/deepin/grub.cfg
    1. 替换原本 /boot 分区的 UUID 为现在 / 根目录的 UUID

    2. 修改 prefix,将 /grub 修改为 /boot/grub

      08-修改 grub 配置文件.png

      P.S. 一般引导分区中存在多个文件夹都包含 grub.cfg(如 bootdeepinUOS 等,旧版本中可能还有 ubuntu),需要统一修改。(避免部分不支持自定义 UEFI 启动项的旧机型,只支持 boot 文件夹中的 bootx64.efi 进行启动。)

      P.S. grub.cfg 文件可以认为用来寻找 /boot 分区。由于将 /boot 分区内容合入 / 根目录,需要修改 UUID(最好把后面的 hdX,gptY 分区号一起改了)。同时,由于 boot 文件夹在根目录中,层级多了一层,故 prefix$(root) 也会相对于根目录而言多一层。

  3. 手动修改 /mnt/roota/boot/grub/grub.cfg

    • 不是直接修改 /boot/grub/grub.cfg !!!因为这个时候还没重启过,目前看到的 /boot 文件夹还在单独的分区上。我们需要修改的是根目录中那份 boot 文件夹(当然,理论上做到这一步可以先重启一次,先前的操作已经把引导文件指向了根目录里的那份复制品,重启后的 /boot 分区就已经是在根目录中了。这时直接修改 /boot/grub/grub.cfg 就行。不过没有仔细测试,就不推荐了......)

    • 虽然文件开头就说明禁止手动修改,不过没想到啥好办法,先改完能启动再说......

    • (建议使用文本编辑器)搜索 /boot 分区的 UUID,应该共计 4 块地方需要修改,参考下列截图,统一修改替换为 / 根目录的 UUID,并修改涉及到的相对路径

      09-搜索 boot 分区 UUID.png

      10-修改原始 boot 分区信息为根目录分区_1.png

      10-修改原始 boot 分区信息为根目录分区_2.png

      10-修改原始 boot 分区信息为根目录分区_3.png

      10-修改原始 boot 分区信息为根目录分区_4.png

    P.S. 和前面一样,建议把涉及到的 hdX,gptY 一起修改正确;同时,还涉及到分区文件系统不同,insmod 加载的驱动也应该不同......不过问题不大,grub.cfg 文件前面一部分已经做过加载驱动的工作了,后面不改实测也能启动......

梭哈

  • 别问,问就是相信自己没改错,保存完了直接重启一把梭......如果有幸能正常启动,那么进入桌面后,再次执行 lsblkblkid 命令,观察分区挂载状态,是不是真的摆脱了原本的 /boot 分区,只有根目录被挂载了。

    11-分区挂载状态_2.png

收尾

  • 如果成功了,那么剩下的事情就是把原有的 /boot 分区从磁盘末尾删掉,把空间还给根目录就行了。这就是为啥建议把 /boot 放在最后,分区向后扩容,不改变起点的话,一般分区 UUID 不会改变,可以省很多麻烦。这里就不展开了,毕竟系统运行期间应该没法给自己扩容,还是得进 LiveCD,用 gparted 之类的工具直接干就行了。
  • 记得再执行一次 sudo update-grub,实测可以自动帮你修改 grub.cfg 文件中错误的文件系统类型,分区号等信息,一劳永逸。(也就是说,基本上只要保证 UUID 和相对路径正确就没啥问题了,剩下的交给 update-grub 就行)

题外话

  • UOS 用户想这么玩儿?也行,但是默认的 4.19 内核和 btrfs 配合的不是很好......会在服务启动阶段报文件系统只读错误,然后无法启动。可以手动修改 grub.cfg,将所有 ro 只读挂载改为 rw 读写挂载后,可以正常启动,就是不知道有啥影响......建议升级下内核到 5.10 及以上就没事了。

  • 想用 timeshift + btrfs 实现快照备份还原?论坛直接搜索 btrfs 关键词,已经有很多大佬有成熟的子卷设置和迁移教程了,参考 @neko@AMZ 的帖子可以试试。(neko 大佬最早在知乎还有一篇更详细的教程来着,找不着了......)

Reply Favorite View the author
All Replies
忘记、过去
Moderator
2024-01-05 20:40
#1

@BlackCat @fslong 实操过程在此,/boot 分区是可以被干掉,一起被扔进 btrfs 的

Reply View the author
TSAC
deepin
2024-01-05 20:48
#2

thanks

我仔细研究一下,多谢

Reply View the author
fslong
deepin beta test group
2024-01-05 20:58
#3
  1. 直接全盘装成ext4
  2. 然后备份根到移动硬盘的另一个分区
  3. 再用gparted删除根然后格式化根成btrfs
  4. 再把备份复制回去
  5. 改一下grub.cfg里面uuid
  6. 重启,update-grub

这样备份还原虽然花的时间多,但改的文件少,另外因为根是gparted分出来的,你会发现新大陆。

Reply View the author
忘记、过去
Moderator
2024-01-05 21:06
#4
fslong
  1. 直接全盘装成ext4
  2. 然后备份根到移动硬盘的另一个分区
  3. 再用gparted删除根然后格式化根成btrfs
  4. 再把备份复制回去
  5. 改一下grub.cfg里面uuid
  6. 重启,update-grub

这样备份还原虽然花的时间多,但改的文件少,另外因为根是gparted分出来的,你会发现新大陆。

joy 巧了,咱自己的机器基本就这么玩儿的。

找了个空硬盘直接 ext4 一根到底,然后建个 btrfs 和需要的子卷,一点一点 rsync 搬过去......这样子 grub.cfg 改动最少,无脑替换 UUID 和 insmod 就够了。


话说 gparted 的新大陆是啥......只知道设置卷标,调整大小挺方便的

Reply View the author
fslong
deepin beta test group
2024-01-05 21:09
#5
忘记、过去

joy 巧了,咱自己的机器基本就这么玩儿的。

找了个空硬盘直接 ext4 一根到底,然后建个 btrfs 和需要的子卷,一点一点 rsync 搬过去......这样子 grub.cfg 改动最少,无脑替换 UUID 和 insmod 就够了。


话说 gparted 的新大陆是啥......只知道设置卷标,调整大小挺方便的

我从未没见过如此流畅的dde,甚至连自己写的Python脚本都执行速度快很多,我表示很不李姐。

Reply View the author
Ziggy
deepin
2024-01-05 21:21
#6

boot如果用btrfs建议还是跟着系统走tail

上次演示的时候单独分了boot,升级了内核有新文件,只回退系统没回退boot就崩了哈哈

btrfs不如用snapper划算,timeshift还得按他的目录结构来而且总感觉不太安全

Reply View the author
忘记、过去
Moderator
2024-01-05 21:40
#7
Ziggy

boot如果用btrfs建议还是跟着系统走tail

上次演示的时候单独分了boot,升级了内核有新文件,只回退系统没回退boot就崩了哈哈

btrfs不如用snapper划算,timeshift还得按他的目录结构来而且总感觉不太安全

shocked 懂了,这就把 boot 子卷删了塞回 @ 子卷里面一起备份......

看样子单独留出 persistent 当数据盘处理也够用了

Reply View the author
豆浆包子
deepin
2024-01-05 21:59
#8
fslong

我从未没见过如此流畅的dde,甚至连自己写的Python脚本都执行速度快很多,我表示很不李姐。

官方为什么不直接支持?

Reply View the author
fslong
deepin beta test group
2024-01-05 22:01
#9
豆浆包子

官方为什么不直接支持?

安装器的锅,后续修复了就好了。

Reply View the author
神末shenmo
Moderator
Spark-App
2024-01-06 01:32
#10
忘记、过去

joy 巧了,咱自己的机器基本就这么玩儿的。

找了个空硬盘直接 ext4 一根到底,然后建个 btrfs 和需要的子卷,一点一点 rsync 搬过去......这样子 grub.cfg 改动最少,无脑替换 UUID 和 insmod 就够了。


话说 gparted 的新大陆是啥......只知道设置卷标,调整大小挺方便的

deepin安装器分出来的区速度比gparted分出来的慢很多

https://bbs.deepin.org/phone/post/266491

Reply View the author
豆浆包子
deepin
2024-01-06 05:18
#11
fslong

安装器的锅,后续修复了就好了。

擦。让我这么慢用了这么久?原有系统怎么办?

Reply View the author
jjcui8595
Moderator
2024-01-06 16:58
#12

学习了

Reply View the author
mozixun
Moderator
2024-01-06 19:45
#13
Ziggy

boot如果用btrfs建议还是跟着系统走tail

上次演示的时候单独分了boot,升级了内核有新文件,只回退系统没回退boot就崩了哈哈

btrfs不如用snapper划算,timeshift还得按他的目录结构来而且总感觉不太安全

大佬,以后deepin会完全支持btrfs嘛

Reply View the author