嵌入式學習之Linux文件系統、

Linux 支持多種文件系統,包括 ext二、 ext三、 vfat、 ntfs、 iso9660、 jffs、 romfs和nfs 等,爲了對各種文件系統進行統一管理,Linux 引入了虛擬文件系統VFS(Virtual File System) ,爲各種文件系統提供一個統一的操做界面和應用編程接口。本文將和你們詳細介紹Linux文件系統相關知識,一塊兒來看看吧。linux

Linux 下的文件系統結構以下:編程

 

Linux 啓動時,第一個必須掛載的是根文件系統;若系統不能從指定設備上掛載根文件系統,則系統會出錯而退出啓動。以後能夠自動或手動掛載其餘的文件系統。所以,一個系統中能夠同時存在不一樣的文件系統。安全

  不一樣的文件系統類型有不一樣的特色,於是根據 存儲 設備的硬件特性、系統需求等有不一樣的應用場合。在嵌入式 Linux應用中,主要的 存儲 設備爲 RAM(DRAM, SDRAM)和ROM( 常採用FLASH 存儲器) ,經常使用的基於存儲設備的文件系統類型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。網絡

1. 基於 FLASH的文件系統併發

Flash ( 閃存 )做爲嵌入式系統的主要存儲媒介,有其自身的特性。 Flash 的寫入操做只能把對應位置的 1修改成 0 ,而不能把 0 修改成 1( 擦除 Flash 就是把對應存儲塊的內容恢復爲 1),所以,通常狀況下,向 Flash寫入內容時,須要先擦除對應的存儲區間,這種擦除是以塊 (block)爲單位進行的。oop

  閃存主要有 NOR 和NAND 兩種技術( 簡單比較見附錄) 。 Flash 存儲器的擦寫次數是有限的,NAND 閃存還有特殊的硬件接口和讀寫時序。所以,必須針對Flash 的硬件特性設計符合應用要求的文件系統;傳統的文件系統如ext2 等,用做Flash 的文件系統會有諸多弊端。性能

  在嵌入式 Linux 下, MTD(Memory Technology Device, 存儲技術設備 ) 爲底層硬件 (閃存) 和上層( 文件系統) 之間提供一個統一的抽象接口,即Flash 的文件系統都是基於MTD 驅動層的( 參見上面的Linux 下的文件系統結構圖) 。使用MTD 驅動程序的主要優勢在於,它是專門針對各類非易失性存儲器( 以閃存爲主) 而設計的,於是它對Flash 有更好的支持、管理和基於扇區的擦除、讀/ 寫操做接口。操作系統

  順便一提,一塊 Flash 芯片能夠被劃分爲多個分區,各分區能夠採用不一樣的文件系統;兩塊 Flash 芯片也能夠合併爲一個分區使用,採用一個文件系統。即文件系統是針對於存儲器分區而言的,而非存儲芯片。設計

(1) jffs2調試

JFFS 文件系統最先是由瑞典 Axis Communications公司基於 Linux2.0的內核爲嵌入式系統開發的文件系統。 JFFS2是 RedHat公司基於 JFFS開發的閃存文件系統,最初是針對 RedHat公司的嵌入式產品 eCos開發的嵌入式文件系統,因此 JFFS2也能夠用在 Linux, uCLinux中。

Jffs2: 日誌閃存文件系統版本 2 (Journalling Flash FileSystem v2)

  主要用於 NOR 型閃存,基於MTD 驅動層,特色是:可讀寫的、支持數據壓縮的、基於哈希表的日誌型文件系統,並提供了崩潰/ 掉電安全 保護,提供 「寫平衡 」支持等。缺點主要是當文件系統已滿或接近滿時,由於垃圾收集的關係而使jffs2 的運行速度大大放慢。

  目前 jffs3 正在開發中。關於jffs 系列文件系統的使用詳細文檔,可參考MTD 補丁包中mtd-jffs-HOWTO.txt 。

jffsx 不適合用於 NAND閃存主要是由於 NAND閃存的容量通常較大,這樣致使 jffs爲維護日誌節點所佔用的內存空間迅速增大,另外,jffsx 文件系統在掛載時須要掃描整個FLASH 的內容,以找出全部的日誌節點,創建文件結構,對於大容量的NAND閃存會耗費大量時間。

(2) yaffs : Yet Another Flash File System

yaffs/yaffs2 是專爲嵌入式系統使用 NAND型閃存而設計的一種日誌型文件系統。與jffs2相比,它減小了一些功能 (例如不支持數據壓縮 ),因此速度更快,掛載時間很短,對內存的佔用較小。另外,它仍是跨平臺的文件系統,除了 Linux 和 eCos ,還支持 WinCE, pSOS 和ThreadX 等。

yaffs/yaffs2 自帶 NAND芯片的驅動,而且爲嵌入式系統提供了直接訪問文件系統的API,用戶能夠不使用 Linux中的 MTD與 VFS,直接對文件系統操做。固然, yaffs也可與MTD 驅動程序配合使用。

