1. 程式人生 > >磁碟分割槽MBR與GPT詳解

磁碟分割槽MBR與GPT詳解

一  磁碟

磁碟的組成主要有磁碟盤、機械手臂、磁碟讀取頭與主軸馬達所組成, 而數

據的寫入其實是在磁碟盤上面。磁碟盤上面又可細分出扇區(Sector)與磁軌(Track)兩種單位, 其中扇
區的物理量設計有兩種大小,分別是 512bytes 與 4Kbytes。假設磁碟只有一個磁碟盤,那麼磁碟盤

有點像底下這樣:

那麼是否每個扇區都一樣重要呢?其實整顆磁碟的第一個扇區特別的重要,因為他記錄了整顆磁碟的
重要資訊! 早期磁碟第一個扇區裡面含有的重要資訊我們稱為 MBR (Master Boot Record) 格式,但
是由於近年來磁碟的容量不斷擴大,造成讀寫上的一些困擾, 甚至有些大於 2TB 以上的磁碟分割槽
已經讓某些作業系統無法存取。因此後來又多了一個新的磁碟分割槽格式,稱為 GPT (GUID partition
table)! 那麼分割槽表又是啥?

其實妳剛剛拿到的整顆硬碟就像一根原木,你必須要在這根原木上面切割出你想
要的區段, 這個區段才能夠再製作成為你想要的傢俱!如果沒有進行切割,那麼原木就不能被有效
的使用。 同樣的道理,你必須要針對你的硬碟進行分割槽,這樣硬碟才可以被你使用的!這兩種分割槽格式與限制不太相同!

通常磁碟可能有多個磁碟盤,所有磁碟盤的同一個磁軌我們稱為磁柱 (Cylinder), 通常那是檔案系統的最小單位,也就是分割槽槽的最小單位啦!為什麼說『通常』
呢?因為近來有 GPT 這個可達到 64bit 紀錄功能的分割槽表, 現在我們甚至可以使用扇區 (sector)
號碼來作為分割槽單位!


二 MSDOS (MBR) 分割槽表格式與限制

早期的 Linux 系統為了兼容於 Windows 的磁碟,因此使用的是支援 Windows 的 MBR(Master Boot
Record, 主要開機紀錄區) 的方式來處理開機管理程式與分割槽表!而開機管理程式紀錄區與分割槽表則
通通放在磁碟的第一個扇區, 這個扇區通常是 512bytes 的大小 (舊的磁碟扇區都是 512bytes !),
所以說,第一個扇區 512bytes 會有這兩個資料:
1.    主要啟動記錄區(Master Boot Record, MBR):可以安裝開機管理程式的地方,有 446 bytes
2.    分割槽表(partition table):記錄整顆硬碟分割槽的狀態,有 64 bytes

3.    硬碟的分割槽有效標誌(Magic Number): 有2bytes,aa和55被稱為幻數(Magic Number),BIOS讀取MBR最後會看是否為這兩個幻數,如果沒有則認為這是一個沒有分割槽的硬碟

     

由於分割槽表所在區塊僅有 64 bytes 容量,因此最多僅能有四組記錄區,每組記錄區記錄了該區段的啟
始與結束的磁柱號碼。 若將硬碟以長條形來看,然後將磁柱以柱形圖來看,那麼那 64 bytes 的記錄
區段有點像底下的圖示:

                          

假設上面的硬碟裝置檔名為/dev/sda 時,那麼這四個分割槽槽在 Linux 系統中的裝置檔名如下所示,
重點在於檔名後面會再接一個數字,這個數字與該分割槽槽所在的位置有關!
     P1:/dev/sda1

     P2:/dev/sda2

     P3:/dev/sda3
     P4:/dev/sda4

上圖中我們假設硬碟只有 400 個磁柱,共分割槽成為四個分割槽槽,第四個分割槽槽所在為第 301 到 400
號磁柱的範圍。當你的作業系統為 Windows 時,那麼第一到第四個分割槽槽的代號應該就是 C, D, E, F。
當你有資料要寫入 F 槽時, 你的資料會被寫入這顆磁碟的 301~400 號磁柱之間的意思。
由於分割槽表就只有 64 bytes 而已,最多隻能容納四筆分割槽的記錄, 這四個分割槽的記錄被稱為主要
(Primary)或延伸(Extended)分割槽槽。 根據上面的圖示與說明,我們可以得到幾個重點資訊:

1. 其實所謂的『分割槽』只是針對那個 64 bytes 的分割槽表進行設定而已!
2. 硬碟預設的分割槽表僅能寫入四組分割槽資訊
3. 這四組分割槽資訊我們稱為主要(Primary)或延伸(Extended)分割槽槽
4. 分割槽槽的最小單位『通常』為磁柱(cylinder)
5. 當系統要寫入磁碟時,一定會參考磁碟分割槽表,才能針對某個分割槽槽進行資料的處理

咦!你會不會突然想到,為啥要分割槽啊?基本上你可以這樣思考分割槽的角度:

