强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Btrfs 文件系统运维完全教程 / 第 1 章:Btrfs 概述与特性

第 1 章:Btrfs 概述与特性

1.1 Btrfs 简介

Btrfs(B-tree File System)是一个基于 Copy-on-Write(COW,写时复制)原则的 Linux 文件系统,由 Oracle 于 2007 年发起开发,名称中的 “B” 源于 B-tree 数据结构。2009 年进入 Linux 内核主线(v2.6.29),此后陆续有 Facebook、SUSE、Red Hat 等公司参与贡献。

Btrfs 的设计目标是解决传统文件系统在大规模存储管理中的痛点,将文件系统、卷管理器(类似 LVM)和 RAID 控制器的功能集成到一个统一的层中。

发展里程碑

时间 事件
2007 Oracle 发起 Btrfs 开发项目
2009 合并进入 Linux 内核 v2.6.29(实验性)
2012 RAID 5/6 实验性支持
2014 SUSE Linux Enterprise 首次将 Btrfs 设为默认文件系统
2015 RAID 5/6 write hole 问题被广泛讨论
2020 Facebook 在大规模生产环境中使用 Btrfs
2021 Linux 5.10 LTS 引入异步丢弃(async discard)支持
2022 Fedora 33 开始默认使用 Btrfs
2023 btrfs-progs v6.6,内核 6.1 LTS 大幅改善 RAID 5/6 稳定性
2024 内核 6.6+ 引入新的 RAID 1c3/1c4 模式

当前成熟度

Btrfs 的不同功能模块成熟度不一,运维人员必须清楚:

功能 成熟度 说明
基础读写 ✅ 稳定 生产环境广泛使用
子卷 ✅ 稳定 核心功能,长期稳定
快照 ✅ 稳定 核心特性,性能优秀
Send/Receive ✅ 稳定 备份的核心机制
RAID 0 ✅ 稳定 条带化,无冗余
RAID 1 / RAID 10 ✅ 稳定 镜像,生产推荐
RAID 1c3 / RAID 1c4 ✅ 稳定 内核 6.2+,3/4 副本
压缩 (zstd/lzo) ✅ 稳定 推荐 zstd
配额 (Quota/Qgroup) ⚠️ 可用 有性能开销,谨慎使用
RAID 5 ⚠️ 实验性 write hole 问题,不建议用于生产
RAID 6 ⚠️ 实验性 同 RAID 5,write hole 风险
Dedup (去重) ⚠️ 有限 仅用户态工具,非内核原生

1.2 核心特性概览

1.2.1 Copy-on-Write(COW)机制

COW 是 Btrfs 的基石。与传统文件系统不同,Btrfs 在修改数据时不会直接覆盖原始数据块,而是:

  1. 将修改写入新的磁盘位置
  2. 更新元数据指针指向新位置
  3. 释放旧数据块

传统文件系统(in-place update):

写入前: Block A [原始数据]
写入后: Block A [新数据]        ← 原地覆盖,断电可能导致数据损坏

Btrfs(Copy-on-Write):

写入前: Block A [原始数据]  ──指针──> 元数据
写入后: Block A [原始数据]  Block B [新数据]
                          ──指针──> 元数据(更新后指向 B)

COW 的优势:

特性 说明
断电安全 写入是原子操作,不会产生部分写入的损坏状态
快照 利用 COW 可以瞬间创建快照(零拷贝)
数据完整性 可以在写入时计算和验证校验和

COW 的劣势:

特性 说明
碎片化 随机写会加剧文件碎片,影响机械盘性能
写放大 每次修改都要写入新位置,增加了写入量
空间开销 旧数据块需要等 balance 或 trim 后才能回收

1.2.2 子卷(Subvolume)

子卷是 Btrfs 内部的一个独立文件树,类似于轻量级的"分区",但不需要预先分配固定大小的空间:

# 创建子卷
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@var
btrfs subvolume create /mnt/@snapshots

# 列出子卷
btrfs subvolume list /mnt

子卷之间共享底层存储池的可用空间,这使得空间管理非常灵活。

1.2.3 快照(Snapshot)

快照是子卷在某个时间点的完整副本,利用 COW 机制实现瞬间创建且几乎不占用额外空间:

# 创建快照(可写)
btrfs subvolume snapshot /mnt/@home /mnt/@snapshots/home-20260510

# 创建只读快照
btrfs subvolume snapshot -r /mnt/@home /mnt/@snapshots/home-20260510-ro

快照只在数据被修改时才逐步占用空间(COW),这是 Btrfs 最强大的特性之一。

1.2.4 校验和(Checksum)

Btrfs 对数据和元数据都计算校验和(默认 CRC32C,可选 xxhash、sha256、blake2b):

