was successfully added to your cart.
蘋果資安邏輯層分析

ZFS開發者對於APFS檔案系統之評論

By 2017-10-05 No Comments

本文出自於 APFS詳解(APFS in Detail)主翻譯者是對岸的afatgoat ,OSSLab經過考量還是做了大量修改與補充.
(2017  10.5 12:58 本版本尚未完編修完)


本文原作者
阿達姆萊文索(Adam Leventhal):ZFS文件系統開發者之一、現Delphix公司CTO:

ZFS文件系統 為目前最開源的寫時復制(COW)檔案系統 ,
文件系統與磁盤綜合管理集成、支持寫時拷貝、快照與克隆、動態條帶化、可變塊尺寸、加密、數據壓縮等特性。
2004年發布,2005年併入Solaris系統的主幹代碼,2012年被用於生產環境,2013年推出穩定版本,它的發展從原型到成熟經歷了近10年。


APFS 系統開發者 同樣也為寫時復制(COW)檔案系統 
開發者:吉阿姆保羅.多米尼克(Dominic Giampaolo):Befs文件系統開發者之一
APFS, 全稱Apple File System, 開始於2014年開發,原作者問過開發者是否參考了其它最新檔案系統 如BSD的HAMMER, Linux的btrf, OpenZFS.
開發者回應說他知道這些技術,不過為了不被過多影響,他並沒深入研究它們.


前償

1985年HFS文件系統被應用於當時蘋果的旗艦產品Mac 512K的內存,後來HFS+作為其重要的更新於1998年在4GB硬盤的G3 PowerMac上發布。現在存儲已經增長了千倍,HFS+也已經被不同的人在不同的設備應用於多種競爭方向(也就是,iOS開發團隊偷偷摸摸自己製作了個HFS的變種,連Mac OS的團隊都不太清楚),並帶有不同的特性(日誌,下小寫不敏感等)。它太老了;太混亂了;更重要的是它缺少好多重要特性,這些特性是絕大多數操作系統為支持企業的基本特性,維基上面列出了比如納秒時間戳、校驗、快照和支持稀疏文件等。再加上對於大型設備的支持,自此你已經得到了一個APFS所需要支持的特性列表。

APFS首先是來償還過去無法維護的HFS+技術債務的(這相當於:2001年時ZFS的開發是為了替換1977年的UFS),將所有變種統一化,引入需要的功能,當然了要從基礎代碼開始。

對於很多文件系統中常見的壓縮功能,顯然是APFS支持特性列表缺少的。從概念上它很簡單,為了撫平多米尼克對BeOS的懷舊之情,我甚至回憶當初2000年時的面試,談論壓縮是如何改進整個系統性能的,因為I/O總比計算更加費時(現在盡人皆知,當初是一種新奇想法),我問其開發團隊(我們在最初ZFS的開發就包含了這個特性)為什麼沒有這個特性?蘋果員工儘管同意此觀點,但不置可否地暗示著(-蘋果特色-)這將是一個大家所期待的APFS的一個特性。但我並不會驚訝於壓縮功能沒有包含在公共發布本中。

加密

明顯的加密是APFS的核心屬性,需求來自於不同設備和多種需求,比如iPhone上需要文件系統支持多種密鑰,以及筆電上基於用戶的密鑰等。在WWDC上多次聽到的“革新”這個詞,APFS所支持的支持多種不同的加密選擇是最合適“革新”這個稱呼的。它支持:

  1. 不加密
  2. 單一密鑰的metadata和用戶數據加密
  3. 多密鑰並分別對metadata、文件、甚至文件的一部分加密

多密鑰加密對於移動設備更加有效,在所有數據都被加密的同時,用另外的密鑰進行解密訪問其數據。遺憾的是在beta版的macOS Sierra中並不支持(當使用diskutil命令生成一個加密的新卷後,文件系統卻報告說該卷是未加密的)。

