捋一捋磁盤及分區
本文轉載自微信公眾號「Rand」,作者Rand。轉載本文請聯系Rand公眾號。
磁盤及分區
溫徹斯特硬盤
今天我們所使用的機械硬盤實質上都是溫徹斯特硬盤,最早是在 1973 年由 IBM 研制的一種新型硬盤 IBM 3340。它使用了一種了不起的技術:磁頭不與盤片接觸,只有不予接觸才可能有著更高的轉速而且磁盤才不易損壞。至于這個名字的來歷,是因為 IBM3340 擁有兩個 30MB 的存儲單元,而當時一種很有名的 “溫徹斯特來福槍” 的口徑和裝藥也恰好包含了兩個數字 “30”;于是這種硬盤的內部代號就被定為 “溫徹斯特”。
我們來看看這種硬盤的結構圖:
來自js王的博客
盤片盤面磁頭
上圖中光盤狀的東西就是盤面,有兩個面叫做盤面,上面分布著磁性介質。每個盤面都有個磁頭,用來讀寫盤面上的數據。
磁道扇區
來自js王的博客
上圖中灰色的圓環就是磁道,磁道上的綠色的一段弧為扇區,扇區是磁盤讀寫的基本單位,通常為512字節。
柱面
來自js王的博客
每個磁道由外向里從 0 編號,不同盤面上編號相同的磁道組成的圓柱稱為磁盤的柱面。
相關計算
硬盤容量
訪問時間
I 尋道時間
將磁頭移動到相應的磁道上所需要的時間。
II 旋轉時間
將目標扇區的第一位移動到磁頭下面所需要的時間,計算時一般平均旋轉時間即旋轉半圈需要的時間。
III 傳送時間
也就是磁盤旋轉讀取數據的時間,一般也取決于旋轉速度。
看幾個經典例題:
尋址
CHS
CHS 即 Cylinder(柱面)、Heads(磁頭)、Sector(扇區),使用這三個參數來定位一個扇區,柱面參數使磁頭臂移動到某個半徑,磁頭參數確定是哪個盤面上的磁道,扇區參數則確定該磁道上某個扇區的具體位置。
柱面,磁頭一般都是從 0 開始編號,扇區從 1 開始編號。
早期 CHS 這個三元組用 24 位來表示,前 10位 表示柱面,中間 8 位表示磁頭,后面 6 位表示扇區,最大尋址空間為
LBA
LBA(Logical Block Addressing),邏輯塊地址實際上就是物理地址的轉化,將三元組轉換為一維的線性地址。即 0柱面0磁頭1扇區編址為邏輯0扇區,0柱面0磁頭2扇區編址為邏輯1扇區......
也就是說轉換方式如下:
最后加上 S - 1 是因為 LBA 從 0 開始編號
FAQ
每個磁道的扇區數一樣多嗎?
早期的硬盤每個磁道的扇區數是一樣的,外磁道和內磁道的記錄密度是不等的,外磁道稀疏內磁道密集,這也造成了很多浪費。因此后來出現了 ZBR(Zone Block Record),采用等密度結構,即外磁道的扇區數多于內磁道的扇區數,如下圖所示:
顯然,因為磁道的扇區數可能不一樣,邏輯地址和物理地址之間的轉換將更加復雜精細,這一部分都是由磁盤控制器來做的,根據各個磁盤的特性設置芯片來具體工作,不需要我們認為操心了解即可。
另外硬盤的旋轉速度一般是保持恒定的,而外磁道的扇區數又要多于內磁道,所以單位時間內掃過的扇區數明顯外磁道是要多于內磁道的,因此外磁道的數據傳輸速度是要快于內磁道的。
扇區
扇區一般由兩部分組成,一部分是頭區域,另一部分是數據區域。數據區域不用多說,就是存儲數據的部分,而頭區域則包括包含驅動器和控制器使用的信息,具體來說就是一些地址標識,缺陷標識以及錯誤檢測和糾正信息。
尋找相應的扇區就是依靠扇區記錄的頭信息來尋找的,期間磁盤控制器需要檢驗這些頭部信息和傳輸數據,需要花費一定時間才能訪問下一個扇區,所以扇區號的物理排列不應是連續的,如果連續的話有可能剛處理完當前扇區,磁頭已經轉到之后的好幾個扇區了,再想處理下一個扇區的話得等待許久。所以磁盤出廠時一般都會做低級格式化,跳躍著將扇區編號,給檢驗傳輸等留出足夠的時間。
扇區、塊/簇、頁
扇區:硬盤最小的讀寫單元
塊/簇:多個扇區組合在一起為一個塊,一般是 個扇區,是操作系統對硬盤讀寫最小單元
頁:操作系統與內存之間操作的最小單元,一般
MBR分區
關于分區前面說過一些,這里再仔細講講。這兒主要講的是傳統的MBR分區。
MBR(Main Boot Record)主引導記錄,它位于整個硬盤的第一個扇區即 0 柱面,0 磁頭,1 扇區(前面說過 CHS 方式以 1 開始編號)。分為三部分:
- 引導程序和一些參數,446 字節
- 分區表 DPT,64 字節
- 結尾標記 0x55 和 0xAA,2字節
分區表
分區表有 4 個表項,每個表項 16 字節,結構如下:
擴展分區
分區表只有 4 個表項,也就是說只能原生支持 4 個分區,現在來說 4 個分區遠遠不夠,于是有了擴展分區。
擴展分區是可選項可有可無,有最多只有一個,為了區分將剩下的三個分區稱為主分區。
擴展分區可以分為多個子擴展分區,子擴展分區就像是一個單獨的硬盤,最開始的扇區為擴展引導扇區 EBR,結構同 MBR,只是分區表只用了兩項,第一項表示該子擴展分區的邏輯分區,第二項表示下一個子擴展分區,其他兩項為 0 。因此擴展分區就像是構建了一個單鏈表,將各個子擴展分區連起來。
關于 MBR,EBR 的分區表項中起始偏移扇區注意以下幾點:
MBR 的分區表項中,起始偏移扇區的基準為 0。
EBR 描述邏輯分區的起始偏移扇區基準為該子擴展分區的地址,也就是上一個子擴展分區中 EBR 記錄的下一個子擴展分區的偏移扇區。
EBR 描述下一個子擴展分區的起始偏移扇區基準為總擴展分區地址,也就是 MBR 中記錄的擴展分區的偏移扇區
來看一看一個硬盤的分區布局圖:
OBR(OS Boot Record),位于主分區/邏輯分區的第一個扇區,稱為操作系統引導扇區,還記得分區表項中第 0 個字節嗎,如果為 0x80 則說明該分區有 OBR 存在操作系統,能夠引導是為活動分區。
MBR,EBR,OBR 這三個不要弄混淆了,MBR 位于整個磁盤的第一個扇區,里面的分區表描述的是主分區和總擴展分區。而 EBR 位于子擴展分區的第一個扇區,分區表描述的是是邏輯分區和下一個子擴展分區。OBR 位于實際分區的第一個扇區,它是操作系統的引導程序,用來加載操作系統。
FAQ
每個分區最大容量是多少?
分區表項中最后 4 字節表示容量,因為只用了 4 字節來表示總的扇區數,如果每個扇區的容量為 512 字節的話,則每個分區最大容量為:
空閑扇區
分區時不能跨柱面,也就不能跨磁道,而 MBR,EBR 需要占用一個扇區,分區不會與它們處于同一個磁道,因此分區通常會偏移一個磁道的大小,期間這沒用的扇區就是空閑扇區。
GPT分區
傳統的 MBR 分區有許多限制,比如只能支持 4 個主分區,而且每個分區大小不能超過 2TB 等等,所以后來提出了一種新的方案 GPT,它有著以下優點:
- 每個硬盤的分區數分區大小幾乎沒有限制
- 分區表有備份,磁盤首位分別保存了一份相同的分區表
- 關鍵數據結構有循環冗余檢測
- 使用全局標識符(GUID)來標識分區類型
- 每個分區有名稱
使用 GPT 分區的磁盤叫做 GPT 磁盤,其結構布局如下所示:
保護性MBR
位于 LBA0,第 0 個扇區,為了兼容性考慮還是存儲的傳統的 MBR,叫做保護性 MBR,只有一個類型為 0xEE 的分區表項表示該磁盤使用 GPT 分區,保護性 MBR 的主要作用是保護不能識別 GPT 分區的磁盤工具對其進行操作。
分區表頭
位于 LBA1,第 1 個扇區,主要結構如下:
分區表項
位于 LBA2—LBA33 ,結構如下:
各個字節表示什么應該很清楚了,就不具體解釋了,LBA33 之后就是各個具體的分區,然后磁盤最后 33 個扇區是倒著存放的分區表頭和分區表。這就是整個 GPT 磁盤的布局,再回頭去看看整個分區布局圖,應該會很清晰了。