Apple新發布的APFS文件系統對用戶意味著什么

2016年WWDC大會上,Apple除了公布watchOS、tvOS、macOS以及iOS等一系列系統和軟件更新外,還公布了一個名為APFS(Apple File System)的文件系統。

這一全新文件系統專門針對閃存/SSD進行優化(但依然可用于傳統機械硬盤),提供了更強大的加密、寫入時復制元數據、空間分享、文件和目錄克隆、快照、目錄大小快速調整、原子級安全存儲基元,以及改進的文件系統底層技術,將全面應用于該公司旗下所有設備中。

20160708114950916.jpg

  為什么不繼續使用HFS+?

HFS誕生于1985年,隨后在1998年發布的4GB硬盤版本G3 PowerMac中引入了改進的HFS+文件系統。從1998年4GB容量的傳統HDD機械硬盤,到現在TB規模的SSD固態硬盤,HFS+已經招架不住存儲領域的大量改變和創新。

20160708114950963.jpg

經過長期發展,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算法。

這種加密機制還實現了一個額外的功能:更為快速的數據擦除。通常情況下當用戶從設備中刪除文件后,可以通過市面上提供的很多(免費或收費的)反刪除軟件找回刪掉的內容。為避免這種情況,以往如果需要刪除包含機密信息的文件,或需要將存儲過私密數據的設備退役給他人使用,必須首先使用抹掉功能擦除存儲設備,并可能要將這一過程執行多遍。取決于存儲設備容量,整個過程將耗費極多時間。

20160708114950448.png

對于使用APFS文件系統的存儲設備,在啟用加密功能后,安全擦除的過程將變得大為簡便和快捷,不再需要耗費大量時間多次給存儲設備填充隨機數據,只需要刪除加密所用的密鑰即可。

快照和備份功能

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

20160708114950222.png

由于不支持目錄硬鏈接,APFS暫不兼容Time Machine,希望以后APFS能夠針對Time Machine提供更高效的序列化機制。本屆WWDC上,APFS的開發經理Eric Tamura在演示APFS的快照功能時使用了一個尚未包含在Beta版macOS Sierra中的工具,同時根據Apple的介紹,目前尚未提供用于訪問快照功能的API,期待在后續版本中這個技術能夠盡快完善起來。

空間共享

APFS包含一個名為“空間共享”的新功能,借助該功能,多個文件系統可以共享同一個物理卷上的同一塊底層可用空間。也就是說,設備上的一個APFS“容器”內部可以包含多個“卷”(文件系統)。HFS+需要為每個文件系統預先分配固定大小的容量,這種做法較為“僵硬”,而APFS的空間共享功能可以讓用戶在無需重分區的情況下動態、靈活地擴大或縮小卷容量。

20160708114950349.png

在這樣的設計下,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中復制的文件實際上只是對文件創建了輕量級克隆,實際數據并沒有重復保存,底層設備的故障會導致所有“副本”受損。

20160708114950113.png

  絕對一致性

計算機系統在任何時候都可能出故障:崩潰、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卷。




====================================分割線================================

本文轉自d1net(轉載)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540957.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540957.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540957.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

chown –r mysql:mysql,mysql部署,操作及異常處理

1、將mysql-5.1.50-linux-x86_64-glibc23.tar.gz移至/usr/local/目錄下,并改名為mysql增加mysql組#groupadd mysql建mysql用戶,并加入到mysql組中#useradd –g mysql mysql源碼包解壓#tar mysql-5.1.50-linux-x86_64-glibc23.tar.gz將解壓后的源碼包放置…

光伏等新能源信用風險事件頻繁爆發

2016年以來,伴隨著供給側改革相關政策陸續出臺和落地,去產能、去杠桿誘發信用風險事件陸續爆出。而在“11天威NTN1”、“15云峰PPN001”及“15云峰PPN003”等信用風險事件上,大股東“棄車保帥”行為再現,令本就失去造血能力的企業…

ruby array_Ruby中帶有示例的Array.zip()方法

ruby arrayArray.zip()方法 (Array.zip() Method) In this article, we will study about Array.zip() Method. You all must be thinking the method must be doing something which is related to zipping values of the Array instance. It is not as simple as it looks. W…

matlab中迪杰斯特拉算法,dijkstra算法(迪杰斯特拉算法)

