ReiserFS

ReiserFS，是一种文件系统格式，作者是汉斯·瑞塞尔（Hans Reiser）及其团队Namesys，1997年7月23日他将ReiserFS文件系统在互联网上公布。Linux内核从2.4.1版本开始支持ReiserFS。

ReiserFS的命名是源自作者Hans Reiser的姓氏，这个日志型档案系统发展比ext2/3晚近许多。在技术上使用的是B*-tree为基础的档案系统，其特色为能很高效率地处理大型档案到众多小档案；实务上ReiserFS在处理档案小于1k小档案时，甚至效率可以比ext3快约10倍。

ReiserFS原先是Novell公司的SuSE Linux Enterprise采用的预设档案系统，直到2006年10月12日其宣称将在未来的版本改采ext3为预设。Novell公司否认这与Hans Reiser被控杀妻案有任何关联。

## 功能特点

与本文撰写的同期文件系统相比，ReiserFS有着许多其它文件系统所没有的优点。举例来说：

- Metadata-only journaling（also block journaling, since Linux 2.6.8）, its most-publicized advantage over what was the stock Linux file system at the time, ext2.
- 线上调整大小（只能变大，线上、离线代表的是挂载中或非挂载中），可以使用磁盘管理机制如LVM的方式来修改，也可以不用。因为这个缘故，所以Namsys公司有提供在离线时调整大小的工具（可以调整放大空间，也可以缩小空间）。
- 后缀包装（Tail Packing）减少内部磁盘空间分布破碎的情况。这个功能与别的档案系统相比有着相当明显的进步，另外值得一提的是，在Reiser4的发展里头，这个功能有更强大的进展，将同时保留长处并且不会影响到效能。

## 效能表现

和同样在Linux Kernel 2.4版本下的ext2及ext3相比较，处理4KB以下的小档案时（tail packing enable），ReiserFS的速度快了10到15倍。这对于网络新闻服务、HTTP快取、及电子邮件系统等需要处理大量小档案的网络服务是相当重要的功能改进。

然而因为ReiserFS还在使用BKL（the Big Kernel Lock）这个global kernel-wide lock，在某些情况下，它无法良好的在某些多核心系统上面执行scale动作，这是因为某些核心的动作一次只能由一个核心进行动作。

## 批评

有些目录的操作在ReiserFS上面并不同步，（包括像unlink (2)），可能会导致一些重度依赖档案锁（file-based lock）机制的应用程序上面资料的毁损，这些应用程序像是MTA的qmail、postfix等等，如果这些应用程序在磁盘同步之前就有可能造成这样的损害。

目前还没有磁盘整理的应用程序是可以对ReiserFS这个档案系统进行动作，虽然已经有工具是在做自动复制档案内容以期获得更多连续性的区块，在Reiser4释出的档案系统会有一个repacker的工具可以对磁盘破碎的情况最佳化。

### 磁区检查

ReiserFS索引树重建的的过程曾经引发过不少的争议：如果档案系统被毁坏的很严重，那内部的索引树就失效了，再执行索引树重建的操作更可能会让让这个毁坏的情况变得更严重、像是把索引指向不可预期的内容（8）。不过这个操作并不是正常操作的一部分，也不是一个正常的档案系统检查，在这种操作执行之前，就应该会有明确提示出现，由管理员确认后才可能发生。

尽管如此，为避免错误引导档案系统的处理，我们并不建议在一个ReiserFS v3的分割区上面储存一个原始未经加密或压缩改变形态的ReiserFS v3的影像档。在格式化一个现有的ReiserFS v3的分割区也可能会留下资料困扰重建的操作并且让旧系统上的档案重现。这个漏洞让恶意的使用者有机会困扰重建程序。在metadata经过档案系统检查之后还会维持旧有的状态，再破坏这个地方就会让档案内容以不可预期的方式结合包含着档案系统的metadata。

好消息是，它的下一代继承者，ReiserFS 4克服了这一点问题点。

### 较早的争议问题

ReiserFS在Linux kernel 2.4.16之前的版本被Namesys视作不稳定的版本，不被当成可以使用产品，特别是在NFS的应用上面。ReiserFS早先的应用（这里指的是Linux kernel 2.6.2之前）被看作是一堆地雷。像是，档案很容易就会在系统崩溃的时候意外的接上一堆没有用的垃圾，不过现在在ReiserFS里面的日志型档案系统的应用已经有一定的稳定。

## 架构设计

ReiserFS在一个单一复合B+树中存储文件的亚数据信息（stat item）、目录文件信息（directory items）、索引节点中的块列表（indirect items），这些信息都有唯一的标识号作为B+树的索引值。分配给B+树节点磁盘块称为“格式化的内部块”。分配给叶子节点的磁盘块称为“格式化的叶子块”（叶子节点中的信息是首尾相连，紧密存储的）。其他的块一概称为“未格式化块”，用来保存文件内容。如果一个节点带有太多目录项或者太大块列表的目录文件信息，就会被拆分到它右边的邻居节点中。所有的块分配过程会被跟踪记录到位于固定位置的空闲块位图中。

相对的，ext2和其它Berkeley FFS-like的档案系统则只简单的使用一个固定的方程式来计算节点的划分大小，这样的方式限制了档案系统可以包含的档案的数量。大多数这种类型的档案系统也简单地以线性表的方式储存目录项，在档案搜寻及更新的时间随文件系统的规模增加而线性增加。在ReiserFS中的单一B+树设计避免了这些问题，而且更具有弹性。

## 外部链接

- ReiserFS and Reiser4 wiki
- Namesys web site（archived version from 2007 October）
- Theodore Ts'o critiques the ReiserFS block journaling implementation
- convertfs，a utility which performs in-place conversion between any two file systems with sparse file support
- An overview of the ReiserFS on-disk format
- Florian Buchholz's The structure of the Reiser file system，a very detailed description of the ReiserFS disk structures.
- Gentoo Forum Link - Discussion on ReiserFS fragmentation, including a script for measuring fragmentation and defragmenting files.
- Reiser4 Future Vision
- Windows utilities to access ReiserFS: RFSGUI & RFSTOOL
- Filesystems（ext3, reiser, xfs, jfs）comparison on Debian Etch

## 基本资料

- 开发者：Namesys
- 发布：Linux 2.4.1
- 发布：2001
- 操作系统：Linux
- 分区标识：Apple_UNIX_SVR2（Apple Partition Map）、0x83（MBR）、EBD0A0A2-B9E5-4433-87C0-68B6B72699C7（GPT）
- 目录内容：B+ tree
- 文件分配：Bitmap
- 最长文件名：4032 bytes, limited to 255 by Linux VFS
- 最大文件数量：232（~4 billion）
- 最大卷容量：16 TiB
- 最大文件尺寸：8 TiB
- 文件名字符集：All bytes except NUL and `'/'`
- 日期记录：modification (mtime), metadata change (ctime), access (atime)
- 日期范围：December 14, 1901年12月14日 - 2038年1月18日
- 日期分辨率：1s
- 岔流：Extended attributes
- 文件系统权限：Unix permissions, ACLs and arbitrary security attributes
- 透明压缩：No
- 透明加密：No