與加密相關的,在我嘗試使用diskutil命令(除非你在命令行中加入選項:-IHaveBeenWarnedThatAPFSIsPreReleaseAndThatIMayLoseData,它會在輸出中明示APFS的數據有可能損壞,並讓用戶確認)的時候發現,APFS支持線性時間加密文件系統刪除(原文:“constant time cryptographic file system erase),在diskutil輸出中稱作“可擦寫”。這可能暗示:加密時的密鑰不能從AFPS中再次導出,如果是這樣,安全刪除只需要刪除該密鑰,而不需要擦除、重複擦除整個硬盤的數據。多個iOS的文檔都說這個功能需要特殊硬件支持,有趣的是對於macOS將會是什麼樣的特殊硬件。總之,不要告訴FBI或者NSA,大家同意吧?

快照和備份

APFS帶來了最急需文件系統的特性:快照。一個快照可以讓你保留文件系統在一個特定時刻的狀態,保留舊數據的同時繼續使用和更新。當然是有效利用空間基礎上的,保留舊數據的同時有效地跟踪並只添加新數據,這個特性對於備份有潛在的特殊價值,也就是可以有效跟踪上次以來的數據更新。

ZFS包括了快照和串行化的機制,這使得備份文件系統和遠程傳輸數據更加有效。APFS也會那樣嗎?多米尼克的回答是可能不會。ZFS只輸出改變的數據,而時間機器可能有排他列表。雖然這是可以克服的,但讓我拭目以待蘋果會如何做。目前來說APFS快照跟與Timemachine格式不兼容,因為APFS缺少對文件夾硬鏈接的支持,這是相當令人煩惱的與時間機器穩定性相關的措施。希望APFS可以有效的支持串行化功能來支持時間機器備份。

快照功能所需的工具沒有包含在macOS Sierra的beta版本中,但項目經理埃里克.田村還是演示了快照功能。我使用DTrace(蘋果從OpenSolaris一致過來的技術)發現該工具有個撩人的名字叫fs_snapshot。還是讓他人進行反向工程發掘它的合適用途吧。

管理

AFPS具有另外一個新特性叫做空間共享(space sharing)。一個單獨的APFS容器 container  (同等ZFS Pool)內可以包括跨越設備的多個卷(Volumes),蘋果拿它與固定分配空間支持多HFS+的實例對比,令人感到華而不實,其實ZFS和btrfs都有類似的擁有嵌套文件系統的共享存儲池概念。

卷作為一個整體來由用戶控制快照和加密,你可能希望多文件卷可以使用不同的策略,
例如,可能需要每天快照和備份系統數據的同時,而無需備份也不用管(快照時也忽略)/private/var/vm/sleepimage(用於休眠時存儲內存數據)文件。

 

空間效率

現代文件系統的發展趨勢是存儲更加高效而非提高設備的存儲空間大小。普通的做法是提供壓縮(正如前面所提到的)和減少重複。減少重複的做法是當發現相同區塊時避免重複存儲,這一點對文件服務器有很大好處,多個用戶和多個虛擬機可能有一個文件的多個副本,而對於單一用戶或者極少用戶的蘋果使用者來說可能沒多大用處(當然,它們是類服務器但是它們內心並不是)支持ZFS的經驗也告訴我要做好是相當困難的。

蘋果特殊的空間效率是線性時間文件和文件夾克隆。macOS的文件很多情況下其實就是文件夾;對於邏輯上將多個關聯的文件作為一個不可分割的單元的做法,其實是一種便利的做法,右鍵點擊一個應用程序並顯示包的內容,就知道我說的是什麼了。因此,我將會使用“文件”,而不是“文件和文件夾”的稱呼,以寬慰耐心讀到這裡的讀者(字面作者的意思是使用簡短的稱呼,因為本文已經夠長的了,其實是調侃一下)。

如果你在APFS的同一個容器中復製文件,不會產生重複數據,相反只是更新固定數量的metadata(元數據)並共享原先已存在的數據,對於任何一個複製版本的修改,都會產生新空間的分配(也就是寫時復制,簡稱COW)。

