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 桌面用户的文件系统,我的答案会是肯定的,但是如果没有正确的、有效的数据冗余备份机制,再好的文件系统也会「不适合」。