把 Deepin Linux 迁移到 btrfs 文件系统上

在前面的日记中,我介绍了 Linux LVM 在磁盘管理和快照备份的功能,听网友推荐另一款折腾系统的先进的 btrfs 文件系统。今天就介绍一下怎么把已经安装在 ext4 文件系统上的 Deepin 20.2.4 Linux 迁移到 btrfs 文件系统上。主要是根据 Debian 官方维基文档上的一篇文章的方法(Btrfs migration: https://wiki.debian.org/Btrfs%20migration),采用的是分出一个分区新安装一个临时的操作系统进行辅助迁移。下面就在 VirtualBox 虚拟机中进行演示。

一、虚拟机测试系统部署
1、需要迁移的主系统分区布局:
/dev/sda1 300M, efi 分区, /boot/efi
/dev/sda2 1.5G, boot 分区, /boot
/dev/sda3 4G, swap 分区
/dev/sda4 15G ,根分区,/

2、第二个辅助迁移系统仍是deepin
与第一个系统共享 efi 分区,挂载在 /boot/efi
/dev/sda5 15G ,根分区,/

3、两个系统均需要启用 buster-backports 源更新 btrfs-progs 包为 5.10.1 版本,这个版本才有btrfs-convert 命令
在 /etc/apt/sources.list 中添加:
deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
升级安装 btrfs-progs:
sudo apt -t buster-backports install btrfs-progs
然后注释掉新加的这行。
安装 grub-efi
sudo apt install grub-efi

4、取消文件管理器中的自动挂载分区功能

二、测试步骤
1、启动第一个系统,转换第二个系统为 btrfs
sudo fsck.ext4 -f /dev/sda5
sudo btrfs-convert /dev/sda5

2、更新第二个系统的 fstab 和 grub.cfg 以使用 btrfs 的根文件系统
把第二个系统 fstab 中UUID换成 btrfs 新的, ext4 换成 btrfs,相应的 mount 选项换成 defaults。
把第二个系统里 grub.cfg 启动第二系统的项中的 insmod ext2 换成 insmod btrfs,root 的UUID换成 btrfs 新的

 sudo sed -i '/insmod ext2/a insmod btrfs' /path/to/grub.cfg(当要在 grub 中访问相应分区的文件才加载分区的mod,为简便操作,在 insmod ext2 下行插入insmod btrfs,加多一个mod 也不影响,在运行的系统中 update-grub2 会自动去除不必要的mod)
 sudo sed -i 's/第2系统分区原uuid/第2系统新btrfs分区uuid/g' /path/to/grub.cfg

3、在第一个系统中更新 grub
sudo update-grub2
未知原因(Debian 11好像没这个问题),上述命令不能更新 /boot/efi/EFI/*/grub.cfg 新的 btrfs 的 UUID,导致不能进入系统,使用如下命令更新:

先切换到 root 用户 sudo -s
 执行命令 find /boot/efi/EFI -name grub.cfg | xargs sed -i 's/第2系统分区原uuid/第2系统新btrfs分区uuid/'
 就行了。

如果重启进入第二个系统中不能成功启动,进入了 grub-rescue 环境
grub-rescue:
https://linoxide.com/grub-rescue-commands/
set root=(hd0,gpt5)
linux (hd0,gpt5)/boot/vmlinuz-* root=/dev/sda5
set prefix=(hd0,gpt5)/boot/grub
insmod btrfs
initrd (hd0,gpt5)/boot/initrd.img-*
boot
上面*代表文件名省略的部分,按 TAB 键会补全。

4、启动第二个系统,转换第一个系统 /分区为 btrfs
sudo fsck.ext4 -f /dev/sda4
sudo btrfs-convert /dev/sda4

5、在第二系统中更新第一个系统的 fstab 和 grub.cfg 以使用 btrfs 的根文件系统
把第一个系统 fstab 中UUID换成 btrfs 新的, ext4 换成 btrfs,相应的 mount 选项换成 defaults。
把第一个系统里 grub.cfg 启动第一系统的项中 root 的UUID换成 btrfs 新的UUID

sudo sed -i 's/第1系统分区原uuid/第1系统新btrfs分区uuid/g' /path/to/grub.cfg

6、在第二个系统中更新 grub
sudo update-grub2
这次不用执行更新 /boot/efi/EFI/*/grub.cfg

7、启动进入第一个系统中,把 / 根文件系统迁移到 /@
sudo btrfs subvolume snapshot / /@
sudo btrfs subvolume set-default /@

8、启动进入第二系统中
sudo mount -o subvolid=5 /dev/sda4 /mnt -v
sudo mv /mnt/@ /mnt/.@ -v
sudo rm /mnt/* -frv
sudo mv /mnt/.@ /mnt/@ -v
cd /mnt
sudo btrfs subvolume create @home
sudo mv @/home/* @home/ -v
sudo vim @/etc/fstab ,添加 /home 挂载项,复制 / 的挂载行,/ 变为 /home ,defaults 变为 defaults,subvol=@home
for d in boot etc lib usr var; do sudo ln -sv @/${d} ${d}; done
sudo update-grub2

9、重启进入第一系统
sudo fdisk /dev/sda
删除第二系统分区
记住第一个系统开始的扇区
删除第一系统的分区
以开始扇区不变,结束为最大扇区的方式重建第一系统的根分区
按w键保存磁盘分区,退出 fdisk
将 btrfs 文件扩展到全部剩余磁盘空间,执行: sudo btrfs filesystem resize max /
sudo update-grub2
修改EFI配置
sudo -s
cd /boot/efi/EFI
for d in boot ubuntu UOS;do cp deepin/grub.cfg ${d}/ -v; done
再重启。成功。完毕。

三、小结
1、上述方法适用于迁移已有系统,也可以作为把 Deepin 安装到 btrfs 的方法之一。
2、上面的一些设置需要根据自己的情况进行调整,如 btrfs 的挂载选项优化。
3、btrfs 是一个发展中的文件系统,新特性不断加入,版本之间差异明显。建议使用 btrfs 已经成熟的特性,慎用新特性。建议使用 LTS 内核。
4、我们应多读官方或发行版文档,避免一些明显的坑,如 Deepin 用户可以读 Debian Wiki 的 btrfs 文档 https://wiki.debian.org/Btrfs 。尤其是其中的“Other Warnings”小节。
5、作为普通家用或 Linux 玩家,在保证数据安全的情况下,尽可以尝试一下 btrfs 或其它各种文件系统。权当折腾着玩吧。但作为生产系统,在没有把握的情况下,建议还是先弄懂有关细节再说吧。

发表评论

电子邮件地址不会被公开。 必填项已用*标注