電腦王雜誌 97/6/4 【PChomeAdvance電腦王46期】
【文/洪宛靖】
適用於隨身儲存裝置的檔案系統釋疑與效能實測
在前幾期的雜誌裡有提到,Vista SP1的某些新功能不怎麼吸引人,
尤其exFAT好像特別冷門,根本沒什麼人會興奮,
但隨著大容量平價隨身碟的逐漸普及,
勢必有需要了解這個新一代的檔案系統,
究竟只是SP1的伴遊新噱頭,
還是能為隨身儲存裝置帶來更廣泛的應用?
exFAT與先前檔案系統的區隔
exFAT(Extended File Allocation Table)
是適用於隨身碟或隨身型攜帶裝置(如PDA)的新格式,
最早出現在2006年的WinCE 6.0,
為了增進與桌上型作業系統的相容性還有便於隨身裝置的同步需求,
到了Vista SP1正式被納入桌機作業系統所支援的檔案系統,
但跟一般玩家息息相關的,還是在於隨身碟上的應用。
以往在隨身碟上,FAT32 / FAT是比較常見的格式。
然而FAT32在目前大體積的檔案應用下逐漸產生問題,
它的單檔容量最多只有4GB,
在某些用途上還要分割檔案才放得進隨身碟裡,
而且XP的抽取式媒體讀寫快取是限定NTFS格式才支援,
在拷貝大量且零碎的小檔案時,往往要耗上漫長的等待時間。
那為什麼不用NTFS來當隨身碟的主流格式呢?
一、NTFS相容性不如FAT32
FAT32/FAT已經被大多數的作業系統所廣泛支援,
不論是OS X、Linux或是隨身PMP裝置,
雖然部份非Winodws系統加上外掛也能做NTFS的讀寫,
但是畢竟沒有原生支援來得方便。
二、存取效能的差異
NTFS是採用「日誌式」的檔案系統,
因為要記錄磁碟的詳細讀寫動作,
對隨身碟這種快閃記憶體會造成較大負擔,
比如同樣存取一個檔案或目錄,
在NTFS磁區上的讀寫次數就會比FAT32來得多,
「相較」之下理論上使用NTFS格式存放檔案的隨身碟比較容易損壞,
而且在400MB以下的分割區也比較浪費空間。
三、XP預設的格式化選項不是NTFS
一般來說除非手動修改原則,
不然XP預設不能把隨身碟格式化成NTFS系統,
使用者找不到此選項,自然很順理成章的使用FAT32來格式化。
在XP下對抽取式媒體有兩種存取方式:
「快速移除最佳化(預設值)」與「效能最佳化」,
前者適用於FAT32,後者即是因應NTFS寫入快取的設定,
我們常常聽說不要直接拔除隨身碟,
其中一個原因就是考量到後者需要把快取中的資料確實寫入隨身碟,
因此使用快速移除最佳化時,就不能直接格式化成NTFS。
exFAT有什麼用?
果不是很在意隨身碟的存取效能,
那麼現在市面上4G、8G的MLC隨身碟可以說一點都不貴,
這種容量對FAT32支援的單一分割最大容量(32GB)並不成問題,
不過超過4GB的單檔就有點麻煩。
雖然說很少有單一檔案超過4GB的機會,但不代表完全沒有:
如BD影片的Remux檔、BD/HD影片的原始檔、
無失真音樂愛好者的未壓縮音訊檔、DVD光碟的ISO檔、
從DV上擷取下來的AVI檔等等,
想要完整備份就得選擇NTFS或exFAT做為儲存格式。
大部份讀者可能會問:那用NTFS就好了,
為什麼要選擇一個相容性更差的檔案系統呢?
exFAT原本設計的目的是在FAT32與NTFS之間取得一個折衷,
有FAT32的輕便、
不需要耗損太多的效能及記憶體來處理檔案運作,
又有類似NTFS的CAL存取控制機制
(很可惜在SP1下找不到exFAT對於CAL的支援),
以及類似HPFS系統可快速整理可用叢集空間的Free Space Bitmap,
來將檔案破碎的情況盡量減少。
然而要真正比較出使用FAT32、NTFS及exFAT時
的檔案破碎情況很難做到客觀的評比,
剩下所能測試的就是存取效能了,
尤其是exFAT最大的叢集大小達到了驚人的32MB,
連NTFS都只有64KB,
如果隨身碟真的拿來存放BD Remux動輒上GB的大檔案,
那麼將exFAT的叢集設大時,將會有多少效能增進呢?
大叢集有用嗎?
叢集(cluster)在檔案系統上是指比檔案還小的邏輯分割單位,
比如說一個檔案的大小是64KB,
叢集大小設為4KB的話就是用了16個叢集。
叢集的大小與實體磁碟區的大小成正比,
比如說FAT32在4~8GB及8~16GB的預設叢集大小分別為4KB與8KB,
基本上叢集愈小愈能節省磁碟空間,
例如一個檔案為12KB,因為叢集是以自然整數的方式存在,
如果這時的叢集大小是8K的話
就必須動用到兩個叢集(16KB)的空間來存放檔案,
當中的4KB就算浪費掉了。
不過叢集設太小理論上也會造成存取效能遲緩,
一個64KB的檔案只需要存取4個16KB的叢集
,換成1K的叢集就變成了64個。
從FAT16、FAT32、到NTFS,
在一定的磁碟空間範圍內預設的叢集愈來愈小,
但使用者能自訂的最小底限都是512Bytes,
如果用安裝光碟來格式化硬碟,
一定也是使用512bytes的預設值,
因為512bytes是剛好對齊FAT結構的界限;
換成Windows桌面的格式化,
則會由系統自行挑選適當的預設值來決定。
上述的檔案系統最大叢集都是到64KB,
對存取單一大檔案時算不算是理想的設置呢?
而且小叢集在進行磁碟重組時會花上比較久的時間。
然而就這次的測試結果來看,
叢集的大小對於檔案的存取並沒有多大影響,
而且真的把叢集開到32MB是瘋狂的行為,
放一個1KB的檔案,32MB的空間就被吃掉了,
尤其是1GB的隨身碟格式化完成,
光配置表就用掉了96MB的容量。
那麼究竟多大的分割會需要用到32MB的叢集呢?
SP1需在命令列模式才能把實體硬碟格式化成exFAT,
筆者將320GB的硬碟以exFAT格式化,
所得的預設叢集是128KB,
真正需要用到32MB叢集的「大」硬碟要問世應該還早。
何況微軟目前
就沒有把它用在一般固定式媒體(Fixed Media)的打算,
叢集大小對於抽取式媒體來說暫無意義。
exFAT與FAT32、NTFS的比較
|
|||
FAT32
|
NTFS
|
exFAT
|
|
適用作業系統 | Win95 OSR2之後皆可 | Windows 2000之後的NTFS5為較成熟版本 | Vista SP1、Windows CE 6.0 |
最小叢集 | 512bytes | 512bytes | 512bytes |
最大叢集 | 64KB | 64KB | 32,768KB |
最大單檔大小 | 4GB-2bytes | 受最大分割容量影響 | 16EB(理論值) |
最大分割容量 | 32GB、2TB | 2TB | 16EB(理論值) |
檔案數限制 | 4194304 | 無 | 單一目錄至少大於1000個 |
支援CAL | 無 | 有 | SP1並無採用 |
最少叢集數 | 65,527 (註a) |
至少大於127 (註b) |
至少大於13 (註c) |
最大叢集數 | 4,177,918 | 無 | 無 |
註a:FAT32系統的叢集數不可少於65,527個,也就是說磁碟容量小於32MB左右(最小叢集(512bytes) x 65527)的話,就不能用FAT32檔案系統。筆者手邊有一顆31.2MB的隨身碟就無法格式化成FAT32。而FAT(16)系統所能支援的叢集數最多為65,525,單一叢集容量最大為64KB,所以最大分割區容量大約是4GB(65,525x64)。 註b:在Windows下無法做出小於8MB的NTFS分割區,以8MB的容量用64K叢集來格式化得到的叢集數是127個,但此數字不具意義,因為這種分割容量不太可能會出現,而且採用NTFS格式太浪費空間。(NTFS適用400MB以上空間) 註c:以2048KB(不含)以上的叢集大小無法格式化31.2MB的隨身碟。 |
************************************************
exFAT的附加功能
exFAT的另一個特點是支援TFAT(Transaction-Safe Fat),
TFAT是為了彌補原本FAT系統缺陷而生。
就拿一般FAT格式的隨身碟來說,
如果在拷貝或搬移、建立檔案或目錄時,
突然將隨身碟拔除或是電力流失等等任何因素都會造成資料的中斷,
也就是無法確保資料是否完整的寫入到了磁碟中。
可以做一個實驗:將一個體積較大的檔案拷貝到隨身碟中,
在複製到一半時將隨身碟拔除,放到另外一台電腦上看,
能看見檔案的大小、資訊與原始檔一模一樣,並沒有減少,
實際上此檔案的內容卻是不完整的,
但在Explorer裡看起來就像已經複製成功了一樣。
重點是:
雖然沒有人會真的無聊到去拔除正在存取中的隨身碟,
但不管是NTFS或FAT,
都沒有一個確保檔案存取完整性的機制,
可以看做是在檔案真正存取完畢前就先將資訊寫入檔案配置表或MFT。
exFAT、NTFS、FAT32的存取效能差異 (單位:MB/s) | ||||||
讀取NTFS_4K | 寫入NTFS_4K | 讀取FAT32_4K | 寫入FAT32_4K | 讀取exFAT_32K | 寫入exFAT_32K | |
exFAT_32K | 116.6719 | 40.8 | 114.3248 | 39.26 | 114.9264 | 39.112 |
exFAT_32M | 119.8438 | 41.99414 | 118.92 | 41.836 | 118.63 | 42.82 |
exFAT_512K | 117.5313 | 41.88477 | 117.13 | 41.274 | 116.23 | 41.63 |
exFAT_4K | 126.4531 | 41.91602 | 124.52 | 40.998 | 125.42 | 41.1 |
exFAT_16K | 117.8906 | 41.9 | 116.923 | 41.219 | 117.792 | 42.25 |
FAT32_4K | 141.9453 | 40.8 | 129.65 | 39.23 | 131.427 | 39.5 |
NTFS_4K | 129.6016 | 42.19 | 129.3 | 42.361 | 129.3012 | 42.92 |
NTFS_64K | 127.4531 | 40.26 | 126.37 | 40.293 | 127.9804 | 40.96 |
FAT_16K | 120.0391 | 41.9 | 120.02 | 41.57 | 119.863 | 41.77 |
測試環境皆為Vista SP1 |
TFAT的優點
TFAT的運作方式剛好相反,它將FAT原始的分層概念(Second Copy):FAT0與FAT1做了有效運用。當檔案系統有變動時先在FAT1上進行存取操作,迨執行完畢後再把FAT1的資料複製到FAT0,如果在FAT1進行存取時被中斷了,那麼原本的FAT0並不會有變動,拿上面舉的例子來看就是如果檔案沒有複製完成,隨身碟中就看不到該檔案的資訊,雖然實體資料確實有被寫入磁碟區,但該區塊仍然是被標示為「空」的,對之後的檔案存取並不產生影響,也沒有消耗磁碟空間。這對隨身碟的壽命及檔案系統的健全性有一定幫助,如果上述情況發生在FAT的話,不但容易流失資料,而且整個配置表會破碎不完整,有時會出現明明刪除了檔案,磁碟空間卻沒有挪出來;或是檔案名稱還在,卻無實體內容的情況,這時就得靠chkdsk或重新格式化來解決問題。
說了那麼多,其實有點枉然,因為Windows桌面作業系統並不支援TFAT,一切還是以WinCE為主,而XP或Vista會把TFAT當作FAT來使用,而且沒有辦法刪除TFAT建立的目錄,總之現在TFAT與桌機系統無關,硬是要結合在一起不會有好結果就是了。TFAT是依存在exFAT之下的檔案系統,並沒有獨立出來。
FAT通常會有一個或多個Tables來做備份。
TFAT會等原始資料確實在FAT1上完成存取動作後,
再把FAT1複製到FAT0,如果動作進行中發生中斷,
FAT1->FAT0的動作就不會發生。
而FAT則是在原始資料存到任何一層的FAT Table時,
同時更新其它Table的資料,
當然如果發生中斷,兩邊的資料都是不完整的。
需要注意的是,TFAT不能百分百防止資料遺失,
也無法復原遺失的資料,
只是確保目的地的原始資料與配置表完整無缺,不受影響。
|
總結:現在真的需要exFAT嗎?
延續上一段的結論,
Vista SP1支援的exFAT不但沒有存取控制的機制,
也沒有把TFAT的應用帶到一般桌面作業系統上,
毋須逃避的Vista就是要裝在桌機或筆電,
沒有人會去裝在PDA或手機上面,
玩家最常接觸的媒介就是記憶卡、硬碟外接盒或隨身碟,
如果exFAT帶來的是不怎麼明顯的效能節省與速度提昇,
現階段又缺乏相容性,
尤其是無法支援自己的ReadyBoost,
要成為一個理想的跨平台檔案系統?理由似乎還不夠充份。
讓XP也能讀exFAT
雖然exFAT對大檔案沒有明顯效能增益,
但因為相容性而放棄使用還蠻可惜的,
至少它可以支援4GB以上的檔案。
有個已經不是秘密的公開撇步可以讓XP認識exFAT,
讀取exFAT格式的磁碟,不過只限於讀取,
仍然無法直接在XP下格式化或轉換(Convert.exe)
磁碟成exFAT格式。
作法很簡單,
將exfat.sys及uexfat.dll兩個檔案從Vista SP1的系統目錄下抽出,
分別放在XP目錄的system32及system32\driver資料夾下,
再把以下登錄檔內容匯入即可。indows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\exfat]
"Description"="exFAT File System Driver"
"DisplayName"="exFAT File System Driver"
"ErrorControl"=dword:00000001
"Group"="Boot File System"
"Start"=dword:00000002
"Type"=dword:00000002
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\System\exfat]
"EventMessageFile"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,\
00,6f,00,74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,\
5c,00,49,00,6f,00,4c,00,6f,00,67,00,4d,00,73,00,67,00,2e,00,64,00,6c,00,6c,\
00,00,00
"TypesSupported"=dword:00000007
何謂「日誌式」檔案系統?
日誌式(Journaling File System)要是用來記錄檔案的詳細變動,
不管是複製、搬移、刪除等動作,
如果在這些動作進行時遭遇不正常的中斷,
在中斷狀況解除後仍能依照記錄來進行復原或繼續的操作,
也不必重新掃描一次來修復亂掉的檔案系統結構,
這是大部份日誌式檔案系統的重點。
如果電腦中的FAT32磁碟遭受不正當的關機程序,
重開機時會對FAT磁區做一次掃描檢查,
如果磁碟區容量愈大回復的動作就會愈久。
NTFS卻不會,因為日誌式檔案系統已經有做紀錄,
只要按圖索驥去重整MFT就好,
不需要重新整個掃描一次,
不過NTFS並沒有回復資料狀態(RollBack)的功能。