下一代 Linux 文件系統:NiLFS(2) 和 exofs

 一種新的 Linux 文件系統的公佈總是令人既興奮又恐懼。興奮是因爲文件系統意味着新的發展空間。恐懼是因爲文件系統在早期還是試驗性的,尚未迎來黃金時期。但是有時候,新 文件系統的公佈也意味着對 Linux 未來的投資,而最近 2.6.30-rc1 的公佈確實標示着令人感興趣的前景。在過去幾個季度,Linux 主要公佈了三種文件系統。2008 年底引入了 B-Tree File System(Btrf),最近又引入了兩種獨特的文件系統:NiLFS(2) 和 exofs。

文件系統背景知識

我們首先了解這些非傳統文件系統,然後探索 NiLFS(2) 和 exofs 的細節。

日誌結構文件系統

日誌結構文件系統和 SSDs

日誌結構文件系統是用於由 NAND 閃存組成的固態硬盤(solid-state disks,SSD)的理想格式。閃存的基本問題是寫擦週期數量有限。日誌可以寫到整個設備上,儘量寫滿設備,從而最大程度地減少擦的週期。由於這個原 因,日誌結構文件系統在 SSD 上(連續寫)表現非常好,並且提供更好的損耗均衡。

日誌結構文件系統在現代計算系統中有豐富的歷史。第一個日誌結構文件系統由 John Ousterhout 和 Fred Douglis 在 1988 年提出,隨後由 Sprite 操作系統在 1992 年實現。顧名思義,日誌結構文件系統將文件系統視爲一個循環日誌,將新的數據和文件系統元數據寫到日誌的頭部,並且從尾部回收空閒空間(如圖 1 所示)。這意味着數據可能在日誌中出現兩次或更多次,但是由於日誌是按時間先後順序發展的,最近的數據被視作活動數據。日誌中保留數據的多個副本可以帶來 一些有趣的優點,後面將詳細談到這些優點。

圖 1. 日誌結構文件系統的示意圖
日誌文件系統

與其說日誌結構方法是一個賣點,不如說它是體系結構上的一個細節,不過這種方法確實有一些獨特的優點。一個關鍵的優點在於系統崩潰後的數據恢 復,當使用日誌結構方法時,這種恢復更簡單。

另一個優點是利用底層存儲系統挖掘性能。您也許還記得,連續寫到硬盤比隨機 I/O 要快得多。如果所有的寫都是連續的,那麼查找的開銷隨之減少,從而可以獲得更快的硬盤 I/O,進而得到更快的文件系統。

基於對象的存儲系統

傳統存儲系統依賴於磁盤驅動器和它們的本地接口持久地存儲數據。這些接口依賴於塊存儲語義,大小固定的數據小塊與它們的映射(文件系統元數 據)相關聯。對象存儲系統則採用截然不同的方法:它們不是管理大小固定的數據塊,而是管理大小可變的對象以及相關聯的元數據(提供關於對象的系統級信 息)。

對象存儲設備和標準

對象存儲設備基於 T-10 Object Storage Devices(OSD)標準。該規範詳細描述了用於支持對象級管理的對標準 SCSI 命令集的擴展。除了定義對象級訪問方法外,該規範還包括安全性和元數據管理。

對象存儲系統是解決包含多租戶和安全性的可伸縮存儲的唯一途徑。構建作爲一種標準的 OSD(見側邊欄)的方式有很多種。例如可以使用遵從 OSD 的組件(例如 OSD 驅動器和啓動器)或更高級的組件(在傳統驅動器上構建 OSD 行爲的目標系統)。但是,基於塊的存儲系統與基於對象的存儲系統之間的根本區別在於,在基於塊的存儲系統中,是從塊集合創建對象的,塊中既包括數據,又包 括使用某種協議與塊通信的元數據。而在基於對象的存儲系統中,是與對象和它們的關聯元數據通信的(如圖 2 所示)。於是,對象存儲設備成爲對象的平面名稱空間(flat namespace),必要時,在存儲系統棧中的更高層建立層次結構。