雖然很好地演示了這個特性,但我還沒有在其它文件系統中見過,我懷疑它的用途(更新:btrfs支持這功能,並稱其為reflinks-基於引用的連接)。在設備之間複製數據(例如復製到U盤上)當然會消耗一定的時間。我為什麼會在本地複制一個文件呢?我所能想到的一般用途是外行的版本控制:命題,命題的備份,舊命題,喝醉時編輯的命題保存。

基本上有三種文件:

  • 總是被完全重寫的文件:圖像,微軟Office文檔和視頻文件等
  • 只添加的文件:就像log文件一樣
  • 基於記錄結構的文件,比如數據庫

對於普通用戶,絕大多數文件是第一種。對於APFS來說我可以使用空間共享來複製文檔,不過一旦保存新版本,這個功能的好處就不復存在了,但這個想法可能更好地適用於大型文件。

就個人而言,僅有的情況是將一個文件,比如權利的遊戲劇集中的著作權法中“合理使用”一章的內容複製到Dropbox中的時候,現在我需要決定是複制還是徹底把該文件移到Dropbox中,克隆可能會更簡單些,但是硬鏈接同樣如此。

克隆功能可能產生潛在混亂,複製和刪除一個文件都有可能不佔用或釋放任何存儲空間。試想你需要將一個大型文件的所有版本都刪除才能釋放系統空間。

APFS的技術人員的腦子裡似乎還沒有多少實際應用例子;在WWDC中它們向開發者尋求建議(我所聽到的最好的是VM(虛擬機)的副本問題;當然不是主流市場)。如果單獨與一般的版本控制比較,我對Apple沒有給出更優雅的解決方案感到驚訝。可以想見如果APFS准許一個用戶使用基於文件的時間機器備份,搜尋任意文件的變更,這將為一個文件的每個版本自動地完全透明地產生一個新文件。你可以瀏覽以前版本、修改歷史記錄,或者一次性刪除所有版本。實際上5年前Apple就引入過這個,但是我從來沒有聽說過,直到我搜索到這個帖子(看看你是否點擊過“Browse All Versions…”)AFPS可以使之實施更簡明,簡化它的用途,對所有的應用都提供一般的支持。(APFS的特性)沒有一個可以解決我的權力遊戲的存儲問題,當然我也不認為這是一個問題。
旁注:Finder的複制使用空間效率克隆技術,但是cp命令行卻沒有。

性能

APFS聲稱對閃存進行了優化。閃存(NAND)是你的高速SSD的內部部件。當Apple將閃存應用到iPod和iPhone的時候改變的產業界,大量的基礎需求改變了閃存經濟環境,(Apple)作為閃存消費者改變了對產業的影響(正如它所經常做的一樣),使得混合硬盤和純閃存陣列在市場中得到提升。10年前SSD就像DRAM內存一樣貴,現在可以與硬盤爭奪市場了。

SSD模仿傳統硬盤的區塊尋址方式,但是內部運作卻完全不同。磁介質可以直接對每個扇區讀寫,閃存可以讀取頁數據,但只能刪除一個大區塊。這個操作由FTL閃存翻譯層管理,它更像一個文件系統,生成區塊與物理地址的虛擬對應,讓對區塊和頁的操作看起來更像硬盤(的扇區操作)。Apple要完全控制SSD,FTL和文件系統,以完全不同的方式,優化這些部件以讓它們協同工作。APFS所做的,其實是NAND所控制的,它是一個支持閃存特性的而不是一個專為閃存接口所寫的、2016年你所期待的文件系統。

APFS包括了對TRIM的支持,TRIM是ATA協議中的命令,它准許文件系統通知SSD(準確說是FTL)一個空間是空閒的了,SSD需要特定的空閒空間來實現高性能。SSD有這比其宣稱的更多物理容量,比如一個1TB的SSD實際有1TB(230-10243)字節的閃存,但它只顯示有931GB的可用空間,以偷偷地貼近業界的自律標準1TB( 10003=10億字節)。利用這些多餘空間,FTL可以實現高性能和長壽命。TRIM是文件系統所必須的功能,所以APFS支持它並不奇怪。TRIM的問題是只有當有空間釋放時特別是對性能提升方面才有用。如果你的盤將近滿了,TRIM無法為你做任何事。我懷疑TRIM可以為APFS帶來任何益處,而只是對用戶的安慰劑。

