檔案系統是某些作業系統必然包含的模組,對系統中儲存介質的訪問以同一的系統介面進行管理,完成read ,write,ioctl等操作。
按照實現方式,可分為傳統的單機版的檔案系統和網路分布式的檔案系統。
分布式檔案系統通常應用網路技術和協議,將分散的各個資料資源進行同一管理的系統形式。
嵌入式作業系統上的檔案系統,或者說傳統的檔案系統一般是單一的本地資料管理系統。例如常用的fat ext2 yaffs 等。
這裡說的就是這種傳統的檔案系統。
目前有許多成熟的和開源的檔案系統,通用型的或者針對具體應用場合的。根據自己系統的需要選取成熟的檔案系統,是最可取的一種方式。但是有時為了提高系統效能,往往根據自己的需要對檔案系統進行改進甚至自己實現乙個理想的檔案系統,也是非常必要的。這裡就是結合檔案系統實現的基本原理,結合乙個針對流**儲存檔案系統的應用例子,來描述一下自己實現的檔案系統的原理,希望能夠起到拋磚引玉的作用。
一般的儲存介質包括hdd, flash,eeprom,ram...... 根據不同硬體介質的特性,在保證正確可靠,高效能的情況下,都有特定的檔案系統支援。這裡以在hdd塊裝置上實現檔案系統為例。其實檔案系統完全可以遮蔽底層驅動介面,但不同的硬體特性,可以有特定的檔案系統,還是有點區別,這裡就不詳細說明。
就如其他模組設計一樣,首先要保證系統正確可靠,然後是想法提高系統效能。在這樣的設計思想下,如何針對自己對檔案訪問的應用,設計出合理可靠的儲存結構和高效的訪問機制,是系統設計的關鍵。
一般說,在介質載入的起始地方,肯定要包含檔案系統的基本資訊(有的還有boot資訊,包括分割槽資訊)。在此基礎上,建立起檔案系統目錄結構。由驅動提供的訪問函式,根據目錄檔案的資訊,訪問相應的資料節點。訪問的基本單位是簇(塊),包含多個sector。.基本訪問單元大小和每個sector大小,可以根據需要進行設定。這個往往根據資料儲存情況和訪問情況,在sector浪費和訪問費用之間進行平衡,也就是空間和時間平衡的關係。
在流**應用領域,在硬碟上對資料的儲存一般一次性儲存是比較大的。針對這個特點,可以設計出自己的乙個流**檔案系統。
將硬碟分割槽上劃分為supper block(檔案系統資訊表)+fat(檔案分配表)+data(資料區)。以sector為最小單位(一般512bytes),
|supper block| fat |data
supper block占用了乙個sector. 其包含了檔案系統型別,版本號;本分割槽的大小;檔案分配表大小;申請單元大小;
根目錄index; 分配表個數;參考分配表index; 備份supper block lsn; 分配表lsn; 資料區lsn.
當系統mount時,根據supper block 資訊,找到參考檔案分配表,將參考檔案分配表內容拷貝到工作分配表中。其中的原理是,系統可以有多個檔案分配表相互備份,至少有2個。乙個是參考檔案分配表,乙個是工作檔案分配表。當檔案資訊更新(使用者命令和系統定時更新)完成後,此刻的工作檔案分配表資訊認為是可靠的,可以將其設定為參考檔案分配表,而將原來的參考分配表或者其他的設定為工作分配表,並拷貝完最新資料。這樣,能夠保證檔案分配表資料的完整性。即使在操作過程中有掉電行為,也可以將原來的完整參考分配表恢復回來。
根據root index和檔案分配表,找到根目錄所在的檔案分配資訊sector,並可以對出相應的資料,進而建立起目錄樹。
fat中包含多個檔案(目錄)記錄。乙個記錄為乙個sector.乙個fat的大小,可以根據實際要用到的檔案個數和資料區的大小來設定。乙個檔案記錄裡包含本記錄的型別(檔案,目錄,擴充套件),名稱,檔案屬性(日期,訪問許可權,所有者),長度,檔案節點,父節點,內容sector的lsn,擴充套件extension記錄.根據open傳遞的檔名稱,找到相應的檔案fat記錄,進而得到檔案節點。根據fat記錄就可以找到資料內容的lsn,進行資料訪問了。相應管理也可以根據記錄裡的其他屬性進行工作。其中的內容lsn可以記錄多個連續的分配單元給本檔案使用。這樣適用於碎片比較多的情況。當檔案比較大碎片比較多的時候,乙個記錄不夠用,可以再申請乙個記錄,叫擴充套件extension記錄來繼續進行資料申請區的記錄管理。這樣根據每個檔案的fat記錄,就可以找到其名稱等屬性和資料記錄區。
資料區就是一系列的連續(也可以不連續,但要保證基本申請單元大小n*sector)的塊區域組成。一般塊裝置是按sector劃分,每塊512bytes. 這裡的分配空閒管理,是在系統載入時通過掃瞄每個fat記錄裡資料區的使用情況建立的。其每個申請單元情況對應使用情況表的一位來標識。在format時可以根據每個資料塊的讀情況標識好壞。由於管理資料塊使用空閒情況的表是建立在記憶體中的,所以這個表象不能太大,或者每個管理單元要大些。在流**檔案,一般是以兆為單位的,所以可以為4m,8m等。有的檔案系統,如fat,將這個結構也放到檔案分配表裡,儲存到硬碟上,在需要時再讀出來。
到此,硬碟上用到的資料結構設計完成,完全可以保證資料訪問的可靠性和正確性。
還要採取些訪問措施,來提高系統訪問效能。
首先可以建立乙個cache機制,申請一段記憶體,將最近訪問的檔案記錄放入其中,這樣再次訪問時,可以從記憶體中查詢記錄提高效能。
其次可以建立乙個申請視窗機制。就是在為每個檔案申請內容sector時,多申請一些在乙個window裡記錄下來。這樣再此用到資料sector時,可以快速得到,提高效能。
最後,也是所有塊裝置訪問的基本機制,就是命令佇列。將每個訪問以命令的方式下發,系統可以根據需要進行qos或者其他方式進行處理,提高系統對不同命令等級的處理效能。
總之,檔案系統實現是離不開檔案系統基本原理的,完全可以根據自己的需要來修改,甚至實現。拋開這些神秘的面紗,還原其原來面目。我們也可以做得到。
草草完成,簡單闡述,不對之處,望多指出討論。
構建自己的根檔案系統
說明 本篇文章是筆者自己用的,可以參考,由於環境不同,所以可能讀者不是太理解。根檔案系統的命令都是busybox的連線命令比如執行ls與執行 busybox ls 是同樣的效果 一 最小根檔案系統 1 dev console dev null 2 init程式 於busybox 3 etc init...
檢視自己linux版本使用的檔案系統格式
環境 centos 5.5 final linux常見的檔案系統有 jfs reiserfs ext ext2 ext3 iso9660 xfs minx msdos umsdos vfat ntfs hpfs nfs smb sysv proc等 等老多了。要是再刨根問題,就超出個人範圍了。至於你...
Linux檔案系統的設計
總論 linux的檔案系統設計非常優秀,總的來講有兩大部分,第一部分就是樹形的組織結構,第二部分就是vfs,樹形的組織結構組織了檔案系統的表象,使用者很方便的使用,而vfs是檔案系統的實現機理,它處於核心態,不但實現了樹形結構的mount機制,而且還提供了乙個統一的介面用來訪問裝置。一 linux檔...