圖 2. 基於塊的存儲系統與基於對象的存儲系統
基於塊的存儲系統與基於對象的存儲系統

本文探索基於對象的存儲系統上的一種文件系統的實現。

 


回頁首

 

日誌結構文件系統的一種新的實現:NiLFS(2)

NiLFS(2) 是日本 Nippon Telegraph and Telephone(NTT)開發的一種日誌結構文件系統的第二次迭代。該文件系統的開發非常活躍,最近已進入主流 Linux 內核(另外還有 NetBSD 內核)。第一版的 NILFS(version 1)出現於 2005 年,這個版本沒有任何形式的垃圾收集。在 2007 年,第 2 版首次發佈,其中包括一個垃圾收集器,並且可以創建和維護多個快照。今年(2009),NiLFS(2) 文件系統進入主流內核,可通過安裝它的可裝載模塊方便地啓用它。

NiLFS(2) 一個有趣的方面是,它支持連續快照(continuous snap-shotting)技術。由於 NILFS 是基於日誌結構的,新數據被寫到日誌的頭部,而舊數據仍然保留(直到需要對舊數據進行垃圾收集)。由於舊數據仍被保留,因此可以在時間線上回滾,以檢查文 件系統的不同時期(epoch)。在 NiLFS(2) 中,這些時期被稱作檢查點,它們是文件系統中不可或缺的一部分。每 當發生改變時,NiLFS(2) 都會創建這些檢查點,但是也可以強制創建檢查點。

包含快照的文件系統

NiLFS(2) 是衆多包含快照行爲的文件系統中的一種。其他包含快照的文件系統有 ZFS、LFS 和 Ext3cow。

可以在快照中查看和更改檢查點(恢復點)。可以像其他文件系統一樣將快照掛載到 Linux 文件系統空間中,但是目前它們還是隻讀的。這一點非常有用,因爲可以掛載快照,然後恢復之前刪除的文件,或者檢查之前版本的文件。

除了連續快照外,NiLFS(2) 還具有很多其他的優點。從可用性的角度看,最重要的優點是快速重啓。如果當前檢查點失效,文件系統只需回滾到上一個有效的檢查點,重新獲得有效的文件系 統。這顯然好於 fsck 進程。

NiLFS(2) 的挑戰

NiLFS(2) 版本和內核

這個 NiLFS(2) 演示 是在 2.6.27 Linux 內核中完成的。2.6.30-rc1 內核在 mainline 中包括 NiLFS(2),但是在這裏,NILFS 文件系統模塊和工具是從源代碼安裝的。請參閱 參 考資料 瞭解關於如何將 NiLFS(2) 安裝到內核中的信息。

雖然連續快照是一個很好的特性,但是也有一定的副作用。前面已經提到,它的優點在於它是日誌結構的,採用連續寫的方式(減少物理磁盤的查找行 爲),因此非常快。而缺點在於,它是日誌結構的,所以需要垃圾收集,以便清理舊的數據和元數據。一般情況下,這種文件系統非常快,但是一旦需要進行垃圾收 集,性能就會慢下來。

探索 NiLFS(2)

我們來看看 NiLFS(2) 的實際應用。這個演示展示如何在循環設備上創建一個 NiLFS(2) 文件系統(測試文件系統的一種簡單方法),然後看看 NiLFS(2) 的一些特性。首先安裝 NiLFS(2) 內核模塊:

$ sudo modprobe nilfs2
$

 

接下來,創建一個文件,該文件將包含文件系統(主機操作系統上的一個區域,可通過循環設備將它掛載爲操作系統本身的文件系統),然後使用 mkfs 在其中構建 NiLFS(2) 文件系統(如圖 1 所示)。

