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