Arch Linux 与 Btrfs:打造灵活高效的文件系统方案

Arch Linux 以其轻量、灵活和滚动更新的特性深受 Linux 爱好者青睐,而 Btrfs(B-tree File System)作为新一代文件系统,凭借写时复制(CoW)快照子卷压缩等高级特性,正逐渐成为系统盘的理想选择。本文将详细介绍如何在 Arch Linux 中部署 Btrfs,从分区规划到快照管理,帮助你构建一个兼顾性能与可靠性的系统。

目录#

  1. 简介
  2. 什么是 Btrfs?
  3. 为什么选择 Arch Linux + Btrfs?
  4. 准备工作
  5. 磁盘分区规划
  6. 格式化与子卷配置
  7. 安装 Arch Linux 到 Btrfs 分区
  8. 系统配置与 fstab 设置
  9. 快照管理:系统备份与恢复
  10. 日常维护与优化
  11. 常见问题与解决方案
  12. 最佳实践总结
  13. 参考资料

1. 简介#

Arch Linux 以其轻量、灵活和滚动更新的特性深受 Linux 爱好者青睐,而 Btrfs(B-tree File System)作为新一代文件系统,凭借写时复制(CoW)快照子卷压缩等高级特性,正逐渐成为系统盘的理想选择。本文将详细介绍如何在 Arch Linux 中部署 Btrfs,从分区规划到快照管理,帮助你构建一个兼顾性能与可靠性的系统。

2. 什么是 Btrfs?#

Btrfs 是由 Oracle 主导开发的开源文件系统,设计目标是解决传统文件系统(如 Ext4)的局限性。其核心特性包括:

  • 写时复制(Copy-on-Write, CoW):修改文件时不直接覆盖原数据,而是写入新位置,避免数据损坏风险。
  • 子卷(Subvolume):将一个 Btrfs 分区划分为多个独立“逻辑卷”,可独立挂载、快照和管理。
  • 快照(Snapshot):基于 CoW 实现的高效备份,创建/删除快照几乎瞬时完成,且仅占用变化数据的空间。
  • 透明压缩:支持 zstd、lz4 等算法,减少磁盘占用并提升 I/O 效率(尤其对 SSD)。
  • 校验与修复:支持数据和元数据校验(checksum),配合 btrfs scrub 可检测并修复错误。
  • 动态调整:支持在线调整分区大小、添加/移除设备(如 RAID 扩展)。

Btrfs 的设计哲学是“特性丰富且实用”,特别适合需要频繁备份、动态管理存储的场景(如 Arch 滚动更新系统)。

3. 为什么 Arch Linux + Btrfs?#

Arch Linux 作为滚动发行版,用户需频繁更新系统,而 Btrfs 的快照功能可完美应对更新失败的风险。此外,两者的“灵活性”高度契合:

  • 快照恢复:更新前创建快照,若系统崩溃可一键回滚,降低“滚挂”风险。
  • 空间效率:CoW 和压缩特性减少磁盘占用,适合 SSD 或小容量硬盘。
  • 动态管理:子卷功能替代传统分区,无需重启即可调整“逻辑分区”大小。
  • 性能优化:通过压缩和缓存机制,Btrfs 在多数场景下性能优于 Ext4(尤其小文件读写)。

4. 准备工作#

在开始前,请确保:

4.1 环境要求#

  • Arch Linux 安装镜像:从 Arch 官网 下载最新 ISO。
  • 启动介质:使用 dd 或 Rufus 将 ISO 写入 U 盘(例:dd if=archlinux.iso of=/dev/sdX bs=4M status=progress)。
  • 目标硬盘:至少 20GB 空间(推荐 SSD,发挥 Btrfs 压缩和 TRIM 优势)。
  • 网络连接:安装过程需联网(有线优先,无线可通过 iwctl 配置)。
  • UEFI/BIOS:确认启动模式(推荐 UEFI,需关闭 Secure Boot)。

4.2 工具准备#

启动 Arch live 环境后,安装必要工具:

# 更新系统时钟
timedatectl set-ntp true
 
# 安装分区工具(可选,根据习惯选择)
pacman -Sy parted gdisk btrfs-progs

5. 磁盘分区规划#

Btrfs 支持直接使用整个磁盘或分区,但通常需配合引导分区(如 EFI 分区)。以下以 UEFI 模式 + 单硬盘 为例,分区方案如下:

分区路径大小文件系统作用
/dev/sda1512MiBFAT32EFI 系统分区(必需)
/dev/sda2剩余空间Btrfs根分区(包含子卷)

5.1 分区操作(以 gdisk 为例)#

  1. 启动 gdisk 并选择目标磁盘:
    gdisk /dev/sda
  2. o 创建新分区表(警告:会清除数据!)。
  3. 创建 EFI 分区:
    • n → 分区号 1 → 起始扇区默认 → 大小 +512M → 类型代码 ef00(EFI System)。
  4. 创建 Btrfs 分区:
    • n → 分区号 2 → 起始扇区默认 → 大小默认(剩余空间)→ 类型代码 8300(Linux filesystem)。
  5. w 保存并退出。