APFS也關注延時,Apple的第一目標是避免彩球死亡,APFS使用輸入/輸出QoS(服務品質保證)來給存取進行優先處理,也就是讓可見的用戶請求優先於那些非時間敏感的背景活動。這給用戶帶來無可置疑的的好處,同時也是一個成熟的文件系統所具備的能力。

數據完整性

毫無疑問一個文件系統最重要的任務是保護數據的完整性,“這是我的數據,別弄丟它,別隨便改變它”。如果文件系統可以被完全的信任,那麼備份的“唯一”理由就是傻X操作者了。文件系統有一些機制來保證數據安全。

冗餘

APFS沒有明說它提供數據冗餘。因為絕大多數的蘋果產品中只有一個存儲設備(一個邏輯SSD)來實現RAID,其實冗餘是更底層提供的,比如Apple RAID,硬件RAID,SANs,甚至是單一存儲設備本身。

在一個內部說明中,眾多運行APFS產品的SSD是多個獨立NAND芯片組成的,高端SSD確實是在硬件內部實現冗餘的,雖然犧牲了容量和性能。正如上面說的,針對SSD優化的APFS並沒有從表面的數據塊的接口而走得更遠,其實是硬件本身的功能。

而且,APFS刪掉了平時用戶實現數據冗餘的手段:複製文件。複製一個文件其實是產生一個輕量級的克隆,而不是數據複製。設備一旦損壞,所有的“複製品”都會被損壞,而本地完整復制可能只影響一個備份。

完全一致性

計算機系統可能隨時出問題-崩潰、缺陷和掉電等等,所以文件系統能從這些情況下恢復數據。最老舊的方法是在啟動時緩慢前行用工具檢查並修復文件系統(的不一致性-譯者註)(fsck,文件系統檢查的縮寫),更多的現代系統使用一致性格式或者縮小不一致窗口而降低全盤的fsck檢測來達到同樣的目的。例如ZFS,在磁盤上使用一個原子級的操作實現原子切換,生成一個新狀態(確保一致性-譯者註)。

擦寫有可能產生不一致性,如果文件系統需要重寫多個區域,而不同的區域可能是或新或舊狀態(這造成不一致性)。寫時復制(COW)就是避免這個衝突的,它總是先將新數據完全定位後,再釋放舊數據空間,而不是在原有數據上做修改。據說APFS使用一種“新穎的元數據寫時復制框架”,多米尼克強調了這個新穎性,但沒有詳細說。在稍後的交流中,他明確說APFS沒有使用ZFS的那種更新文件系統結果的單一原子的機制去複制所有的改變了的數據的元數據。

令人驚訝的是APFS還有一個fsck_apfs的工具,即便在詢問多米尼克之後也不能理解為什麼需要這個工具。相比較ZFS的功能,文件系統本身自己知道問題所在,而不是靠fsck來發現文件系統問題。看似多米尼克有點被弄糊塗了,為什麼ZFS放棄了fsck,所以可能只是我個人的想法吧。

校驗

APFS的介紹中明顯沒有提到校驗。校驗是用數據摘要或者總結來檢測(或修正)數據錯誤。這裡講得故事差別是很細微的。APFS只校驗元數據而不是用戶數據。只對元數據校驗的理由是:元數據不大(而校驗更不會佔用多少空間),而丟失它會造成數據丟失,如果高層元數據被破壞了,那麼可能造成整個潘德數據無法讀取。ZFS保存元數據的副本且對頂層元數據三重備份,也就是基於這個原因。

