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檔案系統讀取檔案內容的示意圖