字数 1257,阅读大约需 7 分钟
一、Btrfs 是什么?
Btrfs(B-tree File System,又名 Butter FS) 是 Oracle 在 2007 年开始为 Linux 内核设计的 写时复制(COW)文件系统。目标是对标 ZFS、成为 Linux 的下一代默认文件系统。
核心身份:
Btrfs 不是 LVM 的"替代品"——它取代的是 ext4/xfs,而 LVM 那种"卷管理"功能被 Btrfs 内部吸收(subvolume + 多设备)。
二、为什么需要 Btrfs?
传统 Linux 文件系统的痛点
ext3/ext4 + LVM + mdadm + LUKS = 复杂组合
- •
LVM:灵活但与 ext4 分离,无法保证事务一致性 - •
mdadm:RAID 是硬件层,损坏时 fsck 救不回来
每一层独立设计 → 数据完整性难以保证。
Btrfs 的解决方案
三、Btrfs 的核心特性
3.1 Copy-on-Write(COW)
写入时不覆盖原数据,写到新位置:
修改前:block @ 100 200 300
修改后:block @ 100 500 300(旧 200 保留为快照)
好处:
3.2 校验和(Checksum)
每个 extent(Btrfs 的"块"概念)有 CRC32C 校验和:
Btrfs 的数据组织:
extent (1MB ~ 128MB) ← 大块
└─ 多个 block (4KB) ← 物理块
└─ 每个 block 有 checksum
scrub 时检查所有 extent,不一致就用副本修复。
3.3 子卷(Subvolume)
Btrfs 内部可以划分多个独立文件系统:
Btrfs 文件系统
├── subvolume: / (root)
│ ├── subvolume: @home
│ ├── subvolume: @data
│ └── subvolume: @snapshots
子卷特性:
3.4 快照(Snapshot)
子卷的只读或可写副本:
# 快照
$ btrfs subvolume snapshot /mnt/data /mnt/data@2024-01-01
# 只读
$ btrfs subvolume snapshot -r /mnt/data /mnt/data@ro
几乎瞬时(秒级,无论数据多大)。
3.5 内置 RAID
Btrfs 在文件系统层实现 RAID(无需 mdadm):
# 创建 RAID1
$ mkfs.btrfs -d raid1 -m raid1 /dev/sdb /dev/sdc
# RAID5(注意:scrub 仍会修正 parity mismatch)
$ mkfs.btrfs -d raid5 -m raid1 /dev/sd[b-d]
| | |
|---|
single | | |
dup | | |
raid0 | | |
raid1 | | |
raid5 | | |
raid6 | | |
raid10 | | |
Btrfs RAID5/6 历史上有 write hole bug(已修复但仍有争议),生产仍建议 RAID10。
3.6 多设备
Btrfs 文件系统横跨多个设备:
# 创建时
$ mkfs.btrfs /dev/sdb /dev/sdc /dev/sdd
# 运行时加
$ btrfs device add /dev/sde /mnt
# 替换故障盘
$ btrfs replace start /dev/sdb /dev/sdb_new /mnt
Btrfs 没有 zpool 的概念——所有设备都属于同一个文件系统。
3.7 透明压缩
# 挂载时启用
$ mount -o compress=zstd /dev/sdb /mnt
# 或 remount
$ mount -o remount,compress=zstd /mnt
压缩算法:
3.8 配额(Quota)
# 启用 quota
$ btrfs quota enable /mnt
# 设置限制
$ btrfs qgroup limit 10G /mnt/home/alice
四、Btrfs 不擅长的场景
| |
|---|
| 极小内存 | |
| RHEL 商业版 | |
| NFS 文件锁 | |
| 大量小文件 | |
| 极低延迟 | |
五、与 ZFS 的对比
Btrfs = "Linux 内核原生 + 简单";ZFS = "功能全面 + 复杂"。
六、术语速查表
| |
|---|
| subvolume(子卷) | |
| snapshot(快照) | |
| extent | |
| block | |
| chunk | |
| device | |
| balance | |
| scrub | |
| qgroup | |
| send / receive | |
| csum | |
| generation | |
| B-tree | |
七、本篇小结
- • Btrfs = 写时复制 + 子卷 + 多设备 + 内置 RAID
- • 适合:Linux 服务器、桌面、NAS、容器存储