單源最短路徑算法——Dijkstra算法(迪杰斯特拉算法)一 綜述 Dijkstra算法(迪杰斯特拉算法)主要是用于求解有向圖中單源最短路徑問題.其本質是基于貪心策略的(具體見下文).其基本原理如下: (1)初始化:集合vertex_set初始為{sourc ...Dijkstra【迪杰斯特拉算法…

關于概率算法的問題,不知道邏輯錯在哪里,求debug

做個骰子成功幾率的分析,投n顆骰子,第一次投成功的幾率是a,然后投成功的骰子,需要再投1次,這次成功的幾率是b。第二次成功的骰子才算最終成功。 要分析出n顆骰子,最終成功0到n顆的概率。 我寫了個算法,求出…

tps 交易量_交易處理系統(TPS)

tps 交易量A transaction is a simple process that takes place during business operations. The transaction processing system (TPS) manages the business transactions of the client and therefore helps a companys operations. A TPS registers, as well as all of i…

matlab for循環不覆蓋,將輸出保存到文本文件而不覆蓋和打印矩陣中的N個條目[matlab]...

這是代碼:for i 1:4;fileID fopen(testdata.txt, at);fprintf(fileID, this is answer %d\n,i);fprintf(fileID, %5.3e\n, v{i});fclose(fileID);end在記事本中回答:this is answer 11.000e0001.000e0001.000e0001.000e0001.000e0001.000e0000.000e0001…

(轉)Redis研究(一)—簡介

http://blog.csdn.net/wtyvhreal/article/details/41855327 Redis是一個開源的高性能鍵值對數據庫。它通過提供多種鍵值數據類型來適應不同場景下的存儲需求,并借助許多高層級的接口使其可以勝任如緩存、隊列系統等不同的角色。 1.1歷史和發展 2008年,意…

c bitset get_Java BitSet get()方法與示例

c bitset getBitSet類的get()方法 (BitSet Class get() method) Syntax: 句法: public boolean get(int bit_in);public BitSet get(int st_in, int en_in);get() method is available in java.util package. get()方法在java.util包中可用。 get(int bit_in) meth…

有擾動的閉環傳遞函數 matlab,(d)閉環系統的誤差傳遞函數.PPT

(d)閉環系統的誤差傳遞函數3. 控制系統的方框圖模型 若已知控制系統的方框圖,使用MATLAB函數可實現方框圖轉換。 a).串聯 如圖所示G1(s)和G2(s)相串聯,在MATLAB中可用串聯函數series( )來求G1(s)G2(s),其調用格式為 [num,den]series(num1,den1,num2,den2) 其中: b)并…

CYQ.Data 輕量數據層之路 自定義MDataTable綁定續章(七)

本章起,將續章講解整框架當初的設計思路: 本章既為續章,說明我以前寫過,是的,以前我寫過內部整個MDataTable的構造,不過,當初匆匆寫完后, 最后一步的實現MDataTable綁定GridView/Dat…

php 文字超出畫布,input實現文字超出省略號(代碼示例)

本篇文章給大家帶來的內容是關于input實現文字超出省略號(代碼示例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。input實現文字省略號功能普通元素實現文字超出寬度自動變成省略號非常簡單,給元素加個寬度&…

c++ stl stack_C ++ STL中的stack :: top()函數

c stl stackPrototype: 原型&#xff1a; stack<T> st; //declarationT st.top();Parameter: 參數&#xff1a; No parameter passedReturn type: T //data type 返回類型&#xff1a; T //數據類型 Header file to be included: 包含的頭文件&#xff1a; #include …

排序算法系列:插入排序算法

概述 直接插入排序&#xff08;Straight Insertion Sort&#xff09;的基本操作是將一個記錄插入到已經排好序的有序表中&#xff0c;從而得到一個新的、記錄數增1的有序表。 – 《大話數據結構》 版權說明 著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載…

php點擊復制按鈕到我的粘貼板,js實現點擊復制當前文本到剪貼板功能(兼容所有瀏覽器)...

最近做項目時&#xff0c;在網站框架搭建過程&#xff0c;有一個功能需要實現復制文本到剪貼板&#xff0c;相信這個功能很常用&#xff0c;但是對于不常寫JS代碼的我來說是一個比較大的挑戰&#xff0c;回想以前做過的一個站點&#xff0c;使用window.clipboardData實現復制到…

算法導論 算法_算法導論

算法導論 算法Algorithms are an integral part of the development world. Before starting coding of any software first an effective algorithm is designed to get desired outputs. In this article, we will understand what are algorithms, characteristics of algor…

[Phonegap+Sencha Touch] 移動開發77 Cordova Hot Code Push插件實現自己主動更新App的Web內容...

原文地址&#xff1a;http://blog.csdn.net/lovelyelfpop/article/details/50848524 插件地址&#xff1a;https://github.com/nordnet/cordova-hot-code-push 以下是我對GitHub項目readme的翻譯 ——————————————————————————————————————…

java 如何重寫迭代器,如何用Java按需定制自己的迭代器

編寫自己的迭代器的流程是&#xff1a;首先實現Iterable接口&#xff0c;進而實現該接口中的Iterator iterator()方法&#xff0c;該方法返回接口Iterator&#xff0c;Iterator接口中封裝了next&#xff0c;hasnext&#xff0c;remove等方法。實現了Iterable接口的類能夠通過fo…

count函數里加函數_PHP count()函數與示例

count函數里加函數PHP count()函數 (PHP count() function) "count() function" is used to get the total number of elements of an array. “ count()函數”用于獲取數組元素的總數。 Syntax: 句法&#xff1a; count(array, [count_mode])Here, 這里&#xff0…

php整合支付寶,Thinkphp5.0整合支付寶在線下單

thinkphp5.0支付寶在線支付下單整個流程&#xff0c;包括創建訂單、支付成功回調更新訂單狀態、最終跳轉到商戶訂單詳情頁查看演示下載資源&#xff1a;17次 下載資源下載積分&#xff1a;998積分支付寶在線支付控制器代碼 public function alipay() {//發起支付寶支付$order_n…