概述
由於業務需求,需要評估嵌入式裝置的外接儲存,例如U盤、SD卡等,適用的大型儲存系統。出於相容考慮,常見的會使用 FAT32
,exFAT
,NTFS
。在尋找三者的特徵過程中,也帶出了其他的檔案系統對比,例如ReFS
,HFS+
等。
檔案系統的往事今生
目前常見的系統平臺就3類,分別是 微軟的Windows
,蘋果的MacOS
,開源社群的Linux
,每個作業系統都有設計自己的檔案系統,以本文討論的幾款檔案系統來說,他們的歸屬如下:
Dev | FAT32 | exFAT | NTFS | ReFS | HFS/HFS+ | APFS | Ext2/3/4 |
---|---|---|---|---|---|---|---|
Window | √ | √ | √ | √ | |||
Mac | √ | √ | |||||
Linux | √ |
Window
系列的檔案系統,最廣為人知的是FAT32
,在古老的Win XP
上就是用的這檔案系統。但由於歷史侷限性,其設計存在不可能避免的缺陷,例如無法支援大於32G的儲存分割槽和大於4G的檔案,微軟又提出了NTFS
。NTFS
的確非常強大,支援加密、壓縮、許可權控制等等,且還支援日誌保證資料一致性,目前(2020年)在PC上主要用的依然是NTFS。在NTFS.com
上能找到NTFS的特性和後設資料的詳細介紹。
NTFS
的確強大了,但相容性反而比不上FAT32
,按網上的資料說,因為NTFS
支援日誌,大量寫會影響Flash
的壽命,例如U盤、TF卡等,於是微軟又推出了exFAT
,作為FAT32
與NTFS
的折中。NTFS
的日誌對Flash的壽命的影響,我是存疑的,就好像在手機的emmc
上用的ext4
,也是帶日誌的,且這些flash
本身有磨損平衡,等用到壽命上限的之前,我們早已更新換代了。在磁碟上,不管是功能多樣性、效能和穩定性,exFAT
都比不上NTFS
,因此在Win7
上測試,發現磁碟分割槽只能格式化為NTFS
,U盤可以選擇exFAT
和NTFS
。
ReFS
雖然也是微軟推出來的,據說是NTFS
的替代品,但是並沒有太普及,目前功能還比不上NTFS
。NTFS.com
上也有ReFS
的介紹。
HFS
是蘋果裝置上專用的檔案系統,後來迭代出了HFS+
,反正是功能越來越強大了。後來蘋果又推出了APFS
,用於替代HFS+
。
Ext
系列則是Linux
社群上設計的檔案系統,由於Linux
稱霸伺服器端,大部分開發者其實都或多或少接觸過Ext
系列檔案系統。在5.x
的Linux
核心上,依然存在有ext2
和ext4
的程式碼,如果你非得用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這樣的小嵌入式裝置的角度來說,大部分裝置通過移植第三方檔案系統都可以快速支援FAT32
和exFAT
,例如微軟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檔案系統最大空間及單個檔案大小演演算法則》 對ext3
和ext4
上的檔案大小限制和分割槽大小限制的計算原理講的挺好的。
我先來看看在計算機端,大小單位的進位制關係:
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
。