你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> iOS 10.3的APFS系統

iOS 10.3的APFS系統

編輯:IOS開發基礎

1170656-cbe8353a84f06684.jpg

何為APFS

在iOS 10.3中,蘋果新增了APFS新文件系統,最早在2016年WWDC大會上公布。APFS是Apple File System的簡稱,用於替代目前所使用的HFS+格式。APFS對HFS的所有變體進行了統一,這是Apple從底層代碼開始從零打造的全新文件系統。與使用32位文件ID的HFS+不同,APFS可支持64位索引節點(Inode)編號,借此一個卷最多可存儲超過900億億個文件。HFS+只能同時對整個存儲設備的文件系統進行初始化,APFS提供了一種可擴展存儲塊分配程序(Extensible block allocator),可對數據結構進行延遲初始化(Lazy initialization),進而大幅改善大容量卷的性能。

APFS針對閃存/SSD存儲進行優化(但依然可用於傳統機械硬盤),提供了更強大的加密、寫入時復制(Copy-on-write)元數據、空間分享、文件和目錄克隆、快照、目錄大小快速調整、原子級安全存儲基元(Atomic safe-save primitives),以及改進的文件系統底層技術。此外APFS還包含其他改善和新功能,例如稀疏文件、改進的TRIM操作,內建對擴展屬性的支持等。

安全與隱私是APFS的設計基礎。Apple的很多設備和操作系統早已具備加密功能,OS X 10.7 Lion開始提供全磁盤加密功能;iOS 4開始可通過專用數據保護技術將每個文件使用一個專用密鑰進行加密。APFS對這兩種功能進行整合,為文件系統元數據提供了一種統一的加密模式。APFS支持三種模式的加密:不加密;適用於元數據和用戶數據的單密鑰加密;以及適用於元數據、文件,甚至文件中特定部分的多密鑰加密。多密鑰加密功能,內置有針對每個文件的密鑰,其針對敏感元數據也都有獨立的密鑰,在確保可靠性的基礎上優化性能。多密鑰加密可確保哪怕設備物理安全受到威脅,依然可以保障用戶數據的完整性。取決於具體硬件,APFS加密可使用AES-XTS或AES-CBC算法。

這種加密機制還實現了一個額外的功能:更為快速的數據擦除。通常情況下當用戶從設備中刪除文件後,可以通過市面上提供的很多(免費或收費的)反刪除軟件找回刪掉的內容。為避免這種情況,以往如果需要刪除包含機密信息的文件,或需要將存儲過私密數據的設備退役給他人使用,必須首先使用抹掉功能擦除存儲設備,並可能要將這一過程執行多遍。取決於存儲設備容量,整個過程將耗費極多時間。對於使用APFS文件系統的存儲設備,在啟用加密功能後,安全擦除的過程將變得大為簡便和快捷,不再需要耗費大量時間多次給存儲設備填充隨機數據,只需要刪除加密所用的密鑰即可。

APFS包含一個名為“空間共享”的新功能,借助該功能,多個文件系統可以共享同一個物理卷上的同一塊底層可用空間。也就是說,設備上的一個APFS“容器”內部可以包含多個“卷”(文件系統)。HFS+需要為每個文件系統預先分配固定大小的容量,這種做法較為“僵硬”,而APFS的空間共享功能可以讓用戶在無需重分區的情況下動態、靈活地擴大或縮小卷容量。在這樣的設計下,APFS容器內的每個卷都會顯示同等的可用空間容量,而所顯示容量會等同於該容器的可用存儲空間總量。例如,假設有個容量100GB的APFS容器,其中包含已用10GB容量的卷A和已用20GB容量的卷B,卷A和卷B都會顯示自己有70GB(100GB-10GB-20GB)的可用容量。

現代化的文件系統往往會通過壓縮和去重(Deduplication)等方式減小文件占用的空間量。壓縮很好理解,去重是指找出大量文件中相同的數據塊,並只將這樣的塊存儲一次,在訪問文件時,會根據實際情況動態“拼裝”出最終的文件。這樣的功能最適合保存大量用戶文件或大量虛擬機映像的服務器環境。APFS可以用恆定的速度對多個文件和目錄創建副本。舉例來說,如果要在同一個文件系統(或同一個容器)內部復制文件,實際上並不需要為數據創建副本,只需要對文件的元數據進行適當的更新就可以讓磁盤上存儲的數據實現“共享”,此時相同的文件“實際體積”不變,但產生了兩個副本,對任何一個副本進行改動則需要為其分配新的存儲空間(這種方式也叫做“寫入時復制”)。APFS中復制的文件實際上只是對文件創建了輕量級克隆,實際數據並沒有重復保存,底層設備的故障會導致所有“副本”受損。

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(服務質量)對不同的訪問請求劃分優先級,將用戶可以立刻察覺的操作和後台活動區分對待。計算機系統在任何時候都可能出故障:崩潰、Bug、斷電等…… 文件系統必須能夠預見到這種情況並從故障中順利恢復。遇到這種情況,以前可能需要嘗試著用專門的工具在系統啟動前檢查並修復文件系統(例如使用fsck)。較為現代化的系統會使用某些“始終一致”的格式,或將不一致的可能盡量降低,以避免耗費大量時間執行完整的fsck檢查。例如ZFS就可以在磁盤上構建一個新狀態,然後通過一次原子操作從之前的狀態以原子級方式過度到新狀態。

