歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Linux+flash+文件系統剖析

文章出自:http://www.ibm.com/developerworks/cn/linux/l-flash-filesystems/
  您之前可能聽說過 Journaling Flash File System(JFFS)和 Yet Another Flash File System(YAFFS),但是您知道使用底層 flash 設備的文件系統意味著什麼嗎?本文將向您介紹 Linux® 的 flash 文件系統,並探索它們如何通過平均讀寫(wear leveling)處理底層的可消耗設備(flash 部件),並鑒別各種不同的 flash 文件系統以及它們的基本設計。
  固態驅動器當前非常流行,但是嵌入式系統很久以前就開始使用固態驅動器進行存儲。您可以看到 flash 系統被用於個人數字助理(PDA)、手機、MP3 播放器、數碼相機、USB flash 驅動(UFD),甚至筆記本電腦。 很多情況下,商業設備的文件系統可以進行定制並且是專有的,但是它們會遇到以下挑戰。

Flash 內存技術

  Flash 內存(可以通過幾種不同的技術實現)是一種非揮發性內存,這意味著斷開電源之後其內容仍然保持下來。
  兩種最常見的 flash 設備類型為:NOR 和 NAND。基於 NOR 的 flash 技術比較早,它支持較高的讀性能,但以降低容量為代價。NAND flash 提供更大容量的同時實現快速的寫擦性能。NAND 還需要更復雜的輸入/輸出(I/O)接口。
  Flash 部件通常分為多個分區,允許同時進行多個操作(擦除某個分區的同時讀取另一個分區)。分區再劃分為塊(通常大小為 64KB 或 128KB)。使用分區的固件可以進一步對塊進行獨特的分段 — 例如,一個塊中有 512 字節的分段,但不包括元數據。
  Flash 設備有一個常見的限制,即與其他存儲設備(如 RAM 磁盤)相比,它需要進行設備管理。flash 內存設備中惟一允許的 Write 操作是將 1 修改為 0。如果需要撤銷操作,那麼必須擦除整個塊(將所有數據重置回狀態 1)。這意味著必須刪除該塊中的其他有效數據來實現持久化。NOR flash 內存通常一次可以編寫一個字節,而 NAND flash 內存必須編寫多個字節(通常為 512 字節)。
  這兩種內存類型在擦除塊方面有所不同。每種類型都需要一個特殊的 Erase 操作,該操作可以涵蓋 flash 內存中的一個整塊。NOR 技術需要通過一個准備步驟將所有值清零,然後再開始 Erase 操作。Erase 是針對 flash 設備的特殊操作,非常耗費時間。擦除操作與電有關,它將整個塊的所有單元中的電子放掉。
  NOR flash 設備通常需要花費幾秒時間來執行 Erase 操作,而 NAND 設備只需要幾毫秒。flash 設備的一個關鍵特性是可執行的 Erase 操作的數量。在 NOR 設備中,flash 內存中的每個塊可被擦除 100,000 次,而在 NAND flash 內存中可達到一百萬次。

Flash 內存面臨的挑戰

  除了前面提到的一些限制以外,管理 flash 設備還面臨很多挑戰。三個最重大的挑戰分別是垃圾收集、管理壞塊和平均讀寫。

垃圾收集

  垃圾收集 是一個回收無效塊的過程(無效塊中包含了一些無效數據)。回收過程包括將有效數據移動到新塊,然後擦除無效塊從而使它變為可用。如果文件系統的可用空間較少,那麼通常將在後台執行這一過程(或者根據需要執行)。

管理壞塊

  用的時間長了,flash 設備就會出現壞塊,甚至在出廠時就會因出現壞塊而不能使用。如果 flash 操作(例如 Erase)失敗,或者 Write 操作無效(通過無效的錯誤校正代碼發現,Error Correction Code,ECC),那麼說明出現了壞塊。
  識別出壞塊後,將在 flash 內部將這些壞塊標記到一個壞塊表中。具體操作取決於設備,但是可以通過一組獨立的預留塊來(不同於普通數據塊管理)實現。對壞塊進行處理的過程 — 不管是出廠時就有還是在使用過程中出現 — 稱為壞塊管理。在某些情況下,可以通過一個內部微控制器在硬件中實現,因此對於上層文件系統是透明的。

平均讀寫

  前面提到 flash 設備屬於耗損品:在變成壞塊以前,可以執行有限次數的反復的 Erase 操作(因此必須由壞塊管理進行標記)。平均讀寫算法能夠最大化 flash 的壽命。平均讀寫有兩種形式:動態平均讀寫 和靜態平均讀寫 。
  動態平均讀寫解決了塊的 Erase 周期的次數限制。動態平均讀寫算法並不是隨機使用可用的塊,而是平均使用塊,因此,每個塊都獲得了相同的使用機會。靜態平均讀寫算法解決了一個更有趣的問題。除了最大化 Erase 周期的次數外,某些 flash 設備在兩個 Erase 周期之間還受到最大化 Read 周期的影響。這意味著如果數據在塊中存儲的時間太長並且被讀了很多次,數據會逐漸消耗直至丟失。靜態平均讀寫算法解決了這一問題,因為它可以定期將數據移動到新塊。

系統架構

  到目前為止,我已經討論了 flash 設備及其面臨的基本挑戰。現在,讓我們看看這些設備如何組合成為一個分層架構的一部分(參加圖 1)。架構的頂層是虛擬文件系統(VFS),它為高級應用程序提供通用接口。VFS 下面是 flash 文件系統(將在下節介紹)。接下來是 Flash 轉換層(Flash Translation Layer,FTL),它整體管理 flash 設備,包括從底層 flash 設備分配塊、地址轉換、動態平均讀寫和垃圾收集。在某些 flash 設備中,可以在硬件中實現一部分 FTL 。

