下一代Linux文件系统-btrfs
2013-03-02 12:49:53 阿炯

Btrfs(B-tree 文件系統, 通常念成 Butter FS,Better FS 或 B-tree FS),是由Oracle于2007年宣布并进行中的支持写入时复制(COW)的文件系统。目标是取代Linux目前的ext3文件系统,改善ext3的限制,特別是单个文件的大小,总文件系统大小或文件检查和加入ext3未支持的功能,像是可写快照(writable snapshots)、快照的快照(snapshots of snapshots)、内建磁盘阵列(RAID),以及子卷(subvolumes)。Btrfs 也宣称专注在“容错、修复及易于管理”。

它是一个 Linux 中的新的写时复制(copy-on-write (COW))的文件系统,目的是实现高级功能的同时着重与容错功能,修复功能以及易于管理。目前由Oracle, Red Hat, 富士通, Intel, SUSE以及其他组织共同开发,在 GPL 许可证下发行,同时向任何人公开贡献代码。

特性
联机碎片整理
联机卷生长和收缩
联机块设备增加和删除
联机负载均衡(块设备间的对象移动以达到平衡)
文件系统级的镜像(类RAID-1)、条带(类RAID-0)
子卷(一个或多个单独可挂载基于每个物流分区)
透明压缩(目前支持zlib和LZO)
快照(只读和可写,写复制,子卷复制)
文件克隆
数据和元数据的校验和(目前是CRC-32C)
就地转换(带回滚)ext3/4
文件系统种子
用户定义的事务
块丢弃支持

具体体现在:
写时复制 (Copy-On-Write (CoW))
CoW(写时复制)具有许多优点,但是对大文件的随机小写入有一定的负面性能影响。可以使用 recomended 为数据库文件和虚拟磁盘文件禁用CoW。 你可以在挂载时使用”nodatacow“选项来禁用整个块的CoW特性。这将禁用整个文件系统的CoW特性。

多设备文件系统和RAID特性
多设备文件系统

当创建btrfs文件系统时,你可以将任意个分区或磁盘设备传给mkfs.btrfs。创建的文件系统将跨这些设备。你可以按这种办法"合并"多个分区或设备来得到一个大btrfs文件系。

也可从现存的btrfs文件系统中增加或移除设备(务必小心)。

RAID特性
创建跨多设备文件系统时,你也可指定加入文件系统的设备使用RAID0、RAID1或RAID10。

子卷
子卷是btrfs的特性之一。子卷实质上是一个保存文件和目录的命名的B树。它们的inode保存在树根之树中,可以为非根用户和组所有。子卷可选设定块配额。子卷内的所有块和文件区段都有引用计数以便做快照。和虚拟机存储的动态扩展相似,其只按需使用设备空间,消除了许多半满的分区。用户也可用不同的挂载选项挂载子卷,得到更灵活的安全性。

快照
快照不是递归包含的,这意味着子卷内的子卷在快照里是空目录。

碎片整理
Btrfs支持在线碎片整理。

压缩
Btrfs支持透明压缩,这意味着分区里的每个文件都被自动压缩。这不单减小了文件的大小,还提高了性能,特别是在使用lzo算法时。用compress=gzip或
compress=lzo挂载选项打开压缩功能。
只有在加入挂载选项后创建或修改的文件会被压缩,所以要充分利用压缩特性,最好安装时就启用压缩功能。

其它术语
COW 事务

理解 COW 事务,必须首先理解 COW 和事务这两个术语。

什么是 COW?
所谓 COW,即每次写磁盘数据时,先将更新数据写入一个新的 block,当新数据写入成功之后,再更新相关的数据结构指向新 block 。

什么是事务?
COW 只能保证单一数据更新的原子性。但文件系统中很多操作需要更新多个不同的元数据,比如创建文件需要修改以下这些元数据:
修改 extent tree,分配一段磁盘空间
创建一个新的 inode,并插入 FS Tree 中
增加一个目录项,插入到 FS Tree 中

任何一个步骤出错,文件便不能创建成功,因此可以定义为一个事务。COW 事务能够保证文件系统的一致性,并且系统 Reboot 之后不需要执行 fsck 。

Checksum-校验和
Checksum 技术保证了数据的可靠性,避免 silent corruption 现象。由于硬件原因,从磁盘上读出的数据会出错。比如 block A 中存放的数据为 0x55,但读取出来的数据变是 0x54,因为读取操作并未报错,所以这种错误不能被上层软件所察觉。

解决这个问题的方法是保存数据的校验和,在读取数据后检查校验和。如果不符合,便知道数据出现了错误。

ext2/3 没有校验和,对磁盘完全信任。而不幸的是,磁盘的错误始终存在,不仅发生在廉价的 IDE 硬盘上,昂贵的 RAID 也存在 silent corruption 问题。而且随着存储网络的发展,即使数据从磁盘读出正确,也很难确保能够安全地穿越网络设备。

btrfs 在读取数据的同时会读取其相应的 checksum 。如果最终从磁盘读取出来的数据和 checksum 不相同,btrfs 会首先尝试读取数据的镜像备份,如果数据没有镜像备份,btrfs 将返回错误。写入磁盘数据之前,btrfs 计算数据的 checksum 。然后将 checksum 和数据同时写入磁盘。

Btrfs 采用单独的 checksum Tree 来管理数据块的校验和,把 checksum 和 checksum 所保护的数据块分离开,从而提供了更严格的保护。假如在每个数据 block 的 header 中加入一个域保存 checksum,那么这个数据 block 就成为一个自己保护自己的结构。这种结构下有一种错误无法检测出来,比如本来文件系统打算从磁盘上读 block A,但返回了 block B,由于 checksum 在 block 内部,因此 checksum 依旧是正确的。 btrfs 采用 checksum tree 来保存数据块的 checksum,避免了上述问题。

Btrfs 采用 crc32 算法计算 checksum,在将来的开发中会支持其他类型的校验算法。为了提高效率,btrfs 将写数据和 checksum 的工作分别用不同的内核线程并行执行。

隶属富士通 Linux 开发部门的 Satoru Takeuchi 表示富士通从 2010 年开始就开始进行 Btrfs 的相关开发,因为这是唯一能满足关键任务系统的稳定及健壮需求的文件系统。摘录其演示文稿的中的一些要点如下:

通过示意图方式快速介绍了 Btrfs 的功能特点,简洁易懂。还搞不清 CoW 和子卷概念的大家别错过。

CoW 方式的文件极大的提高了健壮性,在富士通的测试中完胜 Ext4 及 XFS。

文件卷的性能胜过 LVM 及 dm-thinp 。

从 Kernel 3.0 到现在,每个版本 150 个左右和 Btrfs 相关的补丁,其中错误修复占大多数,不过几乎每次发布都会引入新功能。其中也有富士通的一部分贡献。

在与 Ext4 及 XFS 的性能测试方面, Btrfs 不是胜出就是不相上下。从这个角度看性能方面令人满意。

目前 Btrfs 已经可以适用于除 RAID 5/6 以外的所有环境,特别适合 RAID 1 和 RAID 10 。推荐搭配最新的稳定版内核使用。

接下来将继续完善 RAID 5/6 的支持,丰富 Btrfs 文件系统的用户态工具。



最新版本:3.2


项目主页:https://btrfs.wiki.kernel.org/index.php/Main_Page

参考页面:
新一代 Linux 文件系统 btrfs 简介
Btrfs (简体中文)
Btrfs-维基百科