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

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 / 文件服务器 BtrfsZFS 快照和数据完整性
嵌入式设备 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

扩展阅读