說到硬碟大家應該不陌生,但為何要做 硬碟格式化? 甚麼是硬碟分割? 壞軌又是甚麼? 就讓我來說分明吧。
硬碟的構造
若把硬碟拆開,你會看到由碟片組成的裝置,這就是資料最後實際儲存的地方,而旁邊的三角形吊臂就是用來支撐讀寫頭的地方,讀寫頭很小,就位在吊臂末端尖尖的地方,它用來read/write資料。
硬碟資料的組織編排
在小小的碟片裡面,擠滿了密密麻麻的資料,硬碟是如何找到正確的資料位置呢? 這就要講到碟片上的組織了。如下圖,每個碟片都規劃了一圈圈的磁軌Track,每一個磁軌又劃分成好幾個磁區Sector,而磁區Sector就是硬碟每次讀寫的最小單位,所以硬碟並非是一個個byte讀寫,它是一個個Sector讀寫。Sector的大小以前是512 bytes,而現在的硬碟則是4096 bytes。
你會發現上圖的Sector數量在外圈比較多,在內圈比較少,這個配置稱為Zone Bit Recording,它可以讓碟片的空間運用的效率更好,現在的硬碟幾乎都是採用這種方式。早期的硬碟無論內外圈,全部就像切披薩一樣,整個扇形區域都是一個sector,但這樣會造成碟片的使用效率低落,因為外圈的圓周比較長,所以資料密度較低,而Zone Bit Recording可以解決這個問題。
在Linux系統內,硬碟裝置被歸類為Block device,這裡所謂的Block並非指硬碟的外型看起來像磚塊,而是指硬碟每次讀寫都必須是一個個磁叢Cluster讀寫,那磁叢是甚麼? 每個Cluster是好幾個連續Sector組成的,看起來就像是一塊塊的讀寫,因此硬碟稱為Block device。
另外,每個碟片有2面所以需要2個讀寫頭,像前面的硬碟照片內有2個碟片,那就有4個讀寫頭了,因為碟片的正反面都可以拿來儲存資料,基本上就是能用的空間都用上去。
所以若要讀取硬碟資料,必須要給硬碟一組類似座標一樣的資訊,才能精準抓到資料,也就是Track、Sector、Header,利用這三種資訊來定位資料位置的方法,稱為CHS定址方式,眼尖的你應該會發現Track與CHS的第一個字母C其實完全對不上,這是怎麼回事? 這個C其實是磁柱Cylinder的意思,也就是把每個碟片上相同位置的Track疊起來之後,想像它們是個空心圓柱,因此稱為Cylinder,不管是Track還是Cylinder他們想表達的都是同一個意思。
類似的名稱定義問題也發生在磁區Sector,我畫的Sector是用來表達資料存取的最小單位,但有些圖會把Sector畫成像切蛋糕一樣的扇形圖,它們要表達的是扇區Sector,因為這是用來定位的依據。所以這些名詞知道就好,不用太拘泥。
現今CHS定址方式只用在硬碟內部,對外的話硬碟控制器都採用LBA(Logical Block Addressing)定址,也就是把磁區從0開始編號,每次加1直到最後一個磁區為止,一般會寫為LBA 0、LBA 1、LBA 10440之類的,以此類推。
LBA與CHS的換算就由硬碟控制器來處理,這樣作業系統就不用額外操心這一塊,操作起來會比較方便。早期的電腦沒有LBA定址,加上每顆硬碟的CHS都不太一樣,所以每換一顆硬碟都必須在BIOS裡面設定CHS參數,實在有夠麻煩,後來有了LBA之後就方便多了。
磁區如何定址
前面寫得長篇大論,問題是當你實際拿到碟盤,馬達開始旋轉後,到底哪裡是LBA 0? 哪裡是LBA 1呢? 碟片上光禿禿的也沒有任何物理性的記號用來標示Sector number,硬碟是怎麼做到辨認磁區號碼的?
原來每個磁區除了放user的資料之外,還存放了一些控制資訊,如下圖,每個磁區的最開頭都會有特定的0,1交替形式,稱為Preamable,用來告訴硬碟有個磁區要來了,於是硬碟便開始等待同步訊號Sync發生,一旦收到同步訊號之後,緊接著就是要知道這個讀到的磁區到底是哪個位址Addess mark,用來判斷這個位址是否為我們要的。
接著後面的資料Data才是我們要的硬碟資料,之後接著有ECC(Error Control Coding),它是由前面的資料Data所計算出來的特殊值,若Data有損壞,算出來的ECC一定不會跟原本的相同,因此可以透過ECC得知Data哪裡有錯並且修復。
磁區的最後會留一小段空白Gap,那是給磁頭的讀取電路辨認這裡已經告一段落了,同時也給系統對剛才讀寫的資料有時間做處理。
順帶一提,雖然電腦世界的資料是0與1組成,但是在磁區內的資料可不是直接把0與1轉換成磁極S與N喔! 因為若遇到連續相同的資料可能會讓磁場增大進而影響相鄰的磁區,所以實際寫在碟盤上的資料是編碼過的資料,才會有以前的MFM(Modified Frequency Modulation)硬碟,一直到後來的PRML(Partial Response Maximum Likehood)處理方式,這部分各位知道就好,再往下鑽就是通訊編碼的領域了。
硬碟從哪裡開始讀?
對於作業系統來說,硬碟就像是一張畫好格子的稿紙,不管你用的作業系統是Windows、Linux還是Apple,這張稿紙的一個格子就是一個Sector,或者說一個Block,至於格子裡面要填甚麼東西,大家就各憑本事,於是才有各式各樣的檔案系統File System出現,例如Windows有FAT/FAT32/NTFS,Linux有EXT2/EXT3/EXT4,Apple有APFS,這些檔案系統的頭幾個Block紀載著硬碟資料結構的重要資訊,目前常見的結構有兩種分別是MBR與GPT,說明如下。
MBR
所有的File system,一定需要有個地方用來敘述整顆硬碟的資料結構,例如哪個區段當作C槽、哪個區段是D槽,也就是硬碟分割表Partition table。如下圖,這個用來記錄硬碟資料結構的內容稱為MBR(Master Boot Record),它固定放在硬碟的Sector 0,MBR當中允許user最多規劃4個Partition。
一定有人會說,我硬碟分了5個partition甚至更多,看來並沒有限制啊。這是因為若要再多一些Partition的話,則會使用延伸分割Extension partition,也就是把最後一個Partition內部再分好幾個邏輯分割Logical partition,這樣的話以MBR的角度來看,就仍然是4個partition,以作業系統的角度來看,就會有4個以上的partition,這些多出來的Logical Partition要如何對應到實際的Partition,就必須由作業系統來轉換。
GPT
隨著時代改變,MBR的4個Partition已經不太夠用,於是有了GPT這種新規格出來,它最多能使用128個Partition,而且為了不讓user的衝擊太劇烈,它還把LBA 0繼續保留給傳統的MBR使用,這樣就有與過去相容的效果。
如此一來,大家就可以在一台電腦上安裝多個作業系統,若是做系統測試的人應該很有需要吧! 各種版本的Windows/Linux全部要裝過一次才能方便測試,有了GPT確實是很方便,當然它還有其他優點,就不在這裡寫了。
硬碟格式化
有了硬碟分割的Partition規劃之後,就可以依照每種File system所需要的格式,依各種規劃的數值填入Partition table內,以後系統才知道要去哪些LBA抓資料,這個佈局的動作就稱為格式化。
現代人講求效率,所以Windows的格式化還分成完整與快速兩種:
- 快速格式化
只把分割區Partition內的空間部分覆寫,例如File system標頭,以及其它相關的必要設置,之前已存在的資料區通通不動它,等同於遺失的資料,但是其實資料還在某個地方。 - 完整格式化
除了File system的標頭之外,也會把分割區其餘空間填上0x00,所以之前的資料會被0x00蓋掉,資料完全消失,缺點就是耗時間,容量大的硬碟可能會耗上20小時。
完整格式化vs快速格式化
我做了一個實驗,用來測試兩種格式化的差別,下圖是我用舊硬碟重新分割出50MB空間當作E槽用來做實驗,並建立一個68KB大小的檔案1.txt,而且為了之後方便尋找,我在這個檔案的開頭填上一個獨一無二的關鍵字作為標記”wiki test”,雖然它是這個E槽的第一個檔案,也是唯一一個檔案,但檔案實體卻不一定在Partition最前面的LBA,所以我才把E槽規劃為小小的50MB,不然動輒300GB的分割區找起來簡直是大海撈針。
我使用的工具是網路上找到的稱為HxD,它可以開啟整顆硬碟、分割區、檔案,可以看到每個Sector(LBA)的資料。
快速格式化
首先在E槽的分割區內找到我們的”wiki test”關鍵字,用來確認內檔案容在哪個相對磁區,如下圖這個檔案起始位址在Sector 32736。
然後先進行快速格式化,接著把檔案管理員打開,確認裡面都沒有檔案了,然後把E槽的內容按F5更新,你會發現Sector 32736的內容完全沒變。
雖然已經格式化了,但由於採用快速格式化的關係,只因為檔案指標已經消失,所以找不到檔案,但實際的內容都還在原來的地方。基本上Delete檔案,甚至從資源回收桶清除,也並非真的把資料報銷,原理跟前面講的一樣。
若有心人硬是一個個Sector的找資料,要把你Quick format之後的硬碟資料取出,是絕對有可能的,之前的陳冠希裸照事件就是一個血淋淋的例子。
完整格式化
再來則執行完整格式化,由於只有50MB的分割區,速度還滿快的。如下圖,完整格式化之後,檔案依舊不存在File system內,但你會發現在相同的磁區內,剛剛的資料全部消失,它全部被0x00覆寫過去了。所以要避免資料外流,或有安全疑慮的硬碟要報廢之前最好能先做過Full format,才能保證資料已經銷毀。完整格式化另外的好處則是,它會幫你檢查是否有壞軌。
配置單位大小
Windows格式化選單內有個配置單位大小選項,這個是磁叢Cluster的大小,它是作業系統最小的讀寫單位。實際上一個Cluster是由\(2^{n}\)個Sector所組成的,作業系統只看得到Cluster,在Linux系統裡稱為Block,底層硬碟真正在讀寫的仍是以Sector為單位。
若要知道自己的硬碟每個Sector是多大,可以在管理員權限之下使用fsutil fsinfo ntfsinfo看到相關資訊。儘管實體硬碟每個磁區Sector是4096 bytes,作業系統看到的磁區(Logical Sector)仍然假裝是512 bytes,這當然是有歷史共業,為了相容所採用的權宜之計。
早期硬碟每個Sector是512 bytes,後來則出現了更大的4096 bytes磁區,因為這樣碟片使用的效率較高,這種格式稱為Advanced Format(AF)。檔案系統為了因應這種改變,但又不能讓使用者感覺變化太多,只好弄了一個Logical Sector給使用者看。在這個例子內,一個Cluster則是8個Sector,也就是4096 bytes。
我猜想如果硬碟是AF格式,每Sector是4096 bytes,系統的Logical Sector也設定成4096 bytes,效率應該會好一些吧,這部分我沒做過實驗。
壞軌Bad Sector
所謂壞軌Bad sector其實應該稱為壞磁區,也稱為Bad block,只要硬碟的Data與ECC不吻合,或著說讀取的資料有錯誤時,就會被判定為壞軌Bad Sector。
Reallocated Sector Count – SMART item 5
一旦出現壞軌,硬碟就會自動把備用的好軌拿來用,user會完全感受不到壞軌的存在,一切都如往昔,但硬碟會在自己的SMART report的item 5上記上一筆,下圖是給各位參考用,我的硬碟還沒有壞軌出現,目前原始資料為0,若有1個壞軌出現,原始資料會+1,”最差值”會開始下降。
SMART的”值”有點像考試分數一樣,有些總分100有些是200,總之分數越高越好,萬一分數太低,低過界限所定義的值,那表示你的硬碟病入膏肓了,所以通常在逼近界限值的時候就該換硬碟了。
Current Pending Sector – SMART item 197
有些磁區讀寫不穩定,一旦read成功便會馬上以備用磁區來替換,如果這些有問題的磁區能找得到備用的磁區做替換,那麼剛才講的Reallocated sector count就會+1,如果備用磁區用完了,或是其它原因讓替換工作失敗,那等於有問題的磁區就會一直處於等待Reallocated的情況,此時Current pending sector這一項就會被+1,想當然爾這個項目比item 5要嚴重得多,因為儲存的資料有錯誤,又找不到備用磁區替換。
出廠就有壞軌
事實上壞軌有兩種,一種是天生的,一種是後天的。
現在硬碟容量這麼大動輒300GB起跳,想要求硬碟內部零壞軌那真的是太苛求了,硬碟出廠時一定會做一次掃描,用來偵測壞軌,偵測到的壞軌便會記錄在一個稱為P-List(Primary defect table)的清單內,這樣使用者就不會踩雷,這就是天生的壞軌。
但消費者買回家後,一定也會有些本來就快要掛掉的磁區,經過長期使用之下就真的變成壞軌了,這些就是後天的壞軌,硬碟會把這些壞軌記錄在自己的G-List(Growth defect table)清單內,這樣將來使用的時候就可以避掉壞軌,而不會踩雷。
一旦有壞軌,它就是壞軌了,也許是該區的磁力便小,也許真的有刮傷,總之不會有甚麼工具程式可以修好它,我也想不出可以如何修復壞軌。
硬碟失效是一個漸進的過程,你需要根據自己的需求來決定要怎麼看待SMART,並不是SMART的分數只要有下降,就一定要趕快花錢買硬碟,它只是一個硬碟的健康指數而已,要不要換硬碟就看自己的需求在哪裡。
低階格式化Low Level Format
還記得前面講每個磁區都有preamble/sync/addr/data/ecc這些區段吧,所謂低階格式化就是在一片剛做好的碟片上,把這些資料結構放到碟片上,講得白話些就是在硬碟的盤子上畫格子。
在早期還有軟碟片Floppy disk的時代,當時在軟碟上要做格式化就是需要從建立sector開始,這種就是低階格式化。在當時的時空背景下,所有的format動作都是土法煉鋼一鏡到底,沒有甚麼快速格式化,只要做完format你的碟片絕對是乾乾淨淨。
當時若要在硬碟上做低階格式化,都會被警告說很傷硬碟種種之類的話語,時至今日仍然還有號稱Low Level Format的程式存在,但其實它已經不是做畫格子的事情了,因為在與硬碟的溝通語言ATAPI裡面已經沒有這項指令了,現在看到的Low Level Format程式其實只是把0x00的”資料”填到每個磁區裡而已。
所以現在的LLF已經與以前的LLF不一樣了,正確來說不能稱為Low Level Format,應該稱為Zero-filling。
硬碟的前置作業
所以一顆硬碟要能上線使用,需要先做分割規劃,分割程式會自動根據我們的設定把MBR或是GPT填好,有了Partition劃分之後,每個Partition就能依照不同的檔案系統做格式化,格式化之後系統就能認到File system,就可以開始存檔使用了。
請問Premable是指Preamble嗎?
是的, 打錯字已修正, 感謝您