BTRFS 是一个现代的写时复制 (Copy-on-Write, CoW) 文件系统,专为 Linux 设计,提供了传统文件系统所不具备的高级功能。
一、核心概念与优势
- 写时复制 (CoW):修改数据时,不会在原地覆盖,而是将修改后的数据写入新位置。这是实现快照、压缩和数据校验的基础。
- 数据完整性:为所有数据和元数据生成校验和 (Checksums)。能自动检测并(在有冗余时)修复“静默数据损坏”。
- 内置多设备管理:原生支持 RAID,无需mdadm。可以轻松地在线添加、删除磁盘和转换 RAID 级别。
- 空间效率:快照和克隆几乎不占用额外空间。透明压缩能显著节省磁盘容量。
二、关键特性详解
1. 子卷 (Subvolumes) 与快照 (Snapshots)
- 子卷:可以看作是文件系统内部一个可独立挂载的目录树。创建子卷就像创建一个目录一样简单快速。bash sudo btrfs subvolume create /path/to/subvolume
- 快照:一个子卷在某个时间点的只读(或可写)副本。创建瞬间完成,且初始不占用额外空间。只有当源文件或快照中的文件被修改时,新数据才会占用空间。bash sudo btrfs subvolume snapshot -r /source /destination
- 与/etc/fstab的关系:- 不需要修改fstab:仅创建子卷,并将其作为普通目录使用。配额、快照等功能依然可用。
- 需要修改fstab:- 将子卷挂载到不同位置。
- 为子卷设置独立的挂载选项(如nodatacow,compress)。
- 将子卷设为系统启动根目录(如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. 桌面系统 (绝佳选择)
- 王牌功能:系统快照与回滚。通过Timeshift或Snapper等工具,可在系统更新出错后瞬间恢复到更新前的状态。
- 数据安全:为/home目录创建快照,轻松应对误删除和勒索软件。
- 节省空间:启用zstd压缩,对文档、代码等有很好的效果。
2. Docker (完美搭档)
- 工作原理:启用btrfs存储驱动后,Docker 镜像层是只读快照,容器是可写子卷。
- 优势:空间共享效率高,容器启停速度快,I/O 性能好。
- 配置:在/etc/docker/daemon.json中设置"storage-driver": "btrfs"。
3. 数据库 (如 MySQL) (需谨慎配置)
- 问题:默认的 CoW 机制与数据库的随机写模式冲突,会导致严重的性能下降和文件碎片化。
- 解决方案:必须禁用 CoW。
- 为数据库文件创建一个专用目录(或子卷)。
- 在目录为空时,使用sudo chattr +C /path/to/db_data命令禁用 CoW。
- 将数据库的数据目录 (datadir) 指向这个新目录。
 
- 结论:对于生产环境,更稳妥的选择是 XFS 或 EXT4。
四、常见问题 (Gotchas)
- 快照空间占用:
- 快照只为变化的数据占用空间。
- 估算公式:总空间 ≈ 基础数据 + (每日数据变化量 × 快照保留天数) + 20%预留空间。
- 对于 100GB 数据,保留 3 天快照,一个 150GB – 200GB 的硬盘是比较安全的选择。
 
- df命令不准确:由于快照的存在,- df显示的可用空间可能不符合直觉。应使用- sudo btrfs filesystem usage /查看更详细的分配情况。