有趣的是(為什麼)不校驗用戶數據。與我交談的APFS工程師強調蘋果存儲設備自身有很強的ECC校驗功能,SSD和磁盤介質都使用冗餘檢查和修正錯誤,他們強調蘋果設備不會返回錯誤數據,NAND使用每4KB多餘128字節來確保數據的可修正(正確性)(相比較ZFS使用32字節對每個512字節作校驗,相較APFS的,兩者相差不多,但注意基於模擬變量的不確定性使得SSD需要使用ECC校驗)。在設備的生命週期中,設備產生一個比特錯誤的可能要比毫無錯誤的可能要高,而且還有其它的錯誤原因,比如無價值的文件系統冗餘檢查。SSD有多種市場,批量的消費級產品不提供端對端的ECC保證,使得數據在傳輸中可能出現錯誤,更何況固件本身還可能有錯誤造成數據丟失。

蘋果員工們對設備衰減(數據會隨時間喪失完整性)造成錯誤的經驗很感興趣。我見過很多的實例,設備沒有報錯但是ZFS正確地發現了錯誤。Apple對設備供應商有著苛刻的檢查,我同意他們的產品是高質量的,他們聲稱Apple產品用戶沒有衰減的擔憂,但如果你的軟件不能檢測到錯誤,你又如何知道設備的實際性能呢。ZFS在數百萬元的陣列存儲設備上發現過數據錯誤,如果不能發現Apple的TLC的NAND芯片的錯誤,那才是令人驚訝的,想想最近iPhone 6的存儲問題的召回事件,其實Apple設備已經出過問題了。

對於關心在Mac數據的用戶,在HFS中丟失數據的,甚至昂貴的企業級設備也丟失數據的用戶,我會很願意每4KB犧牲16字節(來換取數據的一致性),那隻是犧牲1 %的數據空間而已。

擦洗

隨著時間推移你可能想檢查一下設備衰減情況,看上去fsck_apfs可以做到;前面已經提到的,因為沒有冗餘和用戶數據校驗,那麼擦洗(scrub)操作只有助於發現錯誤而不能修正錯誤,如果我是從Fry店買的便宜貨而不是Apple的鍍金高檔貨,這可以說服Apple改變主意(放棄蘋果用戶只會使用蘋果配件的假設,而增加文件系統校驗冗餘等功能)嗎?

總結

不知是不是Apple必須換掉HFS+,但他們已經給大家一種印象,維護一個30多年舊的軟件比一個新的來得更高昂。APFS就是依據這個觀點而生的。

依據Apple演示的來看,我推測它的核心目的是:
-滿足所有用戶(筆電、手機和手錶等用戶)
-加密是首位的
-快照是近代化的備份

所有這些都會惠及所有Apple用戶,基於WWDC的演示,APFS就在這條正軌上(雖然macOS Sierra的beta版還相差甚遠)

實施一個新文件系統的過程中,APFS的團隊添加一些所期待的功能。HFS產生於400KB軟盤(那個過時的無處不在的保存圖標)統治世界的時代,任何2014年之後的文件系統都應該考慮大型存儲和SSD設備。寫時復制(COW)和快照屬於必備功能,把Finder中的複制命令變得更快些也不能算是走彎路,用戶情形還不明了,推測結論是典型的廢話,自尋麻煩的方法,但是依然是一個有趣的演示,彩球死機厄運確實是APFS想要避免的。

APFS的開發者文檔中有一條關於開源的:“此時不提供開源”,不期待APFS最近或者將來可以開源,Apple最好證明我是錯的,如果APFS可以成為世界級的產品,我很願意在Linux和FreeBSD中看到它的身影,甚至微軟放棄自己的ReFS。就我的ZFS的經驗來說,開源可以加速它成就卓越的步伐。真遺憾,APFS缺少用戶數據的校驗功能,不提供數據冗餘。數據完整性是文件系統的任務之一,我相信這一點對於手錶和手機與服務器是同樣重要的。

APFS在穩定性上還需改進,對於所有Apple用戶和所有設備都是這樣。成功與失敗機會相同,既然APFS已經分享給了世界與開發者們,Apple肯定已經通過過去數年中的討論中得出自己從最基本開始做起的結論,而不是採納一個現有的現代技術,那麼數據完整新和開放性就是應該被重視的時候了。

Thx Chang

Author Thx Chang

More posts by Thx Chang

Leave a Reply