5.2 格式化分区#

  • 格式化 EFI 分区:
    mkfs.fat -F32 /dev/sda1
  • 暂不格式化 Btrfs 分区:后续将通过 mkfs.btrfs 详细配置。

6. 格式化与子卷配置#

Btrfs 的核心优势在于子卷,合理规划子卷可提升系统管理效率。以下是推荐的子卷结构:

子卷路径挂载点作用说明
@/根目录(系统文件)
@home/home用户数据(独立快照,避免系统快照过大)
@var/var日志、缓存(频繁写入,单独管理)
@snapshots/snapshots存储快照(避免快照占用根目录空间)
@tmp/tmp临时文件(不纳入快照)

6.1 格式化 Btrfs 分区#

使用 mkfs.btrfs 格式化分区,指定元数据和数据配置(非 RAID 场景):

# -m single:元数据单副本;-d single:数据单副本(适合单盘)
# -L "ArchBtrfs":卷标(可选)
mkfs.btrfs -m single -d single -L "ArchBtrfs" /dev/sda2

6.2 创建子卷#

  1. 临时挂载 Btrfs 分区到 /mnt
    mount /dev/sda2 /mnt
  2. 创建子卷:
    btrfs subvolume create /mnt/@          # 根目录
    btrfs subvolume create /mnt/@home      # 用户数据
    btrfs subvolume create /mnt/@var       # 日志缓存
    btrfs subvolume create /mnt/@snapshots # 快照存储
    btrfs subvolume create /mnt/@tmp       # 临时文件
  3. 卸载临时挂载点:
    umount /mnt

7. 安装 Arch Linux#

7.1 挂载子卷到目标目录#

按子卷规划挂载到 /mnt(安装根目录):

# 挂载根目录子卷 @
mount -o subvol=@,compress=zstd,noatime,space_cache=v2,discard=async /dev/sda2 /mnt
 
# 创建其他挂载点并挂载子卷
mkdir -p /mnt/{home,var,snapshots,tmp,boot/efi}
mount -o subvol=@home,compress=zstd,noatime,space_cache=v2,discard=async /dev/sda2 /mnt/home
mount -o subvol=@var,compress=zstd,noatime,space_cache=v2,discard=async /dev/sda2 /mnt/var
mount -o subvol=@snapshots,noatime,space_cache=v2 /dev/sda2 /mnt/snapshots  # 快照无需压缩
mount -o subvol=@tmp,noatime,space_cache=v2 /dev/sda2 /mnt/tmp              # 临时文件无需压缩
 
# 挂载 EFI 分区
mount /dev/sda1 /mnt/boot/efi

挂载参数说明

  • subvol=@:指定挂载的子卷。
  • compress=zstd:启用 zstd 压缩(比 lzo 压缩率更高,性能接近)。
  • noatime:禁用文件访问时间记录(减少写入)。
  • space_cache=v2:优化空间分配缓存(推荐)。
  • discard=async:异步 TRIM(SSD 必选,延长寿命)。

7.2 安装基础系统#

使用 pacstrap 安装 Arch 基础包(包含 Btrfs 工具):

pacstrap /mnt base linux linux-firmware btrfs-progs # 基础系统 + Btrfs 工具
pacstrap /mnt base-devel networkmanager sudo # 开发工具、网络管理、sudo

7.3 生成 fstab#

将当前挂载配置写入 /etc/fstab(自动处理子卷和挂载参数):

genfstab -U /mnt >> /mnt/etc/fstab

检查 fstab:编辑 /mnt/etc/fstab,确保子卷和参数正确(例:/dev/sda2 的挂载项应包含 subvol=@ 等)。

8. 系统配置与 fstab 优化#

8.1 进入 chroot 环境#

arch-chroot /mnt

8.2 基础配置#

设置时区、本地化、主机名等(参考 Arch 安装指南),此处省略常规步骤,重点关注 Btrfs 相关优化。

8.3 fstab 微调#

默认 genfstab 已包含必要参数,但可进一步优化:

# 编辑 fstab
nvim /etc/fstab
  • @tmp 添加 tmpfs 选项(可选,将 tmp 挂载为内存文件系统):
    # 原 @tmp 行替换为:
    tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
  • 为 SSD 添加 discard=async(已在挂载时设置,fstab 中确认存在)。

8.4 安装引导程序#

systemd-boot 为例(UEFI 推荐):

# 安装 systemd-boot 到 EFI 分区
bootctl install
 
# 创建引导项配置
nvim /boot/loader/entries/arch.conf

添加以下内容(注意 rootflags=subvol=@ 指定根目录子卷):

title   Arch Linux (Btrfs)
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options root=UUID=<Btrfs 分区 UUID> rootflags=subvol=@ rw quiet splash