yaffs 與 yaffs2的主要區別在於,前者僅支持小頁 (512 Bytes) NAND閃存,後者則可支持大頁 (2KB) NAND閃存。同時, yaffs2在內存空間佔用、垃圾回收速度、讀 /寫速度等方面均有大幅提高。

(3) Cramfs : Compressed ROM File System

Cramfs 是 Linux的創始人 Linus Torvalds參與開發的一種只讀的壓縮文件系統。它也基於 MTD驅動程序。

  在 cramfs 文件系統中,每一頁(4KB) 被單獨壓縮,能夠隨機頁訪問,其壓縮比高達2:1,爲嵌入式系統節省大量的 Flash存儲空間,使系統可經過更低容量的 FLASH存儲相同的文件,從而下降系統成本。

Cramfs 文件系統以壓縮方式存儲,在運行時解壓縮,因此不支持應用程序以 XIP方式運行,全部的應用程序要求被拷到 RAM裏去運行,但這並不表明比 Ramfs需求的RAM空間要大一點,由於 Cramfs是採用分頁壓縮的方式存放檔案,在讀取檔案時,不會一會兒就耗用過多的內存空間,只針對目前實際讀取的部分分配內存,尚沒有讀取的部分不分配內存空間,當咱們讀取的檔案不在內存時,Cramfs 文件系統自動計算壓縮後的資料所存的位置,再即時解壓縮到RAM 中。

  另外,它的速度快,效率高,其只讀的特色有利於保護文件系統免受破壞,提升了系統的可靠性。

  因爲以上特性, Cramfs 在嵌入式系統中應用普遍。

  可是它的只讀屬性同時又是它的一大缺陷,使得用戶沒法對其內容對進擴充。

Cramfs 映像一般是放在 Flash中,可是也能放在別的文件系統裏,使用 loopback設備能夠把它安裝別的文件系統裏。

(4) Romfs

  傳統型的 Romfs 文件系統是一種簡單的、緊湊的、只讀的文件系統,不支持動態擦寫保存,按順序存放數據,於是支持應用程序以XIP(eXecute In Place,片內運行 )方式運行,在系統運行時,節省 RAM空間。 uClinux 系統一般採用 Romfs 文件系統。

  其餘文件系統: fat/fat32 也可用於實際嵌入式系統的擴展存儲器 ( 例如PDA, Smartphone, 數碼相機等的SD 卡) ,這主要是爲了更好的與最流行的Windows 桌面操做系統相兼容。 ext2也能夠做爲嵌入式 Linux的文件系統,不過將它用於 FLASH閃存會有諸多弊端。

2. 基於 RAM 的文件系統

(1) Ramdisk

Ramdisk 是將一部分固定大小的內存看成分區來使用。它並不是一個實際的文件系統,而是一種將實際的文件系統裝入內存的機制,而且能夠做爲根文件系統。將一些常常被訪問而又不會更改的文件( 如只讀的根文件系統) 經過Ramdisk 放在內存中,能夠明顯地提升系統的性能。

  在 Linux 的啓動階段,initrd 提供了一套機制,能夠將內核映像和根文件系統一塊兒載入內存。

(2)ramfs/tmpfs

Ramfs 是 Linus Torvalds開發的一種基於內存的文件系統,工做於虛擬文件系統 (VFS)層,不能格式化,能夠建立多個,在建立時能夠指定其最大能使用的內存大小。 (實際上,VFS 本質上可當作一種內存文件系統,它統一了文件在內核中的表示方式,並對磁盤文件系統進行緩衝。)

Ramfs/tmpfs 文件系統把全部的文件都放在 RAM中,因此讀 /寫操做發生在 RAM中,能夠用ramfs/tmpfs 來存儲一些臨時性或常常要修改的數據,例如/tmp 和/var 目錄,這樣既避免了對Flash 存儲器的讀寫損耗,也提升了數據讀寫速度。

Ramfs/tmpfs 相對於傳統的 Ramdisk的不一樣之處主要在於:不能格式化,文件系統大小可隨所含文件內容大小變化。

Tmpfs 的一個缺點是當系統從新引導時會丟失全部數據。

3. 網絡文件系統 NFS (Network File System)

NFS 是由 Sun開發並發展起來的一項在不一樣機器、不一樣操做系統之間經過網絡共享文件的技術。在嵌入式 Linux 系統的開發調試階段,能夠利用該技術在主機上創建基於NFS的根文件系統,掛載到嵌入式設備,能夠很方便地修改根文件系統的內容。

  以上討論的都是基於存儲設備的文件系統 (memory-based file system),它們均可用做 Linux的根文件系統。實際上, Linux還支持邏輯的或僞文件系統 (logical or pseudo file system),例如 procfs(proc文件系統 ),用於獲取系統信息,以及 devfs(設備文件系統 )和 sysfs,用於維護設備文件。

  附錄: NOR 閃存與NAND 閃存比較

 

文章來源:ChinaUnix博客

相關文章
相關標籤/搜索