清單 1. 準備 NiLFS(2) 文件系統

				
$ dd if=/dev/zero of=/tmp/disk.img bs=384M count=1
1+0 records in
1+0 records out
402653184 bytes (403 MB) copied, 60.7253 s, 6.6 MB/s
$ mkfs.nilfs2 /tmp/disk.img
mkfs.nilfs2 ver 2.0
Start writing file system initial data to the device
Blocksize:4096 Device:/tmp/disk.img Device Size:402653184
File system initialization succeeded !!
$

 

現在,您有了自己的以 NiLFS(2) 文件系統格式初始化的磁盤鏡像。接下來,使用循環設備將該文件系統掛載到一個掛載點上(如清單 2 所示)。注意,當掛載文件系統時,會啓動一個用戶空間程序 nilfs_cleanerd,以提供垃圾收集服務。

清單 2. 使用循環設備掛載 NiLFS(2)

				
$ sudo losetup /dev/loop0 /tmp/disk.img
$ sudo mkdir /mnt/nilfs
$ sudo mount -t nilfs2 /dev/loop0 /mnt/nilfs/
mount.nilfs2: WARNING! - The NILFS on-disk format may change at any time.
mount.nilfs2: WARNING! - Do not place critical data on a NILFS filesystem.
$ ls /mnt/nilfs
$

 

現在,在該文件系統中添加一些文件,然後使用 lscp 命令列出當前可用的檢查點(如清單 3 所示)。使用 mkcp 命令定義一個快照,然後再次查看檢查點。第二次執行 lscp 命令時可以看到新創建的快照(所有檢查點和快照都有一個 CNO,或檢查點號)。

清單 3. 列出檢查點和創建快照

				
$ cd /mnt/nilfs
$ sudo touch file1.txt file2.txt
$ lscp
CNO DATE TIME MODE FLG NBLKINC ICNT
1 2009-08-21 22:29:31 cp - 11 3
2 2009-08-21 22:36:44 cp - 11 5
$ sudo mkcp -s
$ lscp
CNO DATE TIME MODE FLG NBLKINC ICNT
1 2009-08-21 22:29:31 cp - 11 3
2 2009-08-21 22:36:44 ss - 11 5
3 2009-08-21 22:39:47 cp i 7 5
$

 

現在有了一個快照,接下來同樣使用 touch 命令再將一些文件添加到當前文件系統中(如清單 4 所示)。

清單 4. 將更多文件添加到 NiLFS(2) 文件系統中

				
$ sudo touch file3.txt file4.txt
$ ls
file1.txt file2.txt file3.txt file4.txt
$

 

現在,掛載快照作爲一個只讀文件系統。這和之前的掛載類似,但是需要指定掛載的快照。爲此可以使用 cp 選項。從之前的 lscp 命令中可以看出,快照是 CNO=2。在 mount 命令中使用這個 CNO 掛載只讀文件系統。掛載後,首先使用 ls 命令列出掛載的讀/寫文件系統,然後查看所有的文件。在只讀快照中,只能看到兩個文件,這兩個文件是創建快照時存在的兩個文件(如清單 5 所示)。

清單 5. 掛載只讀 NiLFS(2) 快照

				
$ sudo mkdir /mnt/nilfs-ss2
$ sudo mount.nilfs2 -r /dev/loop0 /mnt/nilfs-ss2/ -o cp=2
$ ls /mnt/nilfs
file1.txt file2.txt file3.txt file4.txt
$ ls /mnt/nilfs-ss2/
file1.txt file2.txt
$

 

注意,一旦將檢查點轉換爲快照,這些快照將持久存在。當需要清理出空間時,檢查點會被從文件系統中回收,而快照可以持久存在。

該演示展示了用於 NiLFS(2) 的兩個命令行實用程序:lscp(列出檢查點和快照)和 mkcp(創 建檢查點或快照)。有一個名爲 chcp 的實用程序,用於將檢查點轉換爲快照,或者將快照轉換爲檢查點;還有一個 rmcp 實用程序,用於使檢查點或快照無效。