UUID 可通过 blkid /dev/sda2 获取。

9. 快照管理:系统备份与恢复#

快照是 Btrfs 的“灵魂”,推荐使用 snapper 工具自动化管理。

9.1 安装与配置 snapper#

# 安装 snapper
pacman -S snapper
 
# 为根目录子卷创建快照配置
snapper -c root create-config /

配置调整:编辑 /etc/snapper/configs/root,设置快照保留策略:

TIMELINE_CREATE="yes"       # 启用定时快照
TIMELINE_CLEANUP="yes"      # 启用自动清理
TIMELINE_MIN_AGE="1800"     # 最小保留时间(秒)
TIMELINE_LIMIT_HOURLY="5"   # 保留 5 个每小时快照
TIMELINE_LIMIT_DAILY="7"    # 7 个每日快照
TIMELINE_LIMIT_WEEKLY="4"   # 4 个每周快照

9.2 手动创建与恢复快照#

创建快照#

# 创建带描述的快照(--type 可选:single(独立)、pre(更新前)、post(更新后))
snapper -c root create --description "更新前快照" --type pre
 
# 查看快照列表
snapper -c root list

恢复快照(关键操作!)#

若系统更新后无法启动,可通过以下步骤回滚:

  1. 从 Arch live 环境启动,挂载 Btrfs 分区和子卷:
    mount -o subvol=@ /dev/sda2 /mnt
  2. 查看快照:
    btrfs subvolume list /mnt  # 快照路径通常为 @snapshots/<编号>/snapshot
  3. 回滚(以快照 @snapshots/1/snapshot 为例):
    # 重命名当前根目录子卷(备份)
    btrfs subvolume rename /mnt/@ /mnt/@_broken
     
    # 将快照重命名为 @(恢复)
    btrfs subvolume rename /mnt/@snapshots/1/snapshot /mnt/@
  4. 重启系统,即可恢复到快照状态。

10. 日常维护#

10.1 数据校验与修复(btrfs scrub#

定期运行 scrub 检测并修复数据错误(推荐每月一次):

# 开始校验(后台运行)
btrfs scrub start /
 
# 查看进度
btrfs scrub status /
 
# 设置定时任务(通过 systemd timer)
systemctl enable --now [email protected]  # 自动每月 scrub 根目录

10.2 空间清理(btrfs balance#

当磁盘碎片或元数据分布不均时,可运行 balance谨慎使用,耗时且占资源):

# 仅平衡使用率 >50% 的数据块(减少负载)
btrfs balance start -dusage=50 /

10.3 压缩优化#

Btrfs 压缩默认对所有文件生效,但部分场景需禁用(如数据库、虚拟机镜像):

# 为目录禁用压缩(创建子卷并设置 nodatacow)
btrfs subvolume create /var/lib/docker  # Docker 数据目录
chattr +C /var/lib/docker                # 禁用 CoW(含压缩)

11. 常见问题与解决方案#

11.1 快照删除后空间未释放?#

原因:CoW 机制下,若快照引用了文件,删除快照后文件仍被其他快照引用。
解决

# 查看子卷空间占用
btrfs filesystem du -s /@* /@snapshots/*
 
# 删除无用快照(通过 snapper 清理)
snapper -c root delete <快照编>

11.2 系统无法启动(子卷挂载失败)?#

原因fstabsubvol 参数错误或 UUID mismatch。
解决

  1. 从 live 环境挂载根分区:mount -o subvol=@ /dev/sda2 /mnt
  2. 检查 /mnt/etc/fstab 中的 rootflags=subvol=@ 和 UUID 是否正确。

11.3 压缩导致性能下降?#

原因:zstd 压缩对 CPU 有轻微占用(尤其老旧设备)。
解决:降低压缩级别(compress=zstd:3)或改用 lz4(更快但压缩率低):

# 修改 fstab 中对应子卷的压缩选项
nvim /etc/fstab  # 例如:compress=lz4

12. 最佳实践总结#

  1. 快照策略:更新前必创建快照,保留 3-5 个关键快照(如“稳定工作状态”)。
  2. 子卷规划:至少分离 @@home@var,避免快照体积过大。
  3. 压缩选择:SSD 优先 zstd,HDD 或低性能设备可选 lz4
  4. 定期维护:启用 btrfs-scrub.timer,每月检查磁盘空间和快照数量。
  5. 避免 CoW 场景:数据库、虚拟机镜像、大文件存储目录禁用 CoW(chattr +C)。
  6. 备份快照:重要快照可通过 btrfs send 导出到外部存储:
    btrfs send /@snapshots/1/snapshot | gzip > /backup/snapshot_1.gz

13. 参考资料#


通过本文,你已掌握 Arch Linux 与 Btrfs 的核心配置与管理技巧。Btrfs 的灵活性和 Arch 的滚动更新结合,将为你带来高效、可靠的系统体验。若有疑问,欢迎在评论区交流!