文件系統的作用就是在應用概念的文件和存儲設備之間提供一個中間層,以使多個文件駐留在一個存儲設備上,由文件系統來管理所有文件的存儲。文件系統將每個存儲設備化為一系列目錄,每個目錄含有若干文件。 塊(block)分配 傳統的Unix文件系統使用塊分配機制,例如UFS,並且提供一個靈活有效的塊分配策略(policy)。磁盤塊在被使用時分配,就是說只為文件分配一個最小的文件系統塊數,以保存存儲空間。 當文件擴展時,從一個空閒塊位圖中分配塊,所以有時塊是隨機分配的。隨機分配會導致過多的磁盤搜尋,隨後從文件系統讀數據會導致磁盤機制搜尋文件擴展期間所分配的所有隨機塊位置。隨機塊分配可以通過塊分配策略的優化來避免,它試圖分配連續序列的塊。 更小的塊分配獲得大的連續分配,大量減少了磁盤搜尋。然而,連續的文件系統塊分配最終導致了文件系統中的文件塊碎片,結果文件系統訪問最終又會回到隨機的本質。 塊分配方案也要保存文件擴展時每個被分配的新塊的位置信息,以及文件是否是每次一塊的擴展。額外的磁盤I/O被要求讀寫文件系統塊結構信息。文件系統塊結構信息成為元數據(metadata)。文件系統元數據總是同步寫入存儲設備,所以對一個文件大小的改變需要等待每個元數據操作完成。因此,元數據操作極大降低了文件系統的整體性能。 范圍(extent)分配 基於范圍的文件系統每次按一大群來分配磁盤塊,因此要強制進行順序分配。一個文件被寫入時,大量塊在文件創建時被分配給文件;然後,可以進行大群或簇順序塊的寫入。文件系統元數據在文件首次創建是寫入;在塊的第一個分配范圍內的寫不要求額外的元數據寫,直到被分配下一個范圍。 這種方法優化了磁盤搜尋方式,到簇的群化塊寫入允許文件系統提交對存儲設備的更大的物理磁盤寫入,節省了許多小SCSI轉換的開銷。圖1比較了塊分配和范圍分配。我們可以看到,在塊分配的文件中每個邏輯塊都需要有一個塊地址號,導致每個文件有許多的元數據。在范圍分配方法中,每個接連的數據塊范圍只需有起始塊號和長度就夠了。所以包含有一些大范圍塊的文件只有少量的元數據。 范圍分配的文件系統為順序文件訪問提供了更好的性能,因為他的順序分配策略以及塊聚集為更大的寫。然而,對於正在用來作隨機I/O的文件系統,范圍文件系統的長處往往得不到發體現。 舉個例子,如果我們想要通過一個基於范圍的文件進行順序讀,只需讀取起始塊號和長度;然後可以繼續讀取此范圍內的所有數據,這意味著在順序讀時只有很小的元數據讀開銷。相反,如果要以隨機方法來讀,就要先查詢我們想要的每個數據塊的塊地址,這相當於必須要處理一個基於塊的文件系統。 元數據日志 最常見的文件系統日志形式是元數據日志。文件系統要對它磁盤上的結構作改動時,使用幾個無連接的同步寫來完成這些操作。如果期間發生斷電或其它故障,則文件系統的狀態未知,必須對整個文件系統作一致性檢查。 舉個例子,如果在一個文件末尾加上一個塊(block),就需要對告訴文件系統文件的每一塊的位置信息的磁盤位圖進行讀、修改和重寫,然後才能寫入這個數據塊。故障發生時,必須在系統引導時檢查文件系統,文件系統不知道這個塊的位圖是否正確,也不知道崩潰期間哪個文件發生的改動。這種狀態意味著要掃描整個文件系統,經常要花費幾分鐘,甚至幾小時。 元數據日志文件系統在磁盤上有一個循環的只附加的日志域,可以用來記錄每次磁盤事務的狀態。任何磁盤結構改動前都要寫一個目的改變(intent-to-change)記錄到日志。然後才改變目錄結構,完成後,此日志條目被標記為完成。由於文件系統的所有改動都記錄在日志中,我們就可以通過查看日志來檢查文件系統的一致性,而不必掃描整個文件系統。在掛載時,如果找到一個目的改變條目,而且它沒有標記為完成,則檢查那個塊對應的文件結構,並在需要是進行調整。 這種日志方法已經在幾個文件系統上成功實現,並成為SolarisUFS文件系統日志的基礎。它為UFS在磁盤上保存文件系統結構,並且可以隨時啟動或禁止而無需改變磁盤上的數據。Veritas VxFS文件系統也使用元數據日志。 有一些文件系統將日志嵌在文件系統數據的相同分區內,還有一些文件系統則允許日志獨立於文件系統。Solaris DiskSuite中非綁定的UFS日志允許日志和數據隔離開;Solaris 7中綁定的UFS日志則不。Veritas則只在你購買了Verista Accelerator選裝件時才能將日志單獨放置。 數據和元數據日志 一些文件系統提供了一個選項以使文件數據和元數據都記錄進日志。這種方法對小的同步寫尤其有用,它會為每個應用write申請對磁盤不同部分的兩個或更多的寫(一個寫數據,一個寫日志)。通過將數據記入日志,可以避免二次搜尋和寫入。數據首先寫入日志,然後再放入文件系統。這種技術所作工作有兩個:確保數據完整性直到(但不包括)最後的塊寫入,,同時幫助提高小的同步寫的性能。Veritas VxFS文件系統有一個選裝件來對數據和元數據都記日志。 日志結構的文件系統 傳統的文件系統是按塊分配的,設備塊分配自一個空閒塊位圖。另一種替代的文件系統形式是日志結構的文件系統,它將整個文件系統作為一個日志來實現。日志結構的文件系統在每次塊被寫到一個文件時將數據塊加到日志的末尾,進行時將以前寫的塊置為無效。這種方法允許每個文件被順序寫入;不管寫的塊順序,因此提供了更快的寫速度。 日志結構的文件系統用降低讀性能的代價換來很高的寫性能,同時也增加了復雜性。讀性能性能經常由於塊按照寫時的順序分配而變得更慢,因為這樣可能會使文件以隨機順序在磁盤中分散放置。由於要增加一個單獨的垃圾收集或清除程序來掃描文件系統、移除無效塊,所以會增加復雜性。然而,需要一個復雜的緩存/查詢機制來支持高效的查詢,因為塊是以隨機順序分配的,並且每個文件的塊位置信息必須保存起來。 日志結構的文件系統在元數據密集環境中證明是高效的,但是還要被證明對數據密集的工作量更有效。注意日志結構的文件系統和文件系統日志的不同是重要的。日志結構的文件系統也叫做“隨機寫文件系統結構”(WAFL)。 Solaris目前沒有日志結構的文件系統。 擴大和縮小文件系統 對在線存儲管理的一個普通要求是有增大和縮小文件系統的能力。早期的文件系統不支持這種能力,因為那時的磁盤大小是固定的。如今通過卷管理可得到虛擬磁盤,因此可以改變底層設備的大小。如果不能使文件系統的大小擴大,就需要備份文件系統,再次用mkfs/newfs構造文件系統,然後恢復所有的文件系統數據。能夠在線擴張大小的文件系統則無須進行這些步驟。Soalris UFS文件系統可以用mkfs 命令進行擴展,對掛載的文件系統要用 –M 選項,對未掛載的文件系統要使用 –G 選項。 我們有時不單要擴大文件系統,還可能需要縮小文件系統。比如,從一個設備收取一些空間分配給另一設備,就需要首先縮減這個文件系統,以便從這個正在被縮減的文件系統尾端移出一些被分配的文件塊。 文件系統 擴大 縮小 基本的UFS Yes,使用mkfs -M No VxFS Yes,使用fsadm Yes,使用fsadm QFS Yes,使用growqfs No 參考書目: 1.Linux操作系統內核分析 陳莉君 編著 人民郵電出版社 2.Linux系統分析與高級編程技術 周巍松 等編著 機械工業出版社