圖 1. flash 系統的基本架構
  Linux 內核使用內存技術設備(Memory Technology Device,MTD)接口,這是針對 flash 系統的通用接口。MTD 可以自動檢測 flash 設備總線的寬度以及實現總線寬度所需設備的數量。

Flash 文件系統

  Linux 可以使用多種 flash 文件系統。下一小節將解釋每種文件系統的設計和優點。

Journaling Flash File System

  Journaling Flash File System 是針對 Linux 的最早 flash 文件系統之一。 JFFS 是一種專門為 NOR flash 設備設計的日志結構文件系統。它非常獨特,能夠解決許多 flash 設備問題,但同時也導致一些新問題。
  JFFS 將 flash 設備視為一種循環的塊日志。寫入 flash 的數據被寫到了空間的末尾,開始部分的塊則被收回,而兩者之間的空間是空閒的;當空間變少時,將執行垃圾收集。垃圾收集器將有效塊移動到日志的尾部,跳過無效或廢棄塊,並擦除它們(參見圖 2)。因此這種文件系統可以自動實現靜態和動態平均讀寫。這種架構的主要缺點是過於頻繁地執行擦除操作(而沒有使用最佳擦除策略),從而使設備迅速磨損。

圖 2. 在垃圾收集之前和之後循環日志
  掛載 JFFS 時結構細節將讀取到內存中,這將延緩掛載時間並消耗更多的內存。
  

Journaling Flash File System 2

  盡管 JFFS 在早期非常有用,但是它的平均讀寫算法容易縮短 NOR flash 設備的壽命。因此重新設計了底層算法,去掉了循環日志。JFFS2 算法專門為 NAND flash 設備設計,並且改善壓縮性能。
  在 JFFS2 中,flash 中的每個塊都是單獨處理的。JFFS2 通過維護塊列表來充分地對設備執行平均讀寫。clean 列表表示設備中的塊全部為有效節點。dirty 列表中的塊至少包含有一個廢棄節點。最後,free 列表包含曾經執行過擦除操作並且可以使用的塊。
  垃圾收集算法通過合理的方法智能地判斷應該回收的塊。目前,這個算法根據概率從 clean 或 dirty 列表中選擇。dirty 列表的選擇概率為 99%(將有效內容移到另一個塊),而 clean 列表的選擇概率為 1%(將內容移到新的塊)。在這兩種情況中,對選擇的塊執行擦除操作,然後將其置於 free 列表(參見圖 3)。這允許垃圾收集器重用廢棄的塊,但是仍然圍繞 flash 移動數據,以支持靜態平均讀寫。

圖 3. JFFS2 中的塊管理和垃圾收集

Yet Another Flash File System

  YAFFS 是針對 NAND flash 開發的另一種 flash 文件系統。最早的版本(YAFFS)支持 512 字節頁面的 flash 設備,但是較新的版本(YAFFS2)支持頁面更大的新設備以及更大的 Write 限制。
  大多數 flash 文件系統會對廢棄塊進行標記,但是 YAFFS2 使用單調遞增數字序列號額外地標記塊。在掛載期間掃描文件系統時,可以快速標識有效的 inode。YAFFS 保留在 RAM 中的樹以表示 flash 設備的塊結構,包括通過檢查點(checkpointing)實現快速掛載 — 這個過程將在正常卸載時將 RAM 樹結構保存到 flash 設備,以在掛載時快速讀取和恢復到 RAM(參見圖 4)。與其他 flash 文件系統相比,YAFFS2 的掛載時性能是它的最大優勢。

圖 4. YAFFS2 中的塊管理和垃圾收集

只讀式壓縮文件系統

  在某些嵌入式系統中,沒有必要提供可更改的文件系統:一個不可更改(immutable)的文件系統已經足夠。Linux 支持多種只讀文件系統,最有用的兩種是 cramfs 和 SquashFS。

Cramfs

  cramfs 文件系統是一種可用於 flash 設備的壓縮式 Linux 只讀文件系統。cramfs 的主要特點是簡單和較高的空間利用率。這種文件系統用於內存占用較小的嵌入式設計。
  雖然 cramfs 元數據沒有經過壓縮,但是 cramfs 針對每個頁面使用 zlib 壓縮,從而允許隨機的頁面訪問(訪問時對頁面進行解壓縮)。
  您可以通過 mkcramfs 實用工具和 loopback 設備嘗試使用 cramfs。

SquashFS

  SquashFS 是另一種可用於 flash 設備的壓縮式 Linux 只讀文件系統。您可以在很多 Live CD Linux 發行版中找到 SquashFS。除了支持 zlib 壓縮外,SquashFS 還使用 Lembel-Ziv-Markov chain Algorithm (LZMA) 改善壓縮並提高速度。
  和 cramfs 一樣,您可以通過 mksquashfs 和 loopback 設備在標准 Linux 系統上使用 SquashFS。

結束語

  和大多數開放源碼一樣,軟件在不斷演變,並且新的 flash 文件系統正在開發之中。一種還處於開發階段的有趣的備選文件系統是 LogFS,它包含了一些非常新穎的想法。例如,LogFS 在 flash 設備中保持了一個樹結構,因此掛載時間和傳統的文件系統差不多(比如 ext2)。它還使用一種復雜的樹實現垃圾收集(一種 B+樹形式)。然而,LogFS 最有趣的地方是它具有出色的可伸縮性並且支持大型 flash 部件。
  隨著 flash 文件系統的日益流行,您將看到針對它們的大量研究。LogFS 就是一個例子,但是其他類似於 UbiFS 的文件系統也在不斷發展。Flash 文件系統的架構非常有趣,並在還將是未來技術創新的源泉。
Copyright © Linux教程網 All Rights Reserved