1. 資料的安全性:
因為每個分割槽槽的資料是分開的!所以,當你需要將某個分割槽槽的資料重整時,例如你要將計算機中
Windows 的 C 槽重新安裝一次系統時, 可以將其他重要資料移動到其他分割槽槽,例如將郵件、桌面資料移
動到 D 槽去,那麼 C 槽重灌系統並不會影響到 D 槽! 所以善用分割槽槽,可以讓妳的資料更安全。
2. 系統的效能考慮:
由於分割槽槽將資料集中在某個磁柱的區段,例如上圖當中第一個分割槽槽位於磁柱號碼 1~100 號,如此一來
當有資料要讀取自該分割槽槽時, 磁碟只會搜尋前面 1~100 的磁柱範圍,由於資料集中了,將有助於資料讀
取的速度與效能!所以說,分割槽是很重要的!
既然分割槽表只有記錄四組資料的空間,那麼是否代表我一顆硬碟最多隻能分割槽出四個分割槽槽?當然不
是啦!有經驗的朋友都知道, 你可以將一顆硬碟分割槽成十個以上的分割槽槽的!那又是如何達到的呢?
在 Windows/Linux 系統中, 我們是透過剛剛談到的延伸分割槽(Extended)的方式來處理的啦!延伸分割槽
的想法是: 既然第一個扇區所在的分割槽表只能記錄四筆資料, 那我可否利用額外的扇區來記錄更多
的分割槽資訊?實際上圖示有點像底下這樣:

                                         

NOTE:實際上延伸分割槽並不是只佔一個區塊,而是會分佈在每個分割槽槽的最前面幾個扇區來
記載分割槽資訊的!只是為了方便讀者記憶, 鳥哥在上圖就將他簡化了!有興趣的讀者可以到底下的連結瞧一瞧實
際延伸分割槽的紀錄方式:
http://en.wikipedia.org/wiki/Extended_boot_record

在上圖當中,我們知道硬碟的四個分割槽記錄區僅使用到兩個,P1 為主要分割槽,而 P2 則為延伸分割槽。
請注意,延伸分割槽的目的是使用額外的扇區來記錄分割槽資訊,延伸分割槽本身並不能被拿來格式化。 然
後我們可以透過延伸分割槽所指向的那個區塊繼續作分割槽的記錄。
如上圖右下方那個區塊有繼續分割槽出五個分割槽槽, 這五個由延伸分割槽繼續切出來的分割槽槽,就被稱
為邏輯分割槽槽(logical partition)。 同時注意一下,由於邏輯分割槽槽是由延伸分割槽繼續分割槽出來的,所
以他可以使用的磁柱範圍就是延伸分割槽所設定的範圍喔! 也就是圖中的 101~400 !
同樣的,上述的分割槽槽在 Linux 系統中的裝置檔名分別如下:
1. P1:/dev/sda1
2. P2:/dev/sda2
3. L1:/dev/sda5
4. L2:/dev/sda6
5. L3:/dev/sda7
6. L4:/dev/sda8
7. L5:/dev/sda9

仔細看看,怎麼裝置檔名沒有/dev/sda3 與/dev/sda4 呢?因為前面四個號碼都是保留給 Primary 或
Extended 用的! 所以邏輯分割槽槽的裝置名稱號碼就由 5 號開始了!這在 MBR 方式的分割槽表中是
個很重要的特性,不能忘記!

MBR 主要分割槽、延伸分割槽與邏輯分割槽的特性我們作個簡單的定義:
1. 主要分割槽與延伸分割槽最多可以有四筆(硬碟的限制)
2. 延伸分割槽最多隻能有一個(作業系統的限制)
3. 邏輯分割槽是由延伸分割槽持續切割出來的分割槽槽;
4. 能夠被格式化後,作為資料存取的分割槽槽為主要分割槽與邏輯分割槽。延伸分割槽無法格式化;
5. 邏輯分割槽的數量依作業系統而不同,在 Linux 系統中 SATA 硬碟已經可以突破 63 個以上的分割槽限制;



MBR 分割槽表除了主分割槽、延伸分割槽、邏輯分割槽需要注意之外,由於每組分割槽表僅有 16bytes 而
已,因此可紀錄的資訊真的是相當有限的! 所以,在過去 MBR 分割槽表的限制中經常可以發現如下
的問題:

1. 作業系統無法抓取到 2.2T 以上的磁碟容量!
2. MBR 僅有一個區塊,若被破壞後,經常無法或很難救援。
3. MBR 內的存放開機管理程式的區塊僅 446bytes,無法容納較多的程式程式碼。

