Linux Ext2文件系統
Linux最傳統的磁盤文件系統使用的是EXT2。所以要了解文件系統就得要由認識Ext2開始。文件系統是創建在磁盤上面的,因此我先來了解一下磁盤的物理組成。
磁盤組成與分區
整塊磁盤的組成主要有:
圓形的盤片(記錄數據)
機械手臂與機械手臂上的磁頭(可讀寫盤片上的數據)
主軸馬達,可以轉動盤片,讓機械手臂的刺頭在盤片上讀寫數據
數據存儲於讀寫的重點在於盤片,盤片上的物理組成為:
扇區(Sector)為最小的物理存儲單元,每個扇區為512bytes
將扇區組成一個圓,那就是柱面(Cylinder),柱面是分區(partition)的最小單位
第一個扇區最重要,裏面有硬盤主引導記錄(Masterbootrecord, MBR)及分區表(partition table),其中MBR有446bytes,而partition table占有64bytes。
各種磁盤在Linux中文件名:
/dev/sd[a-p][1-15]:為SCSI,SATA,USB,Flash等接口的磁盤文件名
/dev/hd[a-d][1-63]:為IDE接口的磁盤文件名
磁盤分區:
所謂的磁盤分區指的是告訴操作系統“我在這塊磁盤在此分區可以訪問的區域是A柱面到B柱面之間的塊”,如此一來操作系統就能夠知道它可以在所
指定的塊內進行文件數據的讀/寫/查找等操作了。也就是說,磁盤分區即指定分區的起始與結束柱面就可以了。
那麽指定分區的柱面範圍是記錄在哪裏?就是第一個扇區的分區表中。但是因為分區表僅有64byte而已,因此最多只能記錄四條分區記錄,這四條記錄
我們成為主(primary)分區或擴展(extended)分區,其中擴展分區還可以再分出邏輯分區(logical),而能被格式化的則僅有主分區與邏輯分區而已。
- 主分區與擴展分區最多可以有4個(磁盤的限制)
- 擴展分區最多只能有一個(操作系統的限制)
- 邏輯分區是由擴展分區持續分出來的分區
- 能夠被格式化後作為數據訪問的分區為主要分區與邏輯分區,擴展分區無法被格式化
- 邏輯分區的數量依操作系統而不同,在Linux系統中,IDE硬盤最多有59個邏輯分區(5號到63號),SATA硬盤則有11個邏輯分區(5號到15號)
文件系統特性
磁盤分區完畢後還需要進行格式化(format),之後操作系統才能夠使用這個分區。為什麽要進行“格式化”?這是因為每種操作系統所設置的文件屬性/權限不同
為了存放這些文件所需的數據,因此就需要將分區進行格式化,以成為操作系統能夠利用的文件系統格式。
每種操作系統能夠使用的文件系統不相同,傳統的磁盤與文件系統應用中,一個分區就是只能被格式化為一個文件系統所以我們可以說一個文件系統就是一個分區。
但是由於新技術的利用(LVM),目前我們在格式化時已經不再說成針對分區來格式化了,通常我們可以稱呼一個可被掛載的數據為一個文件系統而不是一個分區。
文件系統是如何運行的呢?這個與操作系統的文件數據有關。較新的操作系統的文件數據除了文件實際內容之外,通常含有非常多的屬性(權限,所有者)。文件
系統通常會將這兩部分的數據分別放在不同的塊,權限與屬性放置到inode中,至於實際數據則放置到data block快中。另外,還有一個超級快(superblock)會記錄整個
文件系統的整體信息,包括inode與block的總量、使用量、剩余量等。
每個inode與block都有編號,至於這三個數據的意義如下:
- super block :記錄此文件系統的信息,包括inode/block的總量、使用量、剩余量,以及文件系統的格式與相關文檔
- inode : 記錄文件的屬性,一個文件占用一個inode,同時記錄此文件的數據所在的block號碼
- block:實際記錄文件的內容,若文件太大時,會占用多個block
由於每個inode與block都有編號,而每個文件都會占用一個inode,inode內則有文件數據放置的block號碼。如果能夠找到文件的inode的話,那麽自然就會知道這個文件放置的block號碼,讀取
實際數據,讀寫的效率比較好。
inode和block快以圖解的方式說明一下,如圖:
文件系統先格式化出inode與block的塊,假設一個文件的屬性與權限數據放置到inode4,此時我們的操作系統就能夠據此來排列磁盤的閱讀順序。
這種數據訪問的方法我們稱為索引文件系統。
另一個管用的系統是我們U盤(閃存)使用的文件系統,一般為FAT格式。FAT這種格式的文件系統沒有inode存在,所以FAT沒有辦法將一個文件的
所有block在一開始就讀出來。每個block號碼都記錄在當前一個block當中,它的讀取方式如圖:
假設文件的數據依序寫入1->7->4->15號這四個block,文件系統就沒有辦法一口氣知道四個block的號碼,他得一個一個的讀block.如果同一個文件的數據寫入
的block分散的太厲害,我們的磁盤磁頭無法在磁盤轉一圈就讀到所有的數據,因此磁盤就會多轉好幾圈才能完整地讀到這個文件的內容。
基本上,索引式文件系統,不太需要進行碎片的整理。如果文件使用太久,經常刪除/編輯/新增文件時,還是會造成文件數據太過離散的問題。需要整理。
Linux的Ext2文件系統(inode)
文件系統一開始就將inode與block規劃好了,除非重新格式化,否則inode與block固定後就不再變動。Ext2文件系統在格式化的時候基本上是區分為多個快組的
每個快組有獨立的inode/block/superblock系統。
在整體規劃中,文件系統最前面有個一啟動扇區(boot sector),這個啟動扇區可以安裝引導裝載程序,通過它我們就能夠將不同的引導裝載程序安裝到個別的
文件系統最前端,而不用覆蓋整塊硬盤唯一的MBR,這樣也才能夠制作出多重引導的環境。如圖
data block(數據塊)
放置文件內容的地方,在Ext2文件系統中系統支持的block大小有1KB,2KB及4KB三種。在格式化時block的大小就固定了,每個block都有編號,以方便
inode的記錄。不過要註意的是,由於block大小的區別,會導致該文件系統能夠支持的最大磁盤容量與最大單一文件容量並不相同。
原則上,block的大小與數量在格式化完成就不能夠再改變(除非重新格式化)
每個block內最多只能放置一個文件的數據
如果文件大於一個block的大小,則一個文件會占用多個block數量
若文件小於block,則該block剩余空間就不能再被使用了。
inodetable(inode表格)
inode的內容主要記錄文件的屬性及該文件實際數據放置在哪幾個block內。基本上記錄的文件至少有一下這些:
該文件的訪問模式(read/write/execute)
該文件的所有者與組
文件大小
改建創建或者狀態改變時間,內容改變的時間
定義文件特性的標誌如SetUID等
該文件真正內容的指向
inode有哪些特色呢:
每個inode128bytes
每個文件占用一個inode
文件系統能夠創建的文件數量與inode的數量有關
系統讀取文件時,先找inode,分析inode所記錄的權限,根據權限開始實際讀取block內容
因為inode大小有限(128bytes),為記錄更多信息,系統將inode記錄block號碼區域定義為多層結構,如圖:
Superblock(超級塊)
Superblock是記錄整個文件系統相關信息的地方,沒有它就沒有這個文件系統了。它記錄的信息主要有:
block與inode的總量
未使用與已使用的inode/block數量
block與inode的大小
文件系統的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤的時間等文件系統相關時間
一個validbit,若此文件系統已經被掛載,則為valid bit為0,否則為1
如果superblock死掉了,你的文件系統可能要花很多時間去挽救,superblock一般大小為1024bytes。
此外,每個block group都含有superblock。但是我們也說一個文件系統應該僅有一個superblock而已,這是怎麽回事?事實上,除了第一個block group
內含有superblock之外,後續的block group不一定含有superblock,而若含有superblock則該superblock主要是作為第一個block group內superblock的備份了,
這樣可以進行superblock的救援。
File system Description(文件系統描述說明)
這個區段可以描述每個block group的開始於結束的block號碼,以及說明每個區段分別介於哪一個block號碼之間。
block bitmap(塊對照表)
記錄系統中哪些block是未使用的
inode bitmap(inode對照表)
記錄未使用的inode號碼
每個區段與superblock的信息都可以使用dumpe2fs命令來查詢:
目錄
ext2會分配一個inode與至少一塊block給目錄。inode記錄該目錄的相關權限與屬性,並可記錄分配到的那塊block號碼,而block則是記錄在這個目錄下的
文件名與該文件名占用的inode 號碼數據。
想查看目錄內的文件占用的inode號碼,可以用ls-i參數來處理:
由上面的結果我們知道目錄並不只占一個block而已,在目錄下面的文件數如果太多而導致一個block無法容納下所有文件與inode對照表時,系統
會給與該目錄多於一個block來繼續記錄相關的數據。
文件
ext2會分配一個inode與相對該文件大小的block數量給該文件。註意inode僅有12個直接指向,因此還要多分配inode來作為塊號碼的記錄。
目錄樹讀取
因為文件名是記錄在目錄的block當中,以你當我們要讀取這個文件時,就務必會經過目錄的inode與block,然後才能找到那個待讀取文件的inode號碼,
最終才會讀到正確的文件的block內的數據。由於目錄樹是又根目錄開始讀起,因此系統通過掛載的信息可以找到掛載點的inode號碼(通常一個文件系統的最頂層
inode號碼會由2號開始),此時就能夠得到根目錄的inode內容,並依據該inode讀取根目錄block內的文件名數據,再一層一層地往下讀到正確的文件名。
日誌文件系統功能
如果我們想要新增一個文件,此時文件系統的行為是:
1. 先確定用戶對於預添加文件的目錄是否具有w與x的權限,若有的話才能添加
2 根據inode bitmap找到沒有使用的inode號碼,並將新文件的權限、屬性寫入
3. 根據block bitmap找到沒有使用中的block號碼,並將實際的數據寫入block中,且更新inode的block指向數據。
4. 將剛才寫入的inode與block數據同步更新inode bitmap與block bitmap,並更新superblock的內容。
一般來說,inode table與data block稱為數據存放區域,至於其他例如super block、block bitmap與inode bitmap等區域就被稱為metadata(中間數據)因為
super block、inode bitmap及block bitmap的數據是經常變動的,每次添加、刪除、編輯時都可能會影響到這個三個部分的數據,一次才會被稱為中間數據。
數據不一致狀態,在早期的Ext2文件系統中,如果發現這個問題,那麽系統在重新啟動時候,就會通過Super block當中記錄的valid bit與文件系統的state等狀態來判斷
是否強制進行數據一致性的檢查。若有需要檢查時則以e2fsck這個程序來進行。但這個檢查真的是很費時的,因為要針對meta data 區域與實際數據存放區來進行對比
得要搜尋整個文件系統。
日誌文件系統,為了避免上述不一致情況發生,我們的前輩想到一個方式,如果在我們的文件系統當中規劃出一個塊,專門記錄寫入或者修訂文件時的步驟:
1. 預備:當系統要寫入一個文件時,會現在日誌塊中記錄某個文件準備寫入的信息
2. 實際寫入:開會寫入文件的權限與數據;開始更新meta data的數據
3.結束:完成數據與meta data的更新後,在日誌記錄塊當中完成該文件的記錄
在這樣的程序當中,萬一數據的記錄過程發生了問題,那麽我們的系統只要去檢查日誌記錄塊就可以知道哪個文件發生了問題,針對該問題來做一致性的檢查即可,不必
針對整塊文件系統去檢查,這樣就可以達到快速修復文件系統的能力。這是日誌式文件最基礎的功能。
Linux文件系統的操作
所有的數據都得要加載到內存後CPU才能夠對該數據進行處理。在編輯文件過程中會頻繁地寫入磁盤中,但磁盤寫入的速度要比內存慢很多很沒有效率。Linux
使用異步處理的方式解決這個問題: 當系統加載一個文件到內存後,如果該文件沒有被改動過,則在內存區段的文件數據會被設置為(clean)的。但如果內存中的
文件數據被更改過了,此時該內存中的數據被設置為Dirty。此時所有的操作都在內存中執行,並沒有寫入到磁盤中。系統會不定時地將內存中設置為Dirty的數據協會
磁盤,以保持磁盤與內存數據的一致性。
系統會將常用的文件數據放置到主存儲器的緩沖區,以加速文件系統的讀寫
可以手動使用sync來強迫內存中設置為Dirty的文件寫回到磁盤中
若正常關機時,關機命令會主動調用sync來將內存的數據寫入到磁盤
若不正常關機,由於數據尚未寫到磁盤,重啟後可能會花很多時間進行磁盤檢驗,甚至可能導致文件系統損毀。
掛載點的意義
每個文件系統都有獨立的inode,block,super block等信息,這個文件系統要能夠鏈接到目錄樹才能被我們使用。將文件系統與目錄樹結合的操作我們成為掛載。
重點是:掛載點一定是模流,該目錄為進入該文件系統的入口。因此並不是你有任何文件系統都能使用,必須要“掛載”到目錄樹的某個目錄後,才能夠使用該文件系統的。
由於文件系統頂層的目錄inode一般為2號,因此/,/boot/,/home為三個不同的文件系統,因為每一行的文件屬性不同,且三個目錄的掛載點也不同。
上面信息中掛載點均為/,因此三個文件都在同一個文件系統內,而中三個文件的inode號碼均為2,因此這三個文件名都指向同一個inode號碼,當然這
三個文件的內容也就完全一樣。
Linux VFS
Linux內核是如何管理文件系統呢?整個Linux文件系統都是通過一個名為Virtual Filesystem Switch(虛擬文件系統VFS)的內核功能區讀取文件系統的。
也就是說,整個Linux認識的文件系統其實就是VFS在進行管理,我們用戶並不需要知道每個分區上頭的文件系統是什麽,VFS會主動幫我們做好讀取工作。
Linux Ext2文件系統