2016年WWDC大會上,Apple除了公布watchOS、tvOS、macOS以及iOS等一系列系統和軟件更新外,還公布了一個名為APFS(Apple File System)的文件系統。
這一全新文件系統專門針對閃存/SSD進行優化(但依然可用于傳統機械硬盤),提供了更強大的加密、寫入時復制元數據、空間分享、文件和目錄克隆、快照、目錄大小快速調整、原子級安全存儲基元,以及改進的文件系統底層技術,將全面應用于該公司旗下所有設備中。
為什么不繼續使用HFS+?
HFS誕生于1985年,隨后在1998年發布的4GB硬盤版本G3 PowerMac中引入了改進的HFS+文件系統。從1998年4GB容量的傳統HDD機械硬盤,到現在TB規模的SSD固態硬盤,HFS+已經招架不住存儲領域的大量改變和創新。
經過長期發展,HFS+針對不同類型的設備衍生出不同功能的多種分支,但它畢竟太老、太混亂了。更重要的是,該文件系統不具備當今大多數企業所需要的一些基本功能,例如納秒級時間戳、校驗、快照、稀疏文件等。Apple生態圈急需一種能夠取代HFS+的全新文件系統。
APFS應運而生!在解決HFS面臨的各種遺留問題同時,還對HFS的所有變體進行了統一,這是Apple從底層代碼開始從零打造的全新文件系統。
APFS概述
全新開發的APFS除了支持HFS+的全部功能外,還在以下方面有了突出的改進:
與使用32位文件ID的HFS+不同,APFS可支持64位索引節點(Inode)編號,借此一個卷最多可存儲超過900億億個文件。HFS+只能同時對整個存儲設備的文件系統進行初始化,APFS提供了一種可擴展存儲塊分配程序(Extensible block allocator),可對數據結構進行延遲初始化(Lazy initialization),進而大幅改善大容量卷的性能。APFS支持三種模式的加密:不加密;適用于元數據和用戶數據的單密鑰加密;以及適用于元數據、文件,甚至文件中特定部分的多密鑰加密。此外APFS還包含其他改善和新功能,例如稀疏文件、改進的TRIM操作,內建對擴展屬性的支持等。
脫胎換骨的APFS已經具備與BSD HAMMER、Linux btrfs,或OpenZFS等現代化文件系統不相上下的功能和特性。
數據加密
安全與隱私是APFS的設計基礎。Apple的很多設備和操作系統早已具備加密功能,OS X 10.7 Lion開始提供全磁盤加密功能;iOS 4開始可通過專用數據保護技術將每個文件使用一個專用密鑰進行加密。APFS對這兩種功能進行整合,為文件系統元數據提供了一種統一的加密模式。
加密是APFS原生支持的特性,用戶可以針對每個卷選擇下列任何一種加密方法:不加密,統一用一個密鑰加密,或多密鑰加密(針對每個文件使用專用密鑰加密,同時針對敏感的元數據使用一個單獨的密鑰)。多密鑰加密可確保哪怕設備物理安全受到威脅,依然可以保障用戶數據的完整性。取決于具體硬件,APFS加密可使用AES-XTS或AES-CBC算法。
這種加密機制還實現了一個額外的功能:更為快速的數據擦除。通常情況下當用戶從設備中刪除文件后,可以通過市面上提供的很多(免費或收費的)反刪除軟件找回刪掉的內容。為避免這種情況,以往如果需要刪除包含機密信息的文件,或需要將存儲過私密數據的設備退役給他人使用,必須首先使用抹掉功能擦除存儲設備,并可能要將這一過程執行多遍。取決于存儲設備容量,整個過程將耗費極多時間。
對于使用APFS文件系統的存儲設備,在啟用加密功能后,安全擦除的過程將變得大為簡便和快捷,不再需要耗費大量時間多次給存儲設備填充隨機數據,只需要刪除加密所用的密鑰即可。
快照和備份功能
快照功能可將文件系統的狀態“固定”在創建快照的那一刻,并可在保留固定狀態的同時繼續訪問和修改文件系統。這種技術可以只記錄新增或改動的數據塊,因此可以為文件系統創建多個快照,而無需擔心會占用大量存儲空間。備份工具(例如Time Machine)通常會使用該功能記錄自從上次備份之后文件系統的改動情況,并可用于在不打斷用戶操作的前提下對數據進行更為高效的備份。
由于不支持目錄硬鏈接,APFS暫不兼容Time Machine,希望以后APFS能夠針對Time Machine提供更高效的序列化機制。本屆WWDC上,APFS的開發經理Eric Tamura在演示APFS的快照功能時使用了一個尚未包含在Beta版macOS Sierra中的工具,同時根據Apple的介紹,目前尚未提供用于訪問快照功能的API,期待在后續版本中這個技術能夠盡快完善起來。
空間共享
APFS包含一個名為“空間共享”的新功能,借助該功能,多個文件系統可以共享同一個物理卷上的同一塊底層可用空間。也就是說,設備上的一個APFS“容器”內部可以包含多個“卷”(文件系統)。HFS+需要為每個文件系統預先分配固定大小的容量,這種做法較為“僵硬”,而APFS的空間共享功能可以讓用戶在無需重分區的情況下動態、靈活地擴大或縮小卷容量。
在這樣的設計下,APFS容器內的每個卷都會顯示同等的可用空間容量,而所顯示容量會等同于該容器的可用存儲空間總量。例如,假設有個容量100GB的APFS容器,其中包含已用10GB容量的卷A和已用20GB容量的卷B,卷A和卷B都會顯示自己有70GB(100GB-10GB-20GB)的可用容量。
存儲空間使用效率
現代化的文件系統往往會通過壓縮和去重(Deduplication)等方式減小文件占用的空間量。壓縮很好理解,去重是指找出大量文件中相同的數據塊,并只將這樣的塊存儲一次,在訪問文件時,會根據實際情況動態“拼裝”出最終的文件。這樣的功能最適合保存大量用戶文件或大量虛擬機映像的服務器環境。
APFS可以用恒定的速度對多個文件和目錄創建副本。舉例來說,如果要在同一個文件系統(或同一個容器)內部復制文件,實際上并不需要為數據創建副本,只需要對文件的元數據進行適當的更新就可以讓磁盤上存儲的數據實現“共享”,此時相同的文件“實際體積”不變,但產生了兩個副本,對任何一個副本進行改動則需要為其分配新的存儲空間(這種方式也叫做“寫入時復制”)。
文件基本可以分為下列三種類別:
每次需要全面覆蓋的文件,例如圖片、Office 文檔、視頻等可以“附加”新內容的文件,例如日志文件使用基于記錄結構的文件,例如數據庫文件對大部分普通用戶來說,接觸最多的可能就是第一種文件。在APFS的幫助下,可以將文檔(例如體積為10MB)復制多次,并借助空間共享功能節約存儲空間的用量,但只要改動過其中任何一個副本,就需要為這個副本分配10MB空間。
這樣的“克隆”有可能給用戶造成一定的困擾。既然復制的文件不占用空間,那刪除這些文件也不會釋放出空間。
另外還需要注意一點:在Finder內復制文件會產生這樣可以節約空間的“克隆”,但命令行中的cp命令還會使用以往的方式為文件創建完整的副本。
性能
APFS專門針對閃存進行了優化。SSD雖然可以模擬傳統機械硬盤的“塊”,但底層技術與機械硬盤截然不同。SSD底層的管理工作是由一種名為閃存轉換層(FTL,Flash Translation Layer)的軟件負責處理的。FTL與文件系統極為類似,可以在塊地址和介質內部的位置之間創建虛擬映射(轉換)。整個堆棧,包括SSD、FTL,以及文件系統都由Apple控制,可以更有針對性地對不同組件進行優化。
此外APFS還提供了對TRIM的支持。TRIM是ATA協議中的一個命令,可以讓文件系統告訴SSD(其實是指示SSD中的FTL)某些空間是空閑的。可用空間越多,SSD的性能表現會越好,甚至大部分SSD所擁有的存儲容量會超過標稱值。
舉例來說,假設有一個1TB容量的SSD,顯示的可用空間總量為931GB。在有更多可用空間的情況下,FTL可以犧牲空間利用率換回更高性能和更長壽命。但TRIM的問題在于,只有在存在可用空間的情況下這個功能才會有用,如果磁盤即將裝滿,TRIM不會為你帶來任何效果。
性能方面,APFS的延遲也有了大幅改善。APFS可以通過I/O QoS(服務質量)對不同的訪問請求劃分優先級,將用戶可以立刻察覺的操作和后臺活動區分對待。
數據完整性
確保數據完整性,可以說這是任何文件系統的首要目標。我把數據交給你,你別弄丟了,也別隨意修改。但如果這一切真的能實現,我們又為什么要“備份”呢?為確保數據安全,文件系統通常會采取一系列機制。
冗余
大部分Apple設備只有一個存儲設備(即一個邏輯SSD),因此RAID之類的做法毫無意義。此時冗余是通過更底層的組件實現的,例如Apple RAID、硬件RAID控制器、SAN,甚至“單一”存儲設備本身。
但是也要注意,大部分可支持APFS的Apple設備中的SSD實際上是由多個或多或少相互獨立的NAND芯片組成的。一些高端SSD會在內部實施一定的數據冗余,但需要付出容量和性能雙雙降低的代價。
此外APFS使得“復制文件”這一用戶最常用的實現本地數據冗余的方法也失去了作用。APFS中復制的文件實際上只是對文件創建了輕量級克隆,實際數據并沒有重復保存,底層設備的故障會導致所有“副本”受損。
絕對一致性
計算機系統在任何時候都可能出故障:崩潰、Bug、斷電等…… 文件系統必須能夠預見到這種情況并從故障中順利恢復。遇到這種情況,以前可能需要嘗試著用專門的工具在系統啟動前檢查并修復文件系統(例如使用fsck)。較為現代化的系統會使用某些“始終一致”的格式,或將不一致的可能盡量降低,以避免耗費大量時間執行完整的fsck檢查。例如ZFS就可以在磁盤上構建一個新狀態,然后通過一次原子操作從之前的狀態以原子級方式過度到新狀態。
覆蓋寫入數據是最容易造成不一致的操作。如果文件系統需要覆寫文件的多個區塊,有一定可能遇到一些區塊已經代表新狀態,但一些區塊依然代表舊的狀態。為避免這種問題,可以使用上文提到的寫入時復制這一方式,首先分配新區塊,隨后釋放舊區塊使其可被再次使用,而不需要就地修改數據。APFS實施了一種“全新的寫入時復制元數據體系”,這種方式的新穎之處在于,APFS并未使用ZFS機制復制已更改用戶數據的所有元數據,只需要對文件系統結構進行一次原子更新即可實現。
校驗
校驗是一種針對數據進行的摘要會匯總,可用于檢測(和糾正)數據錯誤。APFS會對自己的元數據,而非用戶數據進行校驗。這種對元數據進行校驗的做法理由非常充分:大部分元數據都與用戶數據無關(因此校驗不會耗費太多存儲空間),而丟失元數據會有極大可能造成用戶數據的丟失。距離來說,假設某個頂層目錄的元數據出錯,那么磁盤上的所有數據都有可能無法訪問。也正是因此,ZFS會對元數據創建副本(甚至對頂層元數據創建三重副本)。
但是完全不對用戶數據進行校驗,這種做法似乎更有趣。WWDC上的APFS工程師稱,Apple設備的存儲具備強大的ECC糾錯保護。NAND閃存SSD和磁介質機械硬盤都可以使用冗余數據檢測和糾正錯誤。Apple工程師認為,Apple設備通常不會遇到數據錯誤。NAND會使用額外的數據,例如每4KB頁使用額外的128字節數據,借此檢測和糾正數據錯誤。設備本身的誤碼率已經足夠低,可以認為設備整個生命周期內都不會出現錯誤。還有一些設備錯誤可以通過文件系統的冗余機制避免。SSD中包含大量組件,而大部分消費類產品中的SSD很少包含端到端的ECC保護,因此可能導致數據傳輸過程中出現錯誤。SSD固件中也可能包含導致數據丟失的Bug。
Apple對于供應商的設備質量測試可能是最嚴格的,用戶可以相信Apple產品使用了最高質量的組件。Apple工程師認為,此類設備的用戶無需擔心比特衰減(Bit Rot,逐漸老化的數據會慢慢喪失完整性)的問題,但如果軟件本身無法檢測錯誤,用戶當然不知道設備的具體情況如何。價值數百萬美元的存儲陣列所用的ZFS也可能出現數據錯誤,那么Apple設備中所用的TLC NAND芯片(最便宜的NAND芯片類型)憑什么就不會出錯?別忘了就在不久前某些大容量iPhone 6才剛剛因為存儲問題而召回。
總結
Apple是否能完全用APFS取代HFS+,這一點還不確定,不過他們很可能已經到了這樣一個轉折點:繼續維護并改進過了“而立之年”的軟件,這樣的做法可能比全新開發一套新的軟件成本更高。APFS就是這樣一種權衡之后的產物。
根據Apple在WWDC上的介紹,APFS的核心設計目標可能是這樣的:
讓所有消費者(筆記本、手機、手表等)滿意將數據加密作為頭等要務為現代化備份方式提供快照功能這些目標可以讓所有Apple用戶獲益,從WWDC上的演示可知,APFS似乎已經開始逐漸走上正軌(盡管測試版的macOS Sierra似乎還有一段路要走)。
APFS開發文檔中針對“開源”有一個小注解:“開源的實現目前尚不可用”。其實很多人并不指望APFS能夠開源。但如果APFS能夠成為世界領先的文件系統,用戶肯定還是希望在Linux和FreeBSD中也能使用,也許到時候Microsoft也能停止在ReFS方面的研發。APFS不針對用戶數據進行校驗,沒有提供數據冗余機制,這些確實讓人感覺遺憾,畢竟數據完整性應該是任何文件系統的頭等要務,而無論這樣的文件系統將用于手表或手機,或者服務器,文件完整性問題都應該重視起來。
目前APFS已經以開發者預覽版的方式通過OS X 10.12(macOS Sierra)提供給用戶,預計將在2017年正式發布。
若要嘗試該功能,可在升級至macOS 10.12后通過新增的hdiutil命令行工具創建APFS卷:
$ hdiutil create -fs APFS -size 1GB foo.sparseimage目前的測試版APFS有一些局限:
無法用于啟動磁盤。文件和目錄名稱大小寫敏感。無法用于Time Machine、FileVault或Fusion驅動器。現有第三方工具需要更新才能支持APFS。APFS文件系統的卷無法被OS X 10.11 Yosemite以及更早的版本識別。APFS卷可以通過SMB網絡文件共享協議共享,AFP協議已棄用,無法用于共享APFS卷。