Mac OS X文件系統的來龍去脈(上)

openkk 12年前發布 | 28K 次閱讀 Mac OS X

        文 / 王越

        HFS+ 和 UFS 文件系統同時被引入早期的 Mac OS X,隨著若干年的發展,HFS+ 提供的功能已超越 UFS,使其在 Mac OS X 10.5 之后成為成為唯一正式的 Mac OS X 系統,但因為其背負許多的歷史包袱,為考慮兼容性,這些陳舊的設計并不能被推翻重來,所以蘋果開始秘密研發下一代的文件系統。

Mac OS X文件系統的來龍去脈(上)

著名 BSD 開發者 Marshall Kirk McKusick

        UFS:經典的 Unix 文件系統

        在 Unix 系統剛誕生的遠古時期,文件系統被簡單地稱為 FS。FS 只包括啟動塊、超級塊(處于硬盤分區開頭用來保存文件系統信息)、inodes(索引節點)及數據。FS 文件系統在 Unix 系統剛誕生時還能滿足新老客戶的需求,但隨著科學技術的進步,FS 已不能符合現代文件系統的需求,且會導致抖動等一系列問題。當時還是加州大學伯克利分校研究生,后成為著名 BSD 開發者 Marshall Kirk McKusick 在 BSD 4.1b 上承接傳統的 FS 文件系統實現了 FFS(Fast File System), 妥善地解決了這一難題,把先前整塊的磁盤文件系統分為小塊,每塊包含自已的索引節點和數據,因而增加了文件的局部性,減少了尋道時間。由于 Marshall Kirk McKusick 的 FFS 文件系統很好很強大,所以立即被各大 Unix 系統所使用。SunOS/Solaris、System V Release 4、HP-UX 及 Tru64 UNIX 都使用它,也成為當今各 BSD 分支(FreeBSD、OpenBSD、NetBSD 及 DragonFlyBSD)的標準文件系統。每個不同的系統,無論開源與否,又會在 FFS 文件系統上增加各種擴展,這些擴展往往不互相兼容,但神奇的是,大家又都使用和原版同樣的塊大小和數據塊寬度。因此在很大程度上,這些山寨版 FFS 文件系統又相互兼容,至少在一個操作系統上能對另一操作系統的文件系統執行只讀操作。因此,FFS 事實上已經成為 Unix 系統的標準文件系統,故它有了一個更廣泛的稱謂——UFS(Unix File System,即 Unix 文件系統)。

        UFS 在后來的若干年又取得了長足的發展。Sun 公司在 Solaris 7 系統中,給 UFS 提供了簡單的日志功能。日志文件系統指在檔案系統發生變化時,先把相關的信息寫入一個被稱為日志的區域,然后再把變化寫入主文件系統的文件系統。在文件系 統發生故障(如內核崩潰或突然停電)時,日志文件系統更容易保持一致性,并且可以較快恢復。Marshall Kirk McKusick 又實現了 BSD 一度引以為豪的 Soft Update 功能,來保證計算機掉電或系統崩潰時,通過使元數據按依賴順序更新來確保磁盤上總的文件系統保持一致的實現機制。Soft Update 的目標和日志類似,但實現代價比日志輕量許多。不過這項功能有所代價,主要是需要引入一個后臺 FSCK 檢查。

        2009年,Jeff Roberson 正式發表了對 UFS 的一項改進,為 Soft Update 加入了日志功能,并消除了對 FSCK 的依賴,這項改進最終集成進了 FreeBSD 9 中。TrustedBSD 項目又為 BSD 分支的文件系統設計了 ACL 訪問控制表功能(Access Control Lists)。 先前,Unix 文件系統的訪問控制是非常簡單的,其權限管理分為三個不同的類別:用戶、同組用戶以及其他用戶,對每個類別,Unix 文件系統提供讀、寫、執行三種權限的管理。這樣的許可管理過于粗糙,無法指定某一用戶訪問的權限,也無法指定更為細致的權限內容(例如準許對一文件實行刪 除操作)。為解決這個問題,訪問控制表被增加到文件系統中,使用以存取控制矩陣為基礎的存取控制方法。存取控制串列描述每一個文件對象各自的存取控制,并 記錄可對此物件進行存取的所有主體對對象的權限。總之,UFS 與時俱進,不斷增加新的功能。

        HFS+:更現代的 HFS

        作為 Mac OS X 的老祖宗 NeXTSTEP,因為基于 BSD,所以自然也使用 UFS。而老版的 Mac OS 則使用一個叫做 HFS 的文件系統。HFS 是一個比較古老且不思進取的文件系統,因此,在 20 世紀 90 年代末已不能滿足當時的需要。在《Mac OS X 背后的故事(一)》 中我們提到,為了實現 Mac OS 的現代化,Copland 項目被提出。Copland 項目的子項目 Sequoia 旨在 HFS 的基礎上,加入現代文件系統所必需的新功能,如大文件支持、Unicode 文件名支持、長文件名支持、32位文件映射表支持等。Sequoia 項目即成為后來熟知的 HFS+,由 Don Brady 領導,這個團隊先花了 6 個月時間把 HFS 項目原本的 Mac 使用的 68K 處理器匯編碼改寫成C代碼,然后逐漸加入新功能

        后來由于 Copland 被力挽狂瀾的 Ellen Hancock 給廢了,所以一些有用的更新,如 HFS+ 即被集成到 Mac OS 8.1 中。在 Mac OS X 誕生初期,HFS+ 和 UFS 文件系統同時被引入早期的 Mac OS X 中。不過由于 HFS+ 根植 Mac OS,缺乏 Unix 文件系統所必需的功能,如符號鏈接、硬鏈接及其他各種 POSIX 兼容性,所以 HFS+ 開發組又花了一些工夫在不影響和 Mac OS 兼容性的情況下引入了這些功能。由于 HFS+ 是對 HFS 的擴展,故 HFS+ 支持 Mac OS 至 Mac OS X 的平滑過渡,所以 Mac OS X 一直默認使用 HFS+。但當時的 UFS 提供比 HFS+ 更先進的功能,因此 Mac OS X 10.0 至 10.4,也都支持把系統安裝在 UFS 系統上。

        Mac OS X 10.0 發布后,蘋果不遺余力地對 HFS+ 進行大規模的擴展和維護,增加了很多 UFS 獨有的功能。這些新功能使得文件系統更加安全穩定可靠。例如 Mac OS X 10.2.2 中,HFS+ 支持日志。日志功能在 Mac OS X 10.2 服務器版中可以簡單地設定,但在普通桌面版中需要使用命令行進行操作。在 Mac OS X 10.3 中,帶日志功能的 HFS+(被稱為 HFSJ,即 HFS+ volume with journal)成為默認設置。Mac OS X 10.3 亦增加名件名、目錄名區分大小寫及 Unicode 3.2 的支持。Mac OS X 10.4 中,HFS+ 更是增加了 ACL 訪問控制表功能,提供更復雜的對傳統 Unix 文件系統權限的擴展。

        文件系統除了讓用戶供穩定地存放文件這一目標以外,還是各項操作系統功能的基礎。Mac OS X 每個大發行版都要增加數百項新功能,許多新功能嚴重依賴于文件系統的實現。Mac OS X 10.3 提供了 FileVault 來加密用戶文件,因此用戶主目錄被保存在一個 HFS+ 文件系統加密鏡像中。Mac OS X 10.4 提供了系統內置的 Spotlight 桌面搜尋搜索功能,能讓用戶對整個磁盤系統進行快速搜尋、隨打即顯。這項功能要求文件系統提供任意長度文件元數據(metadata)的支持。Mac OS X 10.4 轉向了對 Intel 處理器的支持,因此蘋果發布了一個測試版本的 BootCamp 來讓用戶安裝 Mac OS X、Windows 雙系統,并在 Mac OS X 10.5 正式集成進系統。

        哪怕在 Mac OS X 系統運行,BootCamp 也可以在時調整系統主分區的大小,來空出磁盤空間給 Windows,因此,HFS+ 又需要支持動態分區大小調整。在 Mac OS X 10.5 中集成了 Time Machine, 它是蘋果公司所推出備份的工具程序,于 2006 年 8 月 7 日在蘋果計算機全球研發者大會(WWDC)中首次公開,成為當天觀眾歡呼聲最高的功能。Time Machine 對于修改過的文件會在備份盤上保存一個新拷貝,而對于不變的內容,僅在備份盤上存一個指向先前文件的硬鏈接。因此每一次快照只保存改動的文件,而別的文件 只保存占用空間很少的硬鏈接。但 Unix 一般只支持文件的硬鏈接而不支持目錄的硬鏈接。因此 HFS+ 在這點上走得比 Unix 文件系統更遠,提供了對于目錄的硬鏈接支持。在 Mac OS X 10.6 中,HFS+ 甚至支持文件系統壓縮,使得安裝后占用比 Mac OS X 10.5 少得多的空間。Mac OS X 10.7 提出了 FileVault2, 能加密整個磁盤而不是一個用戶目錄。這些功能我們在為讀者介紹每個發行版時亦會提到,但總之讀者看到,HFS+ 的功能隨著 Mac OS X 的商業需求不斷被擴展。“我在做了這么多工作后回想才發現,我們為 HFS+ 增加了那么多新功能,”蘋果前文件系統開發者 Don Brady 如是說。

        由于 HFS+ 經過后來若干年的發展,提供的功能已不遜于 UFS,甚至更多更好,故至 Mac OS X 10.5 砍掉了安裝至 UFS 的支持。HFS+ 成為唯一正式的 Mac OS X 系統。

        HFS+ 并不完美

        HFS+ 自發布以來,幾乎每個發行版都有令人欣喜的改動。它也逐漸成為一個非常完善的文件系統。但 HFS+ 立足于 HFS 設計,HFS 已有 27 年的歷史,HFS+ 亦有 14 年歷史。這個文件系統有大多的歷史包袱,為考慮兼容性,這些陳舊的設計并不能被推翻重來。

        HFS+ 基于B-樹實現,當查找B-樹中未使用的節點時,HFS+ 只能每次處理 16 位,原因是老 Mac 使用的 Motorola 的 68K 芯片原生支持 16 位的數據操作。但不管是 PowerPC 還是 Intel,寄存器都支持 256 位寬的寄存器。

        HFS+ 的元數據(metadata)都以大字節序保存,原因是 Motorola 的 68k 和后來 Mac 使用的 PowerPC 都使用大字節序。但經過 Intel 遷移后,當今的 Mac 都使用 Intel 芯片,而 Intel 芯片是使用小字節序的。因此每當數據讀取或存入時,還要經過小字節序和大字節序的轉換。遠古時期磁盤很慢,計算機處理器的速度也很低,因此進行一次磁盤操 作會占用較多的時間,HFS+ 的時間分辨率為一秒,但當今的磁盤、處理器處理一次文件系統操作的時間遠小于一秒,因此所有主流磁盤文件系統的時間分辨率都是一至數百納秒級別的。

        HFS+ 的元數據有全局鎖,同一時間只有一個進程可以訪問更新文件系統。在單核處理器連手機平板都較少見到的當今,這種設計顯得很幼稚。

        HFS+ 亦沒有稀疏文件的支持。例如我們在 SQL 中建立了一個數據庫,SQL 分配了 10GB 的文件給這個數據庫,并且在文件頭和文件尾寫上一些字節的數據。而由于我們還沒有給這個數據庫添加新的數據,所以這 10GB 的文件除了頭尾外其他字節都為0。現代的文件系統基本都支持稀疏文件,也就是說,當處理這個數據庫操作時,事實上往磁盤寫入的數據只有那文件頭和文件尾的 若干字節。而 HFS+ 則需要把那些 0 也寫上,因此會完整寫入 10GB 的數據,耗費長得多的時間。

        此外,HFS+ 不具備元數據校驗功能、快照功能、寫入時復制功能、就地執行功能邏輯卷管理功能等很多現代磁盤系統所具備的功能,也不能動態調整文件塊大小。這些功能的加入并不容易。

        其中最要命的是,HFS+ 不像一些先進的文件系統,支持寫入時復制事務模型,也沒有快照和克隆。這使得用戶數據時時處于風險之中。例如由于因為斷電、內核崩潰等原因,文件系統上寫 到一半的數據,小則導致個別文件損壞,大則導致整個文件系統崩潰。在生產領域,這樣不可靠的文件系統,很有可能帶來致命的災難。

        正是由于上述這些原因,連我們介紹過的短視的 Linus Torvalds 都認為 HFS+ 是個垃圾文件系統。蘋果自然受不了這種侮辱,因此,干掉 HFS+ 勢在必行。用什么取代 HFS+ 呢?蘋果開始秘密研發下一代的文件系統。

        作者王越,美國賓夕法尼亞大學計算機系研究生,中國著名 TeX 開發者,非著名 OpenFOAM 開發者。

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!