人人都会AI编程

Btrfs:写时复制、子卷、快照特性

更新时间:2026-07-12

Btrfs(B-tree file system)是一个现代写时复制(Copy-on-Write,CoW)文件系统,它并不是简单地在原有设计上修补,而是从一开始就为大规模存储、数据完整性和灵活管理而构建。在日常使用中,Btrfs 最突出和实用的三个特性是写时复制、子卷和快照。

1. 写时复制(Copy-on-Write)
传统文件系统在修改文件时,通常会直接覆盖原有数据块。而 Btrfs 的做法完全不同:当某个数据块需要被修改时,它先将原始块读出来,修改后写入一个全新的位置,然后更新元数据指针指向新块,旧块暂时保留。这个过程称为“写时复制”。

这种设计带来的直接好处是:

  • 天然的数据保护:在覆盖发生前,原始数据一直完好。即使修改过程中系统崩溃或断电,旧数据块依然可用,配合 Btrfs 的事务日志机制,文件系统能迅速回滚到一致的状态,极大降低了数据损坏的风险。
  • 高效快照的基础:因为修改并不覆盖原数据,所以创建一个快照本质上只是把元数据复制一份,而不需要立即复制实际数据。新的快照可以瞬间建立,并且几乎不消耗额外空间。

需要注意,写时复制会带来一些写放大效应(频繁修改同一文件会不断分配新块),因此对于虚拟机镜像、数据库等重随机写入场景,建议关闭对应文件或目录的 CoW 属性(使用 chattr +C),以获得更好的性能。

2. 子卷(Subvolume)
子卷可以理解为一个独立的管理单元,它看起来和普通的目录没什么区别,但你可以单独对它进行挂载、设定配额、创建快照。一个 Btrfs 文件系统内部可以包含多个子卷,它们共享同一个底层存储池,但在逻辑上相互隔离。

常见用法:

  • //home 创建为两个子卷,这样在快照或回滚根系统时,不会影响用户数据。
  • 为每个重要数据集(例如 /var/lib/mysql/srv/data)创建独立子卷,方便分别设定不同的快照策略。

创建子卷的命令非常简单:

btrfs subvolume create /mnt/btrfs-data/@root
btrfs subvolume create /mnt/btrfs-data/@home

然后在挂载时可以分别指定 subvol=@rootsubvol=@home 选项,像使用独立分区一样使用。

3. 快照(Snapshot)
快照是子卷在某一时刻的完整精确副本。因为写时复制的特性,快照并不是立即复制全部数据,而是共享现有数据块,仅在后续数据被修改时,才会按需保存差异。因此,快照的建立速度是秒级的,初始空间开销极小。

这是日常管理中最强大的功能之一:

  • 系统升级前的安全网:在执行大规模系统更新前,对根子卷创建一个只读快照。如果更新出现问题,你可以在几分钟内通过回滚快照将整个系统恢复到之前的状态。
  • 增量备份:可以定期创建快照,并利用 btrfs send / btrfs receive 将快照的差异数据异步发送到另一块磁盘甚至远程机器,只传输实际变化过的块,网络和存储开销很低。
  • 恢复误删文件:发现误删文件后,可以直接进入最近的一次快照目录,将文件复制回当前系统,无需启动复杂的恢复工具。

示例:

# 创建 @root 子卷的只读快照
btrfs subvolume snapshot -r /mnt/btrfs-data/@root /mnt/btrfs-data/snapshots/root-20260101

# 列出所有子卷和快照
btrfs subvolume list /mnt/btrfs-data

# 回滚:删除当前子卷,从快照创建可写副本
btrfs subvolume delete /mnt/btrfs-data/@root
btrfs subvolume snapshot /mnt/btrfs-data/snapshots/root-20260101 /mnt/btrfs-data/@root

真实场景中的注意事项

  • 需要定期清理旧快照,否则久而久之所有空间会被历史数据占满。可以使用 btrfs subvolume delete 手动删除,或配合自动化工具如 snapper 来管理保留策略。
  • 快照的共享数据块会随着原卷和快照的各自修改而逐渐“分离”,占用更多空间。实际使用中,监控 Btrfs 的专用命令 btrfs filesystem usage 比通用工具 df 更能反映真实的磁盘消耗。
  • Btrfs 本身还在持续发展,早期版本中某些 RAID 组合(如 RAID5/6)的可靠性有已知问题,生产环境建议关注对应内核版本的发布说明,优先使用默认的 RAID1 或 single/mdup 模式存放数据。

总结而言,Btrfs 的写时复制、子卷和快照让数据保护和灵活管理变得触手可及,尤其适合需要频繁快照、快速回滚和本地实验的环境。如果你希望文件系统不仅是一个“静态容器”,而是主动帮你守护数据的工具,Btrfs 是 Linux 生态中值得信赖的选择。