目录

Linux ext4 文件系统转 Btrfs

最近扩展 Linux 分区的时候,由于年少轻狂,没有进行全盘备份,导致系统出现了灾难性事故,软件、配置,还有最近学习 Vim,写了快一个星期的配置文件,全部丢失。重装系统后便开始寻找适合备份的文件系统,便有了这篇文章。

为什么是 Btrfs

Btrfs 是 B-tree 文件系统,通常念做 「Butter FS」、「Better FS」或「B-tree FS」。是一种支持写入时复制(CoW)的 Linux 文件系统。相对于 ext4 文件系统有以下几个优点:

  • Btrfs 支持快照,方便备份与恢复;
  • Btrfs 支持透明压缩,节省存储空间;
  • Btrfs 支持子卷功能,便于管理;
  • Btrfs 支持数据与元数据校验。

这些优点使我产生了向 Btrfs 迁移的念头,幸运的是,Btrfs 支持从 ext4 转换。

转换步骤

以下步骤是在我自用电脑上操作的,磁盘 /dev/nvme0n1p4 挂载为 Linux 根分区,下文命令可能需要调整。由于操作时需要对根分区进行操作,强烈建议操作前进行全盘备份并在 LiveCD 环境下进行操作。

注意:任何对数据的操作都是充满风险的,如果你不能承受数据丢失的风险,请勿操作。 注意:如果转换中出现任何异样,你都可以使用备份子卷 /ext2_saved 来回滚。请勿强行对转换失败的分区做出更改。使用 btrfs-convert -r /dev/target_partition 命令进行回滚。

检查文件系统

首先使用 fsck 检查磁盘,保证现有分区没有问题。

# fsck.ext4 /dev/nvme0n1p4

开始文件系统转换

分区检查通过后就可以开始转换。执行以下命令进行转换。

# btrfs-convert /dev/nvme0n1p4

待出现 conversion complete 表明转换完成。现在分区的文件系统已经是 Btrfs 了,但是还不能重启,还需要对现有的文件进行修改才能顺利引导进系统。

挂载分区并修改 fstab

首先需要挂载分区,方便我们修改文件。这里我们将分区挂载到 /mnt 目录下。

# mount /dev/nvme0n1p4 /mnt

使用磁盘工具检查分区的 UUID,这里使用 lsblk 命令。

$ lsblk -f
NAME        FSTYPE FSVER LABEL      UUID                                 FSAVAIL FSUSE% MOUNTPOINT
nvme0n1
...                                
└─nvme0n1p4 btrfs        ...        82xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxeb     xxG     xx%    /mnt

使用文本编辑工具修改 /mnt/etc/fstab 文件,修改挂载到根目录的分区类型(type)为 btrfs、文件系统检查顺序(pass)为 0(启动时不进行磁盘检查),并检查转换后的分区 UUID 是否改变,修改挂载分区(file system)。

重建初始化内存盘

重建初始化内存盘需要在 chroot 环境中进行。首先需要设置对应的挂载点。

# mount -t proc none /mnt/proc
# mount -t sysfs none /mnt/sys
# mount -o bind /dev /mnt/dev

随后使用 chroot 命令进入原系统。

# chroot /mnt bash

进入原系统后,使用 mkinitcpio 重建初始化内存盘。这里可能需要替换命令参数,如果提示 Fail to load preset,需要检查 /etc/mkinitcpio.d 目录下是否存在对应的预设文件名。

# mkinitcpio --preset linux

如果使用 GRUB 启动,还需要重建 GRUB 引导。由于笔者使用 rEFInd 引导,故没有执行该步骤,如有需要参见 Btrfs - ArchWiki「6.2 从 Ext3/4 转换」一节。

TLP 设置

如果使用了 TLP 高级电源管理功能,需要对 TLP 进行设置,防止文件系统损坏。编辑位于 /mnt/etc/tlp.conf 的配置文件,找到 SATA_LINKPWR_ON_BAT 条目,取消注释并在选项中添加 max_performance 参数。

SATA_LINKPWR_ON_BAT="med_power_with_dipm max_performance"

启用透明压缩

为了能够利用 Btrfs 的透明压缩功能,可以对转换好的分区进行压缩并修改 fstab 挂载选项。

首先需要对转换好的分区进行全盘压缩。

# btrfs filesystem defragment -r -v -czstd /mnt

随后需要修改 fstab 文件,在根目录文件系统的挂载选项(options)一栏中增加 compress=zstd 选项,以便系统启动时应用压缩选项。

使用新文件系统启动及后续操作

完成上述步骤后,便可以使用转换后的分区启动。启动后,可以删除 /ext2_saved 子卷完成转换。

# btrfs subvolume delete /ext2_saved

最后通过 Balance 来回收数据。

# btrfs balance start /
# btrfs balance status /

至此,分区文件系统转换就结束了。感受新文件系统所带来的惊喜吧。

配置文件系统检修

在转换结束后,可以配置定时对根目录 / 的检修任务。

# systemctl enable --now btrfs-scrub@-.timer

或者你也可以手动执行。

# btrfs scrub start /
# btrfs scrub status /

后记

对于数据的操作务必谨慎,如果有合适的文件系统也会使数据操作更加得心应手。使用了一段时间的 Btrfs 文件系统后,并没有感受到与 ext4 有什么不同,反而在快照、透明压缩上有更多的惊喜。如果让我说 Btrfs 适不适合作为一个 Linux 桌面用户的文件系统,我的答案会是肯定的,但是如果没有正确的、有效的数据冗余备份机制,再好的文件系统也会「不适合」。

参考文章