# 查看校验和算法
btrfs inspect-internal dump-super /dev/sda1 | grep csum_type

# 校验和示例(CRC32C)
# inode 257 offset 0 disk_bytenr 13631488 dev /dev/sda1
# csum 0xa1b2c3d4 expected 0xa1b2c3d4

如果校验和不匹配,Btrfs 会:

  • 在 RAID 1/10 模式下自动从镜像副本修复
  • 在单设备模式下报告 I/O 错误

1.2.5 多设备与 RAID

Btrfs 在文件系统层面实现 RAID,不需要 mdadm 或 LVM:

# 创建 RAID 1 文件系统(2 个设备)
mkfs.btrfs -d raid1 -m raid1 /dev/sdb /dev/sdc

# 添加第三个设备
btrfs device add /dev/sdd /mnt

# 将数据转换为 RAID 10
btrfs balance start -dconvert=raid10 -mconvert=raid10 /mnt

Btrfs 支持的 RAID 模式:

RAID 模式 数据 元数据 最少设备 容错 成熟度
single 单份 单份 1 无 ✅
RAID 0 条带 条带 1 无 ✅
RAID 1 镜像 镜像 2 1 盘 ✅
RAID 1c3 3 副本 3 副本 3 2 盘 ✅ (6.2+)
RAID 1c4 4 副本 4 副本 4 3 盘 ✅ (6.2+)
RAID 10 条带+镜像 条带+镜像 4 每组 1 盘 ✅
RAID 5 条带+奇偶校验 条带+奇偶校验 2 1 盘 ⚠️
RAID 6 条带+双奇偶校验 条带+双奇偶校验 3 2 盘 ⚠️
DUP 2 份(同一设备) 2 份 1 设备内 ✅

1.2.6 在线压缩

Btrfs 支持透明压缩,数据在写入磁盘前自动压缩,读取时自动解压:

# 以 zstd 方式挂载
mount -o compress=zstd:3 /dev/sdb1 /mnt

# 查看压缩比
btrfs filesystem df /mnt

1.2.7 其他特性

特性 说明
Send/Receive 将快照的增量数据发送到另一个 Btrfs 文件系统,用于备份
在线扩缩容 可以在线增大或缩小文件系统(缩小需使用 balance)
异步丢弃 (Async Discard) 优化 SSD 的 TRIM 性能
Zoned 模式 支持 SMR 硬盘和 ZNS SSD 的 zoned device
Reflink cp --reflink 实现即时复制文件
文件克隆 FICLONE/FICLONERANGE ioctl,Docker overlay 优化

1.3 Btrfs vs ext4 vs ZFS 对比

这是运维人员最常问的问题。以下是三者的详细对比:

功能对比

特性 Btrfs ext4 ZFS
COW ✅ ❌ ✅
子卷 ✅ ❌ ✅(Dataset)
快照 ✅ 原生 ❌ ✅ 原生
增量备份 ✅ Send/Receive ❌ ✅ Send/Receive
内建 RAID ✅ ❌(依赖 mdadm) ✅
透明压缩 ✅ zstd/lzo/zlib ❌ ✅ lz4/zstd
数据校验 ✅ ❌ ✅
去重 ⚠️ 用户态 ❌ ✅ 在线去重
加密 ✅ fscrypt(非原生) ✅ fscrypt ✅ 原生
最大文件 16 EiB 16 TiB 16 EiB
最大卷 16 EiB 1 EiB 256 ZiB
内核支持 原生 原生 需要第三方模块(OpenZFS)
许可证 GPL GPL CDDL(与 GPL 不兼容)
内存需求 低 低 高(推荐 1GB/TB)

性能对比

场景 Btrfs ext4 ZFS
顺序读 接近 ext4 快 快
顺序写 略低于 ext4 快 取决于 ARC
随机读 好 好 好(ARC 命中时优秀)
随机写 中等(COW 开销) 快 中等(COW 开销)
大量小文件 好 非常好 好
数据库场景 需关闭 COW 推荐 需要调优
压缩场景 zstd 性能好 N/A lz4 极快

运维复杂度

维度 Btrfs ext4 ZFS
学习曲线 中等 低 高
故障排查 中等 低 高
内核兼容性 需要较新内核 广泛兼容 需要额外模块
社区文档 丰富 极丰富 丰富
工具链 btrfs-progs e2fsprogs zfs-utils
可调参数 适量 少量 极多

如何选择?

场景 推荐 原因
桌面系统 Btrfs 快照回滚、压缩节省空间、Fedora/openSUSE 默认
小型服务器 Btrfs 快照 + Send/Receive 备份,运维简单
大型存储服务器 ZFS 去重、加密、ARC 缓存、RAID-Z 成熟
数据库服务器 ext4 / XFS 稳定、性能可预测、COW 不适合数据库
NAS / 文件服务器 Btrfs 或 ZFS 快照和数据完整性
嵌入式设备 ext4 资源占用低、兼容性好
云服务器 ext4 / Btrfs ext4 默认可靠,Btrfs 快照方便

