簡介
UFS是UNIX檔案系統的簡稱,它來源於4.3Tahoe發行版中提供的BSDFatFastFileSystem(FFS)系統,屬於FFS的演化版本。UFS幾乎是大部分UNIX類作業系統默認的基於磁碟的檔案系統,包括Solaris、FreeBSD、OpenBSD、NetBSD、HP-UX等,甚至Apple的OSX也能支持UFS檔案系統。在最初的FFS檔案系統的設計中,為了使檔案系統在遭到毀滅性打擊,如硬碟發生整個磁軌、整個盤面或者整個柱面損壞時能夠得以恢復,在檔案系統初始化時,會將檔案系統的重要數據結構複製到整個磁碟的多個位置,以便在發生硬體損壞時能夠讀取,而UFS檔案系統也繼承了這些優良的特性。
另外,為了提高運行效率,UFS檔案系統與磁碟的結構也有著完美的結合,UFS將整個磁碟的所有邏輯柱面平均分配為若干個組,每組稱為一個“柱面”。在UFS內部就用柱面組隊檔案系統進行分段組織和管理,每個柱面組中都有檔案系統關鍵數據結構的備份,所有檔案在各個柱面組中相對獨立地存儲而又有機地結合在一起。這就使磁碟中的磁頭在訪問檔案系統中的數據時有效地減小了擺動,提高了訪問效率。
UFS檔案系統結構總覽
UFS檔案系統在創建時,磁碟的碟片被分成若干個柱面組,每個柱面組由一個或多個聯繫的磁碟柱面組成,在檔案系統的前部會有一個叫做“柱面組概要”的結構對整個檔案系統中的每個柱面組信息進行統計,並且在每個柱面組中還有一個“柱面組描述符”用來管理當前柱面組。每個柱面組又進一步被分成若干個可定址的塊,以控制和組織柱面組中檔案的結構,所以“塊”是UFS檔案系統中檔案分配和存儲的基本單位,類似於FAT檔案系統和NTFS檔案系統中“簇”的概念。
在UFS檔案系統中,“塊”有多種類型,每種類型的塊都具有特定的功能。UFS檔案系統主要具有四種類型的塊:引導塊、超級塊、i-節點、數據塊。
引導塊:在引導系統時使用的信息
超級塊:記錄檔案系統的詳細信息
i-節點:記錄檔案的各種信息
數據塊:存儲每個檔案的實際內容
UFS檔案系統中的“塊”又被分成更小的單位,叫做“段”。在創建UFS檔案系統時,可定義段的大小,默認的段大小一般為1KB。每個塊都可以分成若干個段,段大小的上限就是塊的大小,下限實際上為磁碟扇區大小,通常為512位元組。
當檔案寫入檔案系統時,首先為檔案分配完整的塊,然後為不滿一個塊的剩餘部分分配某個塊的一個或者多個段。對於比較小的檔案,首先分配段進行存儲。能夠為檔案分配塊中的段而不是僅分配完整的塊,就減少了塊中未使用的空間,從而提高了磁碟的利用率。
在創建檔案系統時,選擇段的大小需要考慮時間和空間的平衡,小的段大小可節省空間,但是需要更多的時間進行分配,通常,當大多數檔案都很大時,要提高存儲效率,應為檔案系統使用較大的段大小,當大多數檔案都比較小時,應為檔案系統使用較小的段大小。
綜上所述,UFS檔案系統由若干個“柱面組”構成,每個柱面組包含一定數量的“塊”,每個塊又由若干個“段”組成。“段”是UFS檔案系統的最小存儲單元。每個柱面組、塊、段在檔案系統中都有自身的編號,它們的起始編號都是0.
另外,“超級塊”是UFS檔案系統中非常重要的一個結構,其重要性類似於FAT檔案系統和NTFS檔案系統中的DBR,所以UFS在每個柱面組中都對超級塊做了備份,但備份的位置卻各不相同,在每個柱面組中都會發生一定的偏轉,這是因為在原來的硬碟中每個磁軌具有相同的扇區數,這個就導致每個柱面組的第一個扇區都位於同一個盤面上。為了減小因無力故障而產生的數據損壞,將超級塊的備份在每個柱面組中錯位存放就可以使它們不再存儲於同一個盤面,從而降低了風險。而現在的新式硬碟每個柱面的扇區數並不相等,所以也就不存在這樣的隱患,實際上UFS2已經不再考慮數據錯位存放的問題。
UFS檔案系統的引導塊:
引導塊是UFS檔案系統中的第一個塊,也就是0號塊。它的結構因作業系統的不同而稍有區別,但一般都是由磁碟標籤和引導程式組成。只有當UFS檔案系統中包含作業系統核心時,引導塊中才會有引導程式。如果UFS檔案系統中不保護作業系統核心,引導塊中則沒有引導程式,只有磁碟標籤。
UFS檔案系統的超級塊:
UFS檔案系統超級塊的重要性類似於FAT檔案系統和NTFS檔案系統中的DBR,但比DBR的結構複雜很多,超級塊中記錄著許多參數,主要包括:檔案系統的大小和狀態
檔案系統名稱和卷名稱
檔案系統塊的大小及段大小
上次更新的日期和時間
柱面組的大小
柱面組中的數據塊數
柱面組概要的地址
檔案系統狀態
最後一個掛載點的路徑名
由於超級塊包含檔案系統的關鍵數據,因此在創建檔案系統時建立了多個超級塊,在每個柱面組內都有一個超級塊的備份。
UFS檔案系統的i-節點
UFS檔案系統的i-節點用來存儲與檔案相關的除檔案名稱以外的所有信息,包括指向檔案的硬連結數、檔案大小、檔案的時間信息、檔案屬主的用戶ID、檔案所屬的組ID、檔案內容存放地址的塊指針等重要信息,這些重要信息也被稱為元數據。UFS檔案系統的每個柱面組中都有一個自己的i-節點表。i-節點表由很多i-節點組成,每個檔案或者目錄使用一個i-節點。UFS1的i-節點在檔案系統創建時即被初始化,而UFS2的i-節點則在需要時才被初始化,所以當檔案系統中的數據塊不夠使用時,UFS2能夠使用i-節點表中的空閒空間存放數據。
在每個柱面組的組描述符中都有一個i-節點點陣圖,用來管理i-節點表中的i-節點使用和分配情況。如果要確定一個i-節點屬於哪個柱面組,可以用當前i-節點號對每個柱面組的i-節點數做取整運算得到,而每個柱面組的i-節點數在超級塊和柱面組描述符中都有記錄。
UFS日誌記錄
UFS日誌記錄會將組成一個完整UFS操作的多個元數據更改打包成一個事務。事務集記錄在盤上日誌中,然後會套用於實際檔案系統的元數據。重新引導時,系統會廢棄未完成的事務,但是會對已完成的操作套用事務。檔案系統將保持一致,因為僅套用了已完成的事務。即使在系統崩潰時,也仍會保持此一致性。系統崩潰可能會中斷系統調用,並導致UFS檔案系統出現不一致。
UFS日誌記錄功能有兩個好處:
如果檔案系統已經通過事務日誌達到一致,則在系統崩潰或異常關機後可能不必運行fsck命令。從Solaris912/02發行版開始,UFS日誌記錄的性能已經提高甚至超過了無日誌記錄功能的檔案系統的性能級別。這一改進之所以能夠實現是由於啟用日誌記錄功能的檔案系統可以將對相同數據的多重更新轉換為單一更新。因此,減少了磁碟操作所需的開銷。UFS事務日誌具有以下特徵:
從檔案系統上的空閒塊分配而來對於每1GB的檔案系統,其大小約為1MB,最大為64MB
填滿時會不斷刷新
取消掛載檔案系統或使用任何lockfs命令之後也會刷新。
所有UFS檔案系統均預設啟用UFS日誌記錄。
如果需要禁用UFS日誌記錄,請在/etc/vfstab檔案中或手動掛載檔案系統時,向檔案系統的項添加nologging選項。
如果需要啟用UFS日誌記錄,請在/etc/vfstab檔案中或手動掛載檔案系統時,在mount命令中指定-ologging選項。可以在包括根(/)檔案系統的任何UFS檔案系統上啟用日誌記錄。另外,fsdb命令還包含支持UFS日誌記錄的新調試命令。
在一些作業系統中,啟用了日誌記錄的檔案系統稱為日記記錄檔案系統。