校驗是一種針對數據進行的摘要會匯總,可用於檢測(和糾正)數據錯誤。APFS會對自己的元數據,而非用戶數據進行校驗。這種對元數據進行校驗的做法理由非常充分:大部分元數據都與用戶數據無關(因此校驗不會耗費太多存儲空間),而丟失元數據會有極大可能造成用戶數據的丟失。距離來說,假設某個頂層目錄的元數據出錯,那麼磁盤上的所有數據都有可能無法訪問。也正是因此,ZFS會對元數據創建副本(甚至對頂層元數據創建三重副本)。

但是完全不對用戶數據進行校驗,這種做法似乎更有趣。大部分可支持APFS的Apple設備中的SSD實際上是由多個或多或少相互獨立的NAND芯片組成的。Apple設備的存儲具備強大的ECC糾錯保護。NAND閃存SSD和磁介質機械硬盤都可以使用冗余數據檢測和糾正錯誤。NAND會使用額外的數據,例如每4KB頁使用額外的128字節數據,借此檢測和糾正數據錯誤。設備本身的誤碼率已經足夠低,可以認為設備整個生命周期內都不會出現錯誤。還有一些設備錯誤可以通過文件系統的冗余機制避免。SSD中包含大量組件,而大部分消費類產品中的SSD很少包含端到端的ECC保護,因此可能導致數據傳輸過程中出現錯誤。SSD固件中也可能包含導致數據丟失的Bug。

覆蓋寫入數據是最容易造成不一致的操作。如果文件系統需要覆寫文件的多個區塊,有一定可能遇到一些區塊已經代表新狀態,但一些區塊依然代表舊的狀態。為避免這種問題,可以使用上文提到的寫入時復制這一方式,首先分配新區塊,隨後釋放舊區塊使其可被再次使用,而不需要就地修改數據。APFS實施了一種“全新的寫入時復制元數據體系”,這種方式的新穎之處在於,APFS並未使用ZFS機制復制已更改用戶數據的所有元數據,只需要對文件系統結構進行一次原子更新即可實現。

APFS系統提升了蘋果的iOS、macOS、watchOS及tvOS等平台的文件完整性與安全性。APFS系統啟用後,大大縮減了系統的體積,升級到iOS 10.3系統後,可以使內置空間多出1GB的空間,對於老型號的機器是個很好的消息。

根據Apple在WWDC上的介紹,APFS的核心設計目標是將數據加密作為頭等要務,為現代化備份方式提供快照功能。但APFS也有些不盡如人意的地方,如:APFS不針對用戶數據進行校驗,沒有提供數據冗余機制;無法用於啟動磁盤,文件和目錄名稱大小寫敏感,無法用於Time Machine、FileVault或Fusion驅動器;APFS文件系統的卷無法被OS X 10.11 Yosemite以及更早的版本識別等。但技術總是進步的,誰能說這些問題不會在不久的將來解決呢?我們拭目以待。

早期的文件系統HFS+和UFS

文件系統除了讓用戶供穩定地存放文件這一目標以外,還是各項操作系統功能的基礎。Mac OS X每個大發行版都要增加數百項新功能,許多新功能嚴重依賴於文件系統的實現。

  • UFS

UFS是經典的Unix文件系統,HFS+和UFS文件系統同時被引入早期的Mac OS X。在Unix系統早期,文件系統被稱為FS。FS包括啟動塊、超級塊(處於硬盤分區開頭用來保存文件系統信息)、inodes(索引節點)及數據,但FS會導致抖動等一系列問題。為了解決這些問題,產生了FFS(Fast File System)。FFS把先前整塊的磁盤文件系統分為小塊,每塊包含自已的索引節點和數據,因而增加了文件的局部性,減少了尋道時間。Unix系統的各BSD分支(FreeBSD、OpenBSD、NetBSD及DragonFlyBSD)在FFS文件系統上增加各種擴展,但這些擴展往往不互相兼容,卻又都使用和原版同樣的塊大小和數據塊寬度,因此可以在一個操作系統上能對另一操作系統的文件系統執行只讀操作。故它有了一個更廣泛的稱謂——UFS(Unix File System,即Unix文件系統)。

後來,UFS提供了簡單的日志功能。在檔案系統發生變化時,先把相關的信息寫入一個被稱為日志的區域,然後再把變化寫入主文件系統的文件系統。在文件系統發生故障(如內核崩潰或突然停電)時,日志文件系統更容易保持一致性,並且可以較快恢復。

