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 在修改数据时不会直接覆盖原始数据块,而是:
- 将修改写入新的磁盘位置
- 更新元数据指针指向新位置
- 释放旧数据块
传统文件系统(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 |