概述
由於業務需求,需要評估嵌入式設備的外置存儲,例如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
。