檔案系統的目的就是操作檔案以及目錄,本篇我們要來談談設計檔案系統時,必須要具備的動作,也就是說檔案與目錄有哪些動作。
檔案系統的目的就是操作檔案以及目錄,本篇我們要來談談設計檔案系統時,必須要具備的動作,也就是說檔案與目錄有哪些動作。
一、初始化:
檔案系統初始化就是在磁碟上建立一個空的檔案系統,要決定的包括有檔案系統的大小、儲存資料的空間與結構等等。作業系統在這裡會由driver中得知,這個要建立檔案系統的volume有多少block,接下來檔案系統就可以計算可用的空間、block map、FCB(或i-node)、以及journal的空間。檔案系統初始化時也需要建立最頂層的根目錄,這些動作通常就在我們在進行格式化時所看到的。
二、掛載:
存取檔案系統通常需要經由一個目錄位置或是磁碟機代號,所以必須透過掛載(mount)這個動作來將初始化後的檔案系統與存取路徑建立關聯。我們看到的動作是這樣沒錯,事實上在進行mount的動作時,首先檔案系統會去讀取superblock以及metadata的資訊,Superblock會記錄檔案系統的狀態,譬如說是否曾未安全的卸載(如斷電),如果含有不一致的block,檔案系統就需要進行確認,以避免造成資料損壞。至於是否進行修復,那就要看檔案系統是否有日誌(journaling)的支援了。在確認完volume是有效的之後,Mount的下一步驟就會將磁碟上的資料結構複製到記憶體中,並和作業系統掛勾(hook),使用者就可以透過作業系統使用檔案了。
三、卸載:
要安全的結束檔案系統,卸載(unmount)是必要的動作。Unmount首先會將保存在記憶體中的資料(buffer)與檔案系統的狀態寫回磁碟中,Superblock會記錄這是一個安全的結束狀態,並在這之後停只一切對檔案系統的變更動作。
四、建立檔案:
建立檔案時,檔案系統需要兩個重要的資訊,一是檔案所在的目錄,一是檔案的名稱。如此檔案系統方能建立代表此檔案的i-node,以及在該目錄下新增一筆新檔案的i-node資訊。除了以上兩個重要資訊,檔案系統也可同時建立檔案的存取權限、使用格式是等等標注。在建立完i-node等檔案所需的資料後,新建的檔案並不會為資料而在磁碟中預留空間,這些空間要等到資料真正要寫入的時後才會去引用。
五、建立目錄:
建立目錄跟建立檔案看起來差不多,都是會建立檔名、i-node以及metadata等資訊。但是建立目錄還需要進行目錄初始化的工作,也就是建立用以儲存檔案資訊的資料結構,譬如是Array或是B-Tree。目錄裡同時需要包含參考回到自己與自己上一層目錄的資訊,這就是我們平常在目錄中看到的一個點 (.)與兩的點(..)。
六、開啟檔案:
開啟檔案實際上包含兩個大動作,一是找到檔案所在的目錄以及檔案名稱,二是確認檔案的使用權限。在取得檔案的目錄位置(路徑)與檔名後,檔案系統會傳回相關的i-node資訊。這一個動作的效率與否,仰賴於目錄結構的設計,我們上回有提過,使用B-Tree資料結構有助於增進目錄存取的效率。在取得檔案的資訊後,在真正開啟檔案之前還需要進行使用權限的確認,像是是否可以新增、修改、刪除還是僅能唯讀。檔案開啟之後,作業系統會建立與該檔案的控制器 (handler),所所有使用者的程式動作都會經由這個handler來進行。
七、寫入檔案:
寫入檔案時,檔案系統需要操縱以下幾個參數:資料在檔案中的起始位址、暫存用的buffer、要寫入的資料長度等等。寫入資料的動作就相當於要求檔案系統將資料複遊記憶體或buffer製到檔案中,並把儲存的位址記錄下來。在寫入的同時,隨著資料的成長,檔記錄block使用狀況的資料結構就會不斷的被更新,包括i-node、superblock等等。
八、讀取檔案:
讀取檔案所需要的參數跟寫入檔案相同,但是動作簡單許多,因為讀取不會去更動檔案的資訊。
九、刪除檔案:
刪除檔案之前先要確認檔案存在以及權限允許與否,一經確認之後刪除檔案會分成兩個步驟,一是從目錄中移除檔案的名稱,這時後檔案就被標記為移除了;第二步驟檔案系統要會檢查是否還有handler指向該檔案,如果沒有則釋放該檔案所佔有的空間讓作業系統收回,所以也需要更新i-node等檔案控制資訊。將刪除檔案拆解為兩個步驟是有其必要的,因為檔案可能在開啟的同時被要求刪除,這時候如果檔案即刻被刪除且回收空間,另一個使用相同檔案的程式就會發生問題。
這樣的設計還有一個好處,就是方便作業系統為I/O動作建立暫存空間,佔存檔可以在被建立後即刻刪除,然I/O仍繼續進行,待I/O結束後暫存空間就會被收回。
十、更改檔名:
修改檔名是比較複雜的動作,檔案系統必須取得原始檔案的目錄、原始檔案的名稱、目的檔案的目錄與目的檔案的名稱等資訊,才能進行更名的動作。在更名的同時必須先對檔案進行鎖定(lock)的動作,以避免其他程式存取這個檔案。接下來要驗證原始目錄與檔名跟目的地目錄與檔名是否相等,如果是則禁止更動,但是當目錄不同時,則允許相同檔名的建立(這就是檔案搬移的動作)。又如果要更動的是目錄的檔名,則檔案系統要禁止新檔名的目的位址在原始目錄底下,否則就變成要把自己搬到自己的下一層目錄這樣矛盾的動作。更改檔名本身包含了兩個動作,一方面刪除檔案,緊接著在新的位置建立檔案。
系列文章列表
檔案系統的設計與效能 - 目錄的抽象化
檔案系統的設計與效能 - 檔案的抽象化
檔案系統的設計與效能 - 關鍵詞的定義
檔案系統的設計與效能 - 基本需求