磁盘分区MBR和GPT格式详解(Linux)
一、磁盤結構
機械硬盤主要由磁盤盤片、磁頭、主軸與傳動軸等組成,數據存放在具有磁性物質的磁盤盤片中。
實際運行時,主軸馬達讓碟片轉動,然后磁頭臂讓磁頭在碟片上面進行讀寫操作。
讀取數據時以磁頭轉圈的方式進行,在磁片同心圓中切出一個一個的小區塊,這些小區塊就是磁盤的最小物理存儲單位,成為扇區(sector),同一個同心圓的扇區組合成的圓就是磁道(track)。由于磁盤里可能會有多個碟片,因此在所有碟片上面的同一個磁道可以組成 柱面(cylinder)。
外圈的圓比較大,為了合理利用這些空間,磁盤外圈圓會比內圈有更多的扇區。所以,當碟片轉一圈時,外圈的扇區數量比較多,因此如果數據寫入在外圈,轉一圈能夠讀寫的數據量比內圈多。因此數據的讀寫會由外圈開始向內寫,這是默認的方式。
原本硬盤的扇區都是設計成512B的大小,但隨著硬盤容量的增大,為了減少數據量的拆解,目前絕大多數的高容量硬盤使用了4K大小的扇區設計。
為什么要分區?
- 1.數據的安全性
每個分區的數據是分開存儲的,當要對某個分區的數據進行整理時,不會影響到其它分區。例如對安裝有Windows系統的C盤進行重裝時,對其它分區如D盤、E盤中的數據不會產生影響。 - 2.系統的性能
某個分區處在特定范圍的柱面范圍內,當要在該分區內讀取數據時,只需要在其柱面范圍內檢索,由于數據較為集中,所以讀取速度和性能較高。
主要的分區格式有早期的MBR格式和新的GPT格式。
二、分區格式
1、MBR
(1)簡介
MBR分區格式中柱面是文件系統的最小單位,也就是分區的最小單位。
第一個扇區(舊式磁盤中為512字節)中存放著啟動引導程序和分區表:
- 主引導記錄(Master Boot Record, MBR):可以安裝啟動引導程序的地方,有446字節;
- 分區表(partition table):記錄整塊硬盤分區的狀態,有64字節。
分區表64字節最多僅能有四組記錄區,每個記錄區16字節。
如圖中有4個主分區。
總結:
- 所謂的分區就是針對64字節的分區表進行設置而已。
- 磁盤默認的分區表僅能寫入四組分區信息,每組記錄區記錄了該區段的起始與結束的柱面號碼。
- 這四個分區的記錄被稱為主要(Primary)分區或擴展(Extended)分區。
- 當系統要寫入磁盤時,一定會參考磁盤分區表,才能針對某個分區進行數據的處理。
(2)擴展分區和邏輯分區:
擴展分區的目的是使用額外的扇區來記錄分區的信息,擴展分區本身并不能被拿來格式化。
擴展分區可以繼續劃分出邏輯分區(logical partition)。
/dev/sda[1-4] 都是留給主分區或擴展分區用的,所以邏輯分區的設備文件名就從 sda5 開始。
圖中分區在Linux下的文件名是:
P1:/dev/sda1
P2:/dev/sda2
L1:/dev/sda5
L2:/dev/sda6
L3:/dev/sda7
L4:/dev/sda8
L5:/dev/sda9
總結:
- 主分區和擴展分區最多可以有4個(硬盤限制)。
- 擴展分區最多只能有1個(操作系統限制)。
- 邏輯分區是由擴展分區持續劃分出來的分區。
- 能夠被格式化后作為數據存取的分區是主分區和邏輯分區,擴展分區無法格式化。
- 邏輯分區的數量依操作系統而不同,在Linux中SATA硬盤已經可以突破63個以上的分區限制。
- 一般建議將擴展分區的柱面號碼分配到最后的柱面內。
MBR模式簡略圖:
MBR分區表結構:
| 00H | 1 | 分區狀態:00–>非活動分區;80–>活動分區;其它數值沒有意義 |
| 01H | 1 | 分區起始磁頭號(HEAD),用到全部8位 |
| 02H | 2 | 分區起始扇區號(SECTOR),占據02H的位0-5;該分區的起始磁柱號(CYLINDER),占據02H的位6-7和03H的全部8位 |
| 04H | 1 | 文件系統標志位 |
| 05H | 1 | 分區結束磁頭號(HEAD),用到全部8位 |
| 06H | 2 | 分區結束扇區號(SECTOR),占據06H的位0-5;該分區的結束磁柱號(CYLINDER),占據06H的位6-7和07H的全部8位 |
| 08H | 4 | 分區起始相對扇區號 |
| 0CH | 4 | 分區總的扇區數 |
(3)MBR分區大小限制的問題:
分區表組最后4個字節表示分區中的扇區數量,有4*8=32位,最大值為 20+21+ … +231 = 232-1 個扇區,每個扇區大小為512字節,所以能表示的最大容量為 :
(232?1)?512=2199023255040bytes=2048GB=2TB(2^{32}-1) * 512= 2199023255040 \, bytes = 2048 \, GB = 2 \, TB (232?1)?512=2199023255040bytes=2048GB=2TB注意這里是用1:1024換算的,硬盤制造商使用1:1000換算,所以就會得出2.2TB的結果。
2TB是對單一分區容量的限制,如果第一個分區就占了2TB,那么其第二個分區的扇區物理地址就無法表示了,所以2TB也是對整個硬盤最大容量的限制。
詳細說明見Wiki頁面:https://zh.wikipedia.org/wiki/Master_boot_record
MBR的弊端:
- 操作系統無法使用2.2TB以上的磁盤容量。
- MBR僅有一個區塊,被破壞后經常無法或很難恢復。
- MBR內的存放啟動引導程序的區塊僅446字節,無法存儲較多的程序代碼。
2、GPT
(1)簡介
如今扇區大小不僅有512字節的,還有4K大小的。為了兼容所有的磁盤,使用邏輯區塊地址(Logical Block Address,LBA)來處理扇區。GPT將硬盤所有區塊以LBA(默認512字節)來規劃,第一個LBA稱為LBA0。
與MBR僅使用第一個512字節來記錄不同,GPT使用了34個LBA來記錄分區信息。相比于MBR中只有一個區塊記錄分區信息,GPT除了前面34個LBA記錄以外,整個磁盤的最后34個LBA也拿來做備份。
(2)LBA
-
LBA0(MBR兼容模塊)
出于兼容性考慮存儲了一份傳統MBR,用來防止不支持GPT的硬盤管理工具錯誤識別并破壞硬盤中的數據,這個MBR也叫做保護MBR。
分為兩個部分,第一個是前面446字節,用來存儲第一階段的啟動引導程序。而在原本的分區表的記錄區內,這個兼容模式僅放入了一個特殊字符來表示此磁盤為GPT格式之意。
在使用 MBR/GPT 混合分區表的硬盤中,這部分存儲了GPT分區表的一部分分區(通常是前四個分區),可以使不支持從GPT啟動的操作系統從這個MBR啟動,啟動后只能操作MBR分區表中的分區。 -
LBA1(GPT表頭記錄)
記錄了分區表本身的位置和大小,也記錄了備份用的GPT分區(最后34個LBA區塊)放置的位置。同時放置了分區表的校驗碼(CRC32),操作系統可以根據這個校驗碼來判斷GPT是否正確。若有錯誤可以通過這個記錄區來獲取備份的GPT(磁盤最后面的備份區塊)來恢復正常。 -
LBA[2-33](實際記錄分區信息處)
從LBA2區塊開始,每個LBA都可以記錄4組分區記錄,所以在默認情況下,總共有4*32=128組分區記錄。每組記錄用到128字節的空間。
| 0 | 16字節 | 分區類型GUID |
| 16 | 16字節 | 分區GUID |
| 32 | 8字節 | 起始LBA(小端序) |
| 40 | 8字節 | 末尾LBA |
| 48 | 8字節 | 屬性標簽(如:60表示“只讀”) |
| 56 | 72字節 | 分區名(可以包括36個UTF-16(小端序)字符) |
(16+16+8+8+8+72=128)
(3)GPT分區大小限制:
GPT 在每組記錄中分別提供了 8字節 = 64位 來記載開始/結束的扇區號碼。因此,理論上對于單一分區槽來說, 它的最大容量限制為 264 * 512bytes = 263 Kbytes = 233TB = 8 ZB 。但是受操作系統限制,一般一個分區最大限制為 18EB。
GPT 分區沒有所謂的主、擴展、邏輯分區的概念,每個都可以視為是主分區,每一個分區都可以格式化。
GPT 分區默認可以提供多達128 組紀錄,而在Linux 本身的內核設備記錄中,針對單一磁盤來說,雖然過去最多只能到達15 個分區,不過由于Linux 內核通過udev 等方式的處理,現在Linux 也已經沒有這個限制了。
參考鏈接:1.https://en.wikipedia.org/wiki/GUID_Partition_Table
2.https://docs.microsoft.com/en-us/troubleshoot/windows-server/backup-and-storage/guid-partitioning-table-disk-faq
總結
以上是生活随笔為你收集整理的磁盘分区MBR和GPT格式详解(Linux)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于C语言的双人贪吃蛇游戏程序设计
- 下一篇: python实现将android手机通讯