鑑於這種文件系統是臨時性的,NTT 已經爲將來考慮了一些非常有創新性的工具 — 例如,tls(臨時 ls)、tdiff(臨 時 diff)和tgrep(臨時 grep)。下一步引入基於時間 的功能似乎是合乎情理的。

 


回頁首

 

Extended Object File System(exofs)

Extended Object File System(exofs)是構建在對象存儲系統上的一種傳統的 Linux 文件系統。exofs 最初由 IBM 的 Avnishay Traeger 開發,當時被稱作 OSD 文件系統,或稱作 osdfs。然後,Panasas(一家構建對象存儲系統的公司)接管該項目,並將它重新命名爲 exofs(因爲它的祖先來自 ext2 文件系統)。

對象存儲系統上的文件系統

從概念上講,對象存儲系統可以視作對象的平面名稱空間和它們的關聯元數據。而在基於塊的傳統存儲系統,元數據要佔用一些塊,以提供語義黏合 劑。圖 3 顯示 exofs 的架構圖。Virtual File System Switch(VFS)爲 exofs 提供一條途徑,在其中,exofs 通過一個本地 OSD 啓動器與對象存儲系統通信。OSD 啓動器實現 OSD T-10 標準 SCSI 命令集。

圖 3. exofs/OSD 生態系統架構圖
exofs/OSD 生態系統架構圖

exofs 背後的思想是在 OSD 後備存儲上提供一個傳統文件系統。這樣一來,就更容易遷移到對象級存儲,因爲提供的文件系統本身是傳統的文件系統。

文件系統映射

OSD 中的每個對象由平面名稱空間中一個 64 位的標識符表示。爲了將標準 POSIX 接口疊加到對象存儲系統上,需要一個映射。exofs 提供一個簡單的映射,這種映射還是可伸縮、可擴展的。

文件系統中的文件由 inode 唯一地表示。exofs 將 inode 映射到對象系統中的對象標識符(OID)。在對象系統中,使用對象表示文件系統的所有元素。文件被直接映射到對象,目錄也是文件,只不過是引用目錄中所含 文件的文件(採用文件名和 inode-OID 對的形式)。圖 4 簡明地闡釋了這一點。另外還有一些其他的對象,用於支持 inode 位圖(用於 inode 分配)等。

圖 4. OSD 表示法示意圖
OSD 表示法示意圖

用於表示對象空間中的對象的 OID 長度爲 64 位,因此支持非常多的對象。

爲什麼選擇對象存儲?

對象存儲是一個有趣的思想,可大幅提高系統的可伸縮性。它將文件系統的一些部分從主機轉移到存儲子系統中。爲此需付出一定的代價,但是通過將 文件系統的一些部分分佈到多個端點,可以分散工作負載,使基於對象的方法更易於伸縮到更大的存儲系統。主機操作系統不再需要考慮塊到文件的映射,存儲設備 本身會提供這種映射,因此主機可以在文件級進行操作。

對象存儲系統還提供查詢可用元數據的能力。這可以帶來更多的好處,因爲搜索能力可以分佈到端點對象系統。

最近,對象存儲在雲存儲領域迴歸。雲存儲提供商(將存儲作爲服務出售)以對象的形式提供他們的存儲,而不是以傳統的塊 API 的形式提供存儲。這些提供商實現用於對象傳輸、管理和元數據管理的 API。

 


回頁首

 

結束語

雖然 NiLFS(2) 和 exofs 將成爲現有 Linux 文件系統的令人感興趣的、有用的補充,但是還有更多的文件系統相繼涌現。我們看到了最近引入的 Btrfs(來自 Oracle),它爲 Sun Microsystems 的 Zettabyte File System(ZFS)提供 Linux 選擇。另一個最近出現的文件系統是 Ceph,它提供一個可靠的基於 POSIX 的分佈式文件系統,這種文件系統沒有單點故障。今天,我們發現一種新的日誌結構文件系統,並看到一個文件系統被引入到對象存儲上。Linux 不斷證明它是一流的研究平臺,也是企業級的操作系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章