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