多平臺大型檔案系統比較

廣漠飄羽發表於2020-07-06

概述

由於業務需求,需要評估嵌入式裝置的外接儲存,例如U盤、SD卡等,適用的大型儲存系統。出於相容考慮,常見的會使用 FAT32exFATNTFS。在尋找三者的特徵過程中,也帶出了其他的檔案系統對比,例如ReFSHFS+等。

檔案系統的往事今生

目前常見的系統平臺就3類,分別是 微軟的Windows,蘋果的MacOS,開源社群的Linux,每個作業系統都有設計自己的檔案系統,以本文討論的幾款檔案系統來說,他們的歸屬如下:

Dev FAT32 exFAT NTFS ReFS HFS/HFS+ APFS Ext2/3/4
Window
Mac
Linux

Window系列的檔案系統,最廣為人知的是FAT32,在古老的Win XP上就是用的這檔案系統。但由於歷史侷限性,其設計存在不可能避免的缺陷,例如無法支援大於32G的儲存分割槽和大於4G的檔案,微軟又提出了NTFSNTFS的確非常強大,支援加密、壓縮、許可權控制等等,且還支援日誌保證資料一致性,目前(2020年)在PC上主要用的依然是NTFS。在NTFS.com上能找到NTFS的特性和後設資料的詳細介紹。

NTFS的確強大了,但相容性反而比不上FAT32,按網上的資料說,因為NTFS支援日誌,大量寫會影響Flash的壽命,例如U盤、TF卡等,於是微軟又推出了exFAT,作為FAT32NTFS的折中。NTFS的日誌對Flash的壽命的影響,我是存疑的,就好像在手機的emmc上用的ext4,也是帶日誌的,且這些flash本身有磨損平衡,等用到壽命上限的之前,我們早已更新換代了。在磁碟上,不管是功能多樣性、效能和穩定性,exFAT都比不上NTFS,因此在Win7上測試,發現磁碟分割槽只能格式化為NTFS,U盤可以選擇exFATNTFS

ReFS雖然也是微軟推出來的,據說是NTFS的替代品,但是並沒有太普及,目前功能還比不上NTFSNTFS.com上也有ReFS的介紹

HFS是蘋果裝置上專用的檔案系統,後來迭代出了HFS+,反正是功能越來越強大了。後來蘋果又推出了APFS,用於替代HFS+

Ext系列則是Linux社群上設計的檔案系統,由於Linux稱霸伺服器端,大部分開發者其實都或多或少接觸過Ext系列檔案系統。在5.xLinux核心上,依然存在有ext2ext4的程式碼,如果你非得用ext3,也只是用ext4的程式碼。網上有許多ext2/3/4之間差異的文章,簡單來說,ext3首先引入了日誌,解決了ext2掉電不一致問題,ext4又在ext3的基礎上,新增了新功能和擴大了大小上限,提供更好的效能和可靠性。

Linux上其實還有很多新系統,例如使用COW而非日誌的btrfs,還支援映象等,功能非常強大,但感覺還不夠穩定。

檔案系統的相容性

我們經常需要跨平臺工作,例如從 Win10 拷貝個檔案到U盤,然後插入到 Mac Book中,或者 Linux 電腦中,這時候如果U盤的檔案系統相容性不夠好,就會導致有的平臺能識別U盤的檔案,有的電腦無法識別。因此,我們需要討論下,檔案系統的相容性!

參考資料《What File System Should I Use for My USB Drive?》,不同檔案系統的相容性總結如下:

FS Win XP Win 7/8/10 Mac (<= v10.6.4) Mac (>=v10.6.5) Linux
FAT32
exFAT × √ (after v5.7)
NTFS Read Only √ (with 3party tools) √ (with 3party tools)
HFS+ × Read Only with Boot Camp ×
APFS × × × ×
EXT4 × √ (with 3party tools) × ×