BSD的Soft Update功能,保證了計算機掉電或系統崩潰時,通過使元數據按依賴順序更新來確保磁盤上總的文件系統保持一致的實現機制。Soft Update的目標和日志類似,實現代價比日志輕量許多,但卻需要引入一個後台FSCK檢查。基於對UFS的一項改進,為Soft Update加入了日志功能,並消除了對FSCK的依賴。

先前,Unix文件系統的訪問控制是非常簡單的,其權限管理分為三個不同的類別:用戶、同組用戶以及其他用戶,對每個類別,Unix文件系統提供讀、寫、執行三種權限的管理。這樣的許可管理過於粗糙,無法指定某一用戶訪問的權限,也無法指定更為細致的權限內容(例如准許對一文件實行刪除操作)。為解決這個問題,UFS增加了ACL訪問控制表功能(Access Control Lists),訪問控制表被增加到文件系統中,使用以存取控制矩陣為基礎的存取控制方法。存取控制串列描述每一個文件對象各自的存取控制,並記錄可對此物件進行存取的所有主體對對象的權限。總之,UFS與時俱進,不斷增加新的功能。

Mac OS X起源於NeXTSTEP,因為基於BSD,所以自然也使用UFS。

  • HFS+

在引入UFS的同時,Mac OS 還有個文件系統HFS,HFS誕生於1985年,為了實現Mac OS的現代化,在HFS的基礎上,加入現代文件系統所必需的新功能,如大文件支持、Unicode文件名支持、長文件名支持、32位文件映射表支持等,同時也把HFS項目原本的Mac使用的68K處理器匯編碼改寫成C代碼。即改進的HFS+文件系統。

HFS+根植Mac OS,HFS+是對HFS的擴展,故HFS+支持Mac OS至Mac OS X的平滑過渡,所以Mac OS X一直默認使用HFS+,但當時的UFS提供比HFS+更先進的功能。Mac OS X 10.2.2開始,HFS+支持日志,帶日志功能的HFS+(被稱為HFSJ,即HFS+ volume with journal)成為默認設置。之後增加了名件名、目錄名區分大小寫及Unicode 3.2的支持。Mac OS X 10.4中,HFS+更是增加了ACL訪問控制表功能,提供更復雜的對傳統Unix文件系統權限的擴展。在Mac OS X 10.5之後HFS+成為唯一正式的Mac OS X系統,HFS+提供的功能也已超越UFS。

在逐步的優化中,HFS+愈走愈遠。

  • FileVault可以用來加密用戶文件,因此用戶主目錄被保存在一個HFS+文件系統加密鏡像中。Mac OS X 10.7提出了FileVault2,能加密整個磁盤而不是一個用戶目錄。

  • Spotlight桌面搜尋搜索功能,能讓用戶對整個磁盤系統進行快速搜尋、隨打即顯。這項功能要求文件系統提供任意長度文件元數據(metadata)的支持。

  • BootCamp需要時時調整系統主分區的大小,來空出磁盤空間給Windows,因此,HFS+又需要支持動態分區大小調整。

  • Time Machine,是蘋果公司所推出備份的工具程序,Time Machine對於修改過的文件會在備份盤上保存一個新拷貝,而對於不變的內容,僅在備份盤上存一個指向先前文件的硬鏈接。因此每一次快照只保存改動的文件,而別的文件只保存占用空間很少的硬鏈接。但Unix一般只支持文件的硬鏈接而不支持目錄的硬鏈接。因此HFS+在這點上走得比Unix文件系統更遠,提供了對於目錄的硬鏈接支持。

  • HFS+支持文件系統壓縮,使得安裝後占用比Mac OS X 10.5少得多的空間。

但,HFS+並不完美。

不完美的文件系統

經過長期發展,HFS+針對不同類型的設備衍生出不同功能的多種分支,但它畢竟太老、太混亂了。更重要的是,該文件系統不具備當今大多數企業所需要的一些基本功能,例如納秒級時間戳、校驗、快照、稀疏文件等。從1998年4GB容量的傳統HDD機械硬盤,到現在TB規模的SSD固態硬盤,HFS+已經招架不住存儲領域的大量改變和創新。

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

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

20.png

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

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

此外,HFS+不具備元數據校驗功能、快照功能、寫入時復制功能、就地執行功能、邏輯卷管理功能等很多現代磁盤系統所具備的功能,也不能動態調整文件塊大小。這些功能的加入並不容易。這使得用戶數據時時處於風險之中。例如由於因為斷電、內核崩潰等原因,文件系統上寫到一半的數據,小則導致個別文件損壞,大則導致整個文件系統崩潰。在生產領域,這樣不可靠的文件系統,很有可能帶來致命的災難。

快照功能可將文件系統的狀態“固定”在創建快照的那一刻,並可在保留固定狀態的同時繼續訪問和修改文件系統。這種技術可以只記錄新增或改動的數據塊,因此可以為文件系統創建多個快照,而無需擔心會占用大量存儲空間。備份工具(例如Time Machine)通常會使用該功能記錄自從上次備份之後文件系統的改動情況,並可用於在不打斷用戶操作的前提下對數據進行更為高效的備份。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved