Linux flash檔案系統剖析

來源:互聯網
上載者:User

您之前可能聽說過 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 記憶體技術

  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 列表表示裝置中的塊全部為有效垃圾收集演算法通過合理的方法智能地判斷應該回收的塊。目前,這個演算法根據機率從 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 檔案系統的架構非常有趣,並在還將是未來技術創新的源泉。

節點。dirty 列表中的塊至少包含有一個廢棄節點。最後,free 列表包含曾經執行過擦除操作並且可以使用的塊。

     

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.