1.4 适用场景详解

1.4.1 操作系统根分区

Btrfs 非常适合作为 Linux 桌面/服务器的根分区:

# openSUSE/Fedora 推荐的子卷布局
/dev/sda2  /              subvol=@
/dev/sda2  /home          subvol=@home
/dev/sda2  /var           subvol=@var
/dev/sda2  /.snapshots    subvol=@snapshots

优势:

  • 系统更新前自动创建快照
  • 出问题时一键回滚
  • zstd 压缩节省磁盘空间

1.4.2 容器存储

Docker 和 Podman 可以使用 Btrfs 存储驱动,利用 COW 和快照优化容器层的存储:

# Docker 配置 Btrfs 驱动
cat /etc/docker/daemon.json
{
  "storage-driver": "btrfs"
}

1.4.3 备份服务器

利用 Send/Receive 实现高效增量备份:

# 发送增量快照到备份服务器
btrfs send -p /snapshots/home-old /snapshots/home-new | ssh backup "btrfs receive /backup"

1.4.4 虚拟机存储

Btrfs 的快照和 Reflink 特性非常适合虚拟机磁盘管理:

# 创建 VM 磁盘的快照用于快速克隆
btrfs subvolume snapshot /vms/base-vm /vms/vm-clone-01

1.4.5 不建议使用 Btrfs 的场景

场景 原因
数据库主存储 COW 会导致碎片,影响随机写性能
RAID 5/6 生产环境 write hole 问题尚未完全解决
超大规模集群(PB 级) 块组大小限制(1GB 数据块组)、balance 耗时
需要极致性能的场景 COW 的额外开销难以避免
非 Linux 平台 仅支持 Linux 内核

1.5 内核版本要求

Btrfs 的功能随着内核版本不断演进,选择正确的内核版本至关重要。

各版本重要特性

内核版本 新增特性
2.6.29 Btrfs 初次进入主线(实验性)
3.0 稳定性大幅改善
3.6 子卷配额(quota)
3.14 RAID 5/6 实验性支持
4.5 在线 RAID 转换(balance 转换)
4.14 更好的空间处理
5.1 btrfs send 大量优化
5.10 (LTS) 异步丢弃(async discard)
5.15 (LTS) zstd 压缩级别支持
5.19 RAID 5/6 稳定性改善
6.1 (LTS) 大量修复,新的 space 操作
6.2 RAID 1c3 / RAID 1c4
6.5 更好的 free space 处理
6.6 (LTS) 进一步 RAID 5/6 改善

推荐内核版本

使用场景 最低内核 推荐内核
个人桌面 5.10 6.1+ 或 6.6+
生产服务器 5.15 6.1 LTS 或 6.6 LTS
RAID 1 使用 5.10 6.1+
RAID 5/6(不推荐) 6.6 最新稳定版
压缩(zstd 级别) 5.15 6.1+
多设备平衡 5.10 6.1+

btrfs-progs 版本

btrfs-progs 版本 对应推荐内核 说明
v4.14 4.14+ 基础功能完整
v5.10 5.10+ 新命令和选项
v6.0 6.0+ RAID 1c3/1c4 支持
v6.6 6.6+ 修复和性能优化
# 检查内核版本
uname -r

# 检查 btrfs-progs 版本
btrfs version

# 检查内核是否编译了 Btrfs 模块
cat /proc/filesystems | grep btrfs
# 或
modinfo btrfs

各发行版内核版本

发行版 版本 默认内核 默认文件系统
Ubuntu 22.04 LTS 5.15 ext4
Ubuntu 24.04 LTS 6.8 ext4
Fedora 39 — 6.5+ Btrfs
Fedora 40 — 6.8+ Btrfs
openSUSE Leap 15.5 — 5.14 Btrfs
openSUSE Tumbleweed 滚动 最新 Btrfs
Debian 12 — 6.1 ext4
Arch Linux 滚动 最新 ext4
CentOS Stream 9 — 5.14 XFS

1.6 本章小结

要点 说明
Btrfs 是什么 Linux 原生 COW 文件系统,集文件系统+卷管理+RAID 于一体
核心优势 快照、子卷、校验、压缩、Send/Receive 备份
与 ext4 相比 功能远超 ext4,但随机写性能略低
与 ZFS 相比 功能不如 ZFS 完善,但内核原生、内存需求低、许可证兼容
RAID 5/6 不建议生产使用,write hole 问题未完全解决
推荐内核 6.1 LTS 或 6.6 LTS

扩展阅读