定义
Btrfs是一种面向Linux的写入时复制文件系统,内核文档将其目标描述为在实现高级特性的同时兼顾容错、修复与易管理[3]。它的名称来源于实现中所采用的B树数据结构,因此常被读作Butter FS、Better FS或B-tree FS,但这个名字并非严格意义上的缩写[4][1]。它最初由甲骨文公司的开发者发起,后由多家企业共同参与开发,并以GPL授权开放贡献[3]。
按照内核文档的列举,Btrfs提供基于extent的文件存储、小文件与索引目录的高效打包、动态inode分配、可写快照、子卷、数据与元数据校验和、压缩、多设备支持与多种RAID算法、离线文件系统检查、增量备份与在线碎片整理等能力[3]。这些能力中的多数在传统的ext类文件系统中并不直接提供,因此Btrfs被设计为一种从底层重新构建的文件系统[5]。
原理
Btrfs的核心是写入时复制(copy-on-write)的B树结构。写入数据时,文件系统不会就地覆盖原有的数据块,而是把新的数据写到磁盘的其他位置,再更新指针,从而保留被覆盖数据的旧副本[6]。这种机制使快照可以在几乎不复制数据的情况下生成:快照只是复制当前的一套元数据,并把这些数据块标记为写入时复制,此后无论是原数据还是快照数据被修改,都会分配新块而共享未改动的数据[7]。其概念可以用下式概括:写入新数据时 $旧块保留 o 新块分配 o 指针更新$。
Btrfs内部的所有元数据均由B树管理,不同的元数据由不同的树负责,超级块中保存着这些树的根指针[2]。其中FS Tree管理inode、目录等文件元数据,Chunk Tree记录磁盘设备,Extent Tree管理磁盘空间分配,checksum Tree保存数据块的校验和,Tree of tree root则保存各个B树的根节点[2]。由于写入时复制会在图上产生共享与分叉,可用下图表示一次写入对树结构的影响:
graph TD
A[根节点] --> B[叶子1 引用1]
A --> C[叶子2 引用1]
A --> D[叶子3 引用1]
A2[新根节点] --> B2[叶子1 引用1]
A2 --> C2[叶子2 引用2]
A2 --> D2[叶子3 引用1]
为检测数据损坏,Btrfs为数据和元数据保存校验和,每次从磁盘读取数据块时都会核对校验和,以确认数据的完整性[8]。当校验和与数据不匹配时,若配置了镜像或RAID,文件系统可利用冗余副本恢复受损数据[5]。此外,Btrfs支持对文件进行克隆(reflink)操作,即建立一个新inode,使其初始与原文件共享磁盘块,但后续任一侧的修改不会反映到另一方[9]。
发展历程
Btrfs所依赖的写入时复制B树数据结构,最早由IBM研究员奥哈德·罗德(Ohad Rodeh)在2007年的USENIX会议上提出,他指出被广泛使用的B+树因叶子节点互相连接,难以高效地实现写入时复制快照[1]。同年,时任SUSE公司ReiserFS工程师、后加入Oracle的克里斯·梅森开始基于这种数据结构开发一个具备快照能力的文件系统,并几乎将其递归地用于元数据、文件数据乃至空间分配跟踪[1]。
2008年,ext3与ext4的主要开发者曹子德(Theodore Ts'o)评价ext4并非重大进步,认为Btrfs在可扩展性、可靠性与易管理性方面提供了改进,是更好的方向[1]。Btrfs带有最终磁盘格式的1.0版本于2008年底发布,随后于2009年1月被并入Linux 2.6.29内核主线,当时仍是实验性组件[10][1]。
2011年7月,Btrfs的自动碎片整理与擦除功能被合并进Linux 3.0内核,除Oracle的梅森外,富士通的Miao Xie也贡献了性能改进[1]。2012年,Oracle Linux于3月、SUSE Linux Enterprise于8月先后将Btrfs从实验状态转为生产或支持状态;2015年,Btrfs成为SUSE Linux Enterprise Server 12的默认文件系统[1]。2017年8月,红帽公司在RHEL 7.4发布说明中表示不再计划把Btrfs转为完全支持的功能,2019年5月Btrfs从RHEL 8中移除[1]。2020年,Btrfs被选为Fedora 33桌面版本的默认文件系统[1]。
应用
Btrfs的主要应用场景集中在Linux服务器、桌面发行版和网络附加存储设备。SUSE长期推动Btrfs,将其作为SUSE Linux Enterprise Server根分区的默认文件系统,理由是快照与回滚功能可简化服务器管理,便于管理员在需要时恢复到先前状态[11]。Fedora 33及之后的桌面版本同样将Btrfs作为默认文件系统[1]。
在网络附加存储领域,NETGEAR的ReadyNAS OS 6.0是较早把Btrfs引入商业环境的操作系统,提供快照、即时卷扩展等基于Btrfs的功能[2]。在容器场景中,Btrfs的子卷与快照能力可用于镜像分层和类似写入时复制的堆叠,因而被部分Docker部署所采用[12][11]。此外,Btrfs内建多设备与多种RAID配置文件支持,可在同一文件系统内组织多个不同容量与速度的物理设备,并动态增删存储容量[8][5]。
局限
Btrfs的RAID 5与RAID 6模式是其广被提及的薄弱环节。相关技术说明指出,这两种模式的实现与Btrfs“重定向写”和“磁盘上始终一致”的设计存在根本冲突,多个不同代的extent可能共享同一条RAID条带;同时Btrfs缺乏写入空洞保护,无法检测条带中数据块与校验块不一致的情况,在断电或系统崩溃后可能重建出错误数据,导致数据丢失[13]。开发者因此建议不要在元数据上使用RAID5/6,数据若使用该模式也应将元数据配置为RAID1[13]。
写入时复制机制本身也带来开销。由于数据变更时需要分配新块,文件系统需要进行某种形式的垃圾回收,否则块副本会迅速耗用可用空间;复制数据块相比直接覆盖可能更慢,并明显增加内存需求[6]。此外,每次文件被修改并通过写入时复制写往新位置后,它与旧快照之间的关联会逐渐减少,快照所实际占用的空间不易精确估算[14]。
在发行版支持方面,红帽公司并未将Btrfs作为完全支持的功能,Btrfs自RHEL 6测试版起仅作为技术预览包含,2019年5月被从RHEL 8中移除,红帽在RHEL 7中转而采用XFS[1]。这些情况说明,Btrfs虽已进入Linux内核主线多年,其部分高级特性与支持范围仍有限制。
参见
参考资料
- Btrfs [引用日期2026-10-14]
- BTRFS [引用日期2026-10-14]
- BTRFS¶ [引用日期2026-10-14]
- Oracle Linux 6: 管理者ソリューション・ガイド [引用日期2026-10-14]
- A Conversation with Chris Mason on BTRfs [引用日期2026-10-14]
- what makes BTRFS different? [引用日期2026-10-14]
- Btrfs: Subvolumes and snapshots [引用日期2026-10-14]
- ol-btrfs-about-the-btrfs-file-system [引用日期2026-10-14]
- BTRFS [引用日期2026-10-14]
- Btrfs Merged Into Mainline Linux Kernel [引用日期2026-10-14]
- What Is Btrfs? | phoenixNAP IT Glossary [引用日期2026-10-14]
- aliyun.com 上的网页 [引用日期2026-10-14]
- From opensuse Wed Mar 26 07:55:11 2025 [引用日期2026-10-14]
- sds-15-maier-btrfs-ausarbeitung(PDF) [引用日期2026-10-14]