BTRFS 核心笔记


BTRFS 是一个现代的写时复制 (Copy-on-Write, CoW) 文件系统,专为 Linux 设计,提供了传统文件系统所不具备的高级功能。


一、核心概念与优势

  1. 写时复制 (CoW):修改数据时,不会在原地覆盖,而是将修改后的数据写入新位置。这是实现快照、压缩和数据校验的基础。
  2. 数据完整性:为所有数据和元数据生成校验和 (Checksums)。能自动检测并(在有冗余时)修复“静默数据损坏”。
  3. 内置多设备管理:原生支持 RAID,无需mdadm。可以轻松地在线添加、删除磁盘和转换 RAID 级别。
  4. 空间效率:快照和克隆几乎不占用额外空间。透明压缩能显著节省磁盘容量。

二、关键特性详解

1. 子卷 (Subvolumes) 与快照 (Snapshots)

  • 子卷:可以看作是文件系统内部一个可独立挂载的目录树。创建子卷就像创建一个目录一样简单快速。bash sudo btrfs subvolume create /path/to/subvolume
  • 快照:一个子卷在某个时间点的只读(或可写)副本。创建瞬间完成,且初始不占用额外空间。只有当源文件或快照中的文件被修改时,新数据才会占用空间。bash sudo btrfs subvolume snapshot -r /source /destination
  • /etc/fstab 的关系
    • 不需要修改fstab:仅创建子卷,并将其作为普通目录使用。配额、快照等功能依然可用。
    • 需要修改fstab
      1. 将子卷挂载到不同位置
      2. 为子卷设置独立的挂载选项(如nodatacow,compress)。
      3. 将子卷设为系统启动根目录(如subvol=@)。

2. 透明压缩

  • 默认不开启,需要手动启用。
  • 工作方式:在数据写入磁盘时自动压缩,读取时自动解压,对用户和程序透明。
  • 推荐算法zstd,在性能和压缩率之间取得了极佳的平衡。
  • 如何启用 (推荐):在/etc/fstab 中添加compress=zstd 挂载选项。fstab # 示例 UUID=... / btrfs defaults,subvol=@,compress=zstd 0 0
  • 注意:启用后只对新写入或修改的文件生效。要压缩现有文件,需运行sudo btrfs filesystem defragment -r -czstd /path

3. 内置 RAID

  • 核心优势:文件系统知晓底层磁盘布局,可结合校验和实现数据自我修复 (Self-healing)
  • RAID 级别稳定性
    • 稳定可用RAID 1, RAID 10, RAID 0。推荐用于数据冗余和性能提升。
    • 绝对禁用RAID 5, RAID 6。存在“写入漏洞”,有数据丢失风险,不要在生产环境中使用
  • 灵活性:可为数据 (data) 和元数据 (metadata) 设置不同的 RAID 级别。

三、应用场景与最佳实践

1. 桌面系统 (绝佳选择)

  • 王牌功能:系统快照与回滚。通过TimeshiftSnapper 等工具,可在系统更新出错后瞬间恢复到更新前的状态。
  • 数据安全:为/home 目录创建快照,轻松应对误删除和勒索软件。
  • 节省空间:启用zstd 压缩,对文档、代码等有很好的效果。

2. Docker (完美搭档)

  • 工作原理:启用btrfs 存储驱动后,Docker 镜像层是只读快照,容器是可写子卷。
  • 优势:空间共享效率高,容器启停速度快,I/O 性能好。
  • 配置:在/etc/docker/daemon.json 中设置"storage-driver": "btrfs"

3. 数据库 (如 MySQL) (需谨慎配置)

  • 问题:默认的 CoW 机制与数据库的随机写模式冲突,会导致严重的性能下降文件碎片化
  • 解决方案必须禁用 CoW
    1. 为数据库文件创建一个专用目录(或子卷)。
    2. 目录为空时,使用sudo chattr +C /path/to/db_data 命令禁用 CoW。
    3. 将数据库的数据目录 (datadir) 指向这个新目录。
  • 结论:对于生产环境,更稳妥的选择是 XFSEXT4

四、常见问题 (Gotchas)

  • 快照空间占用
    • 快照只为变化的数据占用空间。
    • 估算公式总空间 ≈ 基础数据 + (每日数据变化量 × 快照保留天数) + 20%预留空间
    • 对于 100GB 数据,保留 3 天快照,一个 150GB – 200GB 的硬盘是比较安全的选择。
  • df 命令不准确:由于快照的存在,df 显示的可用空间可能不符合直觉。应使用sudo btrfs filesystem usage / 查看更详细的分配情况。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注