這個 2.2TB 限制的現象在早期並不會很嚴重。但是,近年來硬碟廠商動不對推出的磁碟容量就高達
好幾個 TB 的容量!目前 (2016) 單一磁碟最高容量甚至高達 8TB 了! 如果使用磁碟陣列的系統,
像鳥哥的一組系統中,用了 24 顆 4TB 磁碟搭建出磁碟陣列,那在 Linux 底下就會看到有一顆
70TB 左右的磁碟! 如果使用 MBR 的話...那得要 2TB/2TB 的割下去,雖然 Linux kernel 現在已
經可以透過某些機制讓磁碟分割槽高過 63 個以上,但是這樣就得要割出將近 40 個分割槽槽~ 真要命...
為了解決這個問題,所以後來就有 GPT 這個磁碟分割槽的格式出現了!

三  GUID partition table, GPT 磁碟分割槽表

因為過去一個扇區大小就是 512bytes 而已,不過目前已經有 4K 的扇區設計出現!為了兼容於所有
的磁碟,因此在扇區的定義上面, 大多會使用所謂的邏輯區塊地址(Logical Block Address, LBA)來處
理。GPT 將磁碟所有區塊以此 LBA(預設為 512bytes 喔!) 來規劃,而第一個 LBA 稱為 LBA0 (從
0 開始編號)。
與 MBR 僅使用第一個 512bytes 區塊來紀錄不同, GPT 使用了 34 個 LBA 區塊來紀錄分割槽資訊!
同時與過去 MBR 僅有一的區塊,被幹掉就死光光的情況不同, GPT 除了前面 34 個 LBA 之外,
整個磁碟的最後 33 個 LBA 也拿來作為另一個備份!這樣或許會比較安全些吧!詳細的結構有點像
底下的模樣:

                         

上述圖示的解釋說明如下:

LBA0 (MBR 相容區塊)

與 MBR 模式相似的,這個相容區塊也分為兩個部份,一個就是跟之前 446 bytes 相似的
區塊,儲存了第一階段的開機管理程式! 而在原本的分割槽表的紀錄區內,這個相容模式僅
放入一個特殊標誌的分割槽,用來表示此磁碟為 GPT 格式之意。而不懂 GPT 分割槽表的磁碟
管理程式, 就不會認識這顆磁碟,除非使用者有特別要求要處理這顆磁碟,否則該管理軟體
不能修改此分割槽資訊,進一步保護了此磁碟!

LBA1 (GPT 表頭紀錄)

這個部份紀錄了分割槽表本身的位置與大小,同時紀錄了備份用的 GPT 分割槽 (就是前面談到
的在最後 34 個 LBA 區塊) 放置的位置, 同時放置了分割槽表的檢驗機制碼 (CRC32),操
作系統可以根據這個檢驗碼來判斷 GPT 是否正確。若有錯誤,還可以透過這個紀錄區來
取得備份的 GPT(磁碟最後的那個備份區塊) 來恢復 GPT 的正常運作!

LBA2-33 (實際紀錄分割槽資訊處)

從 LBA2 區塊開始,每個 LBA 都可以紀錄 4 筆分割槽紀錄,所以在預設的情況下,總共
可以有 4*32 = 128 筆分割槽紀錄喔!因為每個 LBA 有 512bytes,因此每筆紀錄用到 128
bytes 的空間,除了每筆紀錄所需要的識別符號與相關的紀錄之外,GPT 在每筆紀錄中分別提供了 64bits 來記載開始/結束的扇區號碼,因此,GPT 分割槽表對於單一分割槽槽來說, 他
的最大容量限制就會在『 264 * 512bytes = 263 * 1Kbytes = 233*TB = 8 ZB 』,要注意 1ZB =
230TB 啦! 你說有沒有夠大了?

現在 GPT 分割槽預設可以提供多達 128 筆紀錄,而在 Linux 本身的核心裝置紀錄中,針對單一磁碟
來說,雖然過去最多隻能到達 15 個分割槽槽,不過由於 Linux kernel 透過 udev 等方式的處理,現在
Linux 也已經沒有這個限制在了! 此外,GPT 分割槽已經沒有所謂的主、延伸、邏輯分割槽的概念,既
然每筆紀錄都可以獨立存在, 當然每個都可以視為是主分割槽!每一個分割槽都可以拿來格式化使用!

NOTE:由於新的機制的關係,分割槽槽已經可以突破核心限制的狀況! 此
外,為了查詢正確性,鳥哥還真的有注意到網路上有朋友實際拿一顆磁碟分割槽出 130 個以上的分割槽槽, 結果他發
現 120 個以前的分割槽槽均可以格式化使用,但是 130 之後的似乎不太能夠使用了!或許跟預設的 GPT 共 128 個
號碼有關!雖然新版的 Linux 大多認識了 GPT 分割槽表,沒辦法,我們 server 常常需要比較高容量的磁碟!
不過,在磁碟管理工具上面, fdisk 這個老牌的軟體並不認識 GPT !要使用 GPT 的話,得要操
作類似 gdisk 或者是 parted 指令 另外,開機管理程式方面, grub 第一版並不認識 GPT !得要 grub2 以後才會認識的!

注:本文主要來自鳥哥

其他參考文獻:http://blog.chinaunix.net/uid-24774106-id-3340397.html