NTFS的支援上,使用第三方工具,例如ntfs-3g後可實現讀寫。其中在Linux有原生的NTFS驅動,支援讀,但對寫支援不太好。

在個人電腦端,微軟的Window佔了絕大比例,因此在U盤和TF上使用的檔案系統,我們更需要考慮的是Window的相容性。可以發現,FAT32畢竟是老大哥了,它的相容性是最高的,但是侷限性也的確很明顯。從相容性考慮,作為替代,可以考慮exFAT,畢竟不管是Mac還是Linux都已經原生支援了,而NTFS還需要安裝第三方工具。但查閱資料發現,exFAT設計時有兩份FAT,但微軟不知道哪根筋搭錯了,預設只使用一份FAT,也就意味著,作為可插拔的U盤和TF卡,如果隨意插拔,FAT異常卻沒有映象備份,還是有可能會導致檔案系統的損壞的。

從RTOS這樣的小嵌入式裝置的角度來說,大部分裝置通過移植第三方檔案系統都可以快速支援FAT32exFAT,例如微軟2020年開源的FileX,例如RT-Thread上使用的elmfat。在嵌入式裝置的角度來看,exFAT的相容性明顯要比NTFS要好。

上文也有提到,網上有人說NTFS的日誌會加劇Flash的磨損。關於這點我是存疑的,理論上的確會加劇磨損,但Flash的壽命相對TF卡和U盤的使用頻率來說,是不需要擔心的。就好像安卓手機上預設使用的ext4檔案系統也是帶日誌的,從磨損的角度來說,問題也不大。

所以呢,在U盤和TF卡上使用的檔案系統,我的建議是:

  • 希望更高的相容性,使用exFAT
  • 希望保證資料安全的前提下,儘可能高的相容性,使用NTFS

檔案系統的限制

檔案系統的限制,在設計的時候就確定了。例如FAT32用32位的變數記錄檔案大小,就限制了一個檔案最大不超過2^32=4G大小。在遠古時候,儲存介質還只有幾十上百兆,此時FAT32的限制是綽綽有餘的,但在現今磁碟1TB起步的時代,FAT32的時代侷限性讓其不再適用於最新的裝置,所以催生了新的檔案系統。

《刨根問底:ext3/ext4檔案系統最大空間及單個檔案大小演演算法則》ext3ext4上的檔案大小限制和分割槽大小限制的計算原理講的挺好的。

我先來看看在計算機端,大小單位的進位制關係:

B KB MB GB TB PB EB ZB YB DB NB
2^0 2^10 2^20 2^30 2^40 2^50 2^60 2^70 2^80 2^90 2^100

《計算機儲存單位:Byte、KB、MB、GB、TB、PB、EB、ZB、YB、DB、NB介紹》NB的描述挺有意思的,假設1TB的硬碟重670g,那麼要儲存1NB容量的資料,共需要1152921504606846976個1TB硬碟,共計77245740809萬噸。目前最大的船 諾克耐維斯號 載重量為56萬噸,1000個 諾克耐維斯號 拉到報廢都拉不完。

我們再看看各個檔案系統的限制是怎麼樣的。由於大多數人對 PB 及以上的單位並不敏感,下表改用 TB 來表示。

FS 最大分割槽大小 最多檔案個數 最大檔案大小 備註
FAT32 32G 2^22 4G 有些定製的FAT32可以支援更大的分割槽
NTFS 5 (16 * 1024 * 1024) TB 2^32 - 1 (16 * 1024 * 1024) TB 前提:假設1K簇大小,簇越大,值越大
exFAT (128 * 1024) TB Unlimited (16 * 1024 * 1024) TB
ReFS 1 YB = (1024)^4 TB 2^64 - 1 2^64 - 1
HFS+ (8 * 1024 * 1024) TB / (8 * 1024 * 1024) TB
ext4 (1024 * 1024) TB Unlimited 16TB 格式化時有幾個inode,就支援多少個檔案

大部分資料來自於NTFS.com

相關文章