1. 程式人生 > >CramFS檔案系統

CramFS檔案系統

圖﹝六﹞,查詢CramFS檔案系統的目錄內容

筆者在此把搜尋目錄的流程大略說明一下,首先我們可以由Superblock取得根目錄﹝”/”﹞的cramfs_inode,例如﹕根目錄的offset為19,

mode:41ffh  uid:0h  size:204  gid:0h  namelen:0  offset:19  根目錄    

也就是說這個根目錄底下的檔案或是目錄的資料會放在由CramFS扇區起始往後偏移19*4=76 bytes的位置。接下來,我們偏移到76 bytes的位置,依序把”cramfs_inode + name”的結構讀取出來,得到如下的結果

mode:41edh  uid:0h  size:0  gid:0h  namelen:3  offset:0   lost+found

mode:41edh  uid:0h  size:1208  gid:0h  namelen:1  offset:70   bin

mode:45edh  uid:0h  size:3536  gid:f6h  namelen:1  offset:372   dev

mode:45edh  uid:0h  size:264  gid:f6h  namelen:1  offset:1256   etc

mode:41edh  uid:0h  size:184  gid:0h  namelen:1  offset:1334   lib

mode:a1ffh  uid:0h  size:9  gid:0h  namelen:2  offset:163264   linuxrc

mode:45edh  uid:0h  size:0  gid:f6h  namelen:1  offset:0   proc

mode:45edh  uid:0h  size:176  gid:f6h  namelen:1  offset:1380   sbin

mode:41edh  uid:0h  size:0  gid:0h  namelen:1  offset:0   tmp

mode:45edh  uid:0h  size:0  gid:f6h  namelen:1  offset:0   usr

mode:41edh  uid:0h  size:0  gid:0h  namelen:1  offset:0   var

其中,mode的值可以用來判斷目前的cramfs_inode是為目錄或是檔案型態。

如果說我們現在要檢視etc目錄下的所有檔案或是目錄名稱,因為”etc”cramfs_inode的offset值為1256,所以etc目錄底下的資料會存放在距離CramFS扇區起始位置偏移1256*4=5024 bytes的cramfs_inode。所以我們現在由CramFS扇區起始位置偏移5024bytes,得到如下的結果

mode:45edh  uid:0h  size:48  gid:f6h  namelen:1  offset:1322   rc.d

mode:81a4h  uid:0h  size:376  gid:f6h  namelen:2  offset:12288 inittab

mode:81edh  uid:0h  size:21  gid:f6h  namelen:2  offset:12331   passwd

mode:81edh  uid:0h  size:13  gid:f6h  namelen:2  offset:12339   group

mode:81a4h  uid:0h  size:437  gid:f6h  namelen:2  offset:12345   profile

mode:81a4h  uid:0h  size:97  gid:f6h  namelen:3  offset:12411   protocols

mode:81a4h  uid:0h  size:11349  gid:f6h  namelen:2  offset:12435   services

mode:81a4h  uid:0h  size:20  gid:f6h  namelen:2  offset:13602   hosts

mode:81a4h  uid:0h  size:26  gid:f6h  namelen:3  offset:13610   host.conf

所以囉,透過這樣的方式,我們就可以把CramFS檔案系統映像檔案的目錄內容解讀出來囉。不論是目錄的內容或是檔案壓縮過的資料儲存位置,都可以經由Offset值來推算出來,並且讀取解壓縮到記憶體中。

CramFS檔案系統預設是每次都會解壓縮4Kbytes的資料到Linux Cache Memory中。所以說,如果讀者去觀察CramFS的讀取運作時,會發現只有第一次檔案被讀取時才會動態的去解壓縮,第二次與第二次以後的檔案讀取動作就會直接去該檔案目前所對應到的Linux Cache Memory來讀取,而不會再去解壓縮,耗費系統運算資源。這樣的運作原理,與我們一般使用的Linux 檔案系統﹝例如﹕Ext2﹞是一致的,透過一個Cache的機制,讓目前被讀取的檔案不必要每次都從磁碟驅動器中讀取出來,浪費許多磁碟驅動器搜尋的時間,把目前使用的資料暫存在Cache中,可以增加每一次讀取檔案的速度。如果在CramFS檔案系統中,檔案大小超過 4Kbytes的話,就會分多次來解壓縮。

如下圖﹝七﹞所示,在Linux的環境下,解決讀取大型檔案的方式為,當使用者開啟一個大型檔案時,系統並不會一口氣就把該檔案的內容讀取到記憶體中,所採取的方式是當使用者讀取到檔案的某個位置時,在依據該檔案目前所讀取內容儲存的扇區,來動態的從磁碟系統中讀取出來,載入到記憶體中。


 

圖﹝七﹞,CramFS檔案系統讀取檔案內容的示意圖