RHEL7.X系列及周邊Linux發行版中,關於MBR與GPT的選擇一些思考與建議
一.引言
儲存的選型、規劃與管理等工作一直以來都是日常系統運維工作中的重點。MBR與GPT兩種型別的分割槽表的選擇與使用則是在磁碟管理中需要根據應用場景來注或考慮的要點。結合筆者多年的運維工作經驗,引發了對這些問題的一些思考,藉此文進行一些分享。
二.相關知識點
2.1 MBR
主引導記錄(Master Boot Record,縮寫:MBR),又叫做主引導扇區,是計算機開機後訪問硬碟時所必須要讀取的首個扇區,它在硬碟上的三維地址為(柱面,磁頭,扇區)=(0,0,1)。在深入討論主引導扇區內部結構的時候,有時也將其開頭的446位元組內容特指為“主引導記錄”(MBR),其後是4個16位元組的“磁碟分割槽表”(DPT),以及2位元組的結束標誌(55AA)。因此,在使用“主引導記錄”(MBR)這個術語的時候,需要根據具體情況判斷其到底是指整個主引導扇區,還是主引導扇區的前446位元組。
主引導扇區記錄著硬碟本身的相關資訊以及硬碟各個分割槽的大小及位置資訊,是資料資訊的重要入口。如果它受到破壞,硬碟上的基本資料結構資訊將會丟失,需要用繁瑣的方式試探性的重建資料結構資訊後才可能重新訪問原先的資料。主引導扇區內的資訊可以通過任何一種基於某種作業系統的分割槽工具軟體寫入,但和某種作業系統沒有特定的關係,即只要建立了有效的主引導記錄就可以引導任意一種作業系統(作業系統是建立在高階格式化的硬碟分割槽之上,是和一定的檔案系統相聯絡的)。
對於硬碟而言,一個扇區可能的位元組數為128×2n(n=0,1,2,3)。大多情況下,取n=2,即一個扇區(sector)的大小為512位元組。
2.2 GPT
全域性唯一標識分割槽表(GUID Partition Table,縮寫:GPT)是一個實體硬碟的分割槽表的結構佈局的標準。它是可擴充套件韌體介面(EFI)標準(被Intel用於替代個人計算機的BIOS)的一部分,被用於替代BIOS系統中的一32bits來儲存邏輯塊地址和大小資訊的主引導記錄(MBR)分割槽表。對於那些扇區為512位元組的磁碟,MBR分割槽表不支援容量大於2.2TB(2.2×1012位元組)的分割槽,然而,一些硬碟製造商(諸如希捷和西部資料)注意到這個侷限性,並且將他們的容量較大的磁碟升級到4KB的扇區,這意味著MBR的有效容量上限提升到16 TiB。 這個看似“正確的”解決方案,在臨時地降低人們對改進磁碟分配表的需求的同時,也給市場帶來關於在有較大的塊(block)的裝置上從BIOS啟動時,如何最佳的劃分磁碟分割槽的困惑。GPT分配64bits給邏輯塊地址,因而使得最大分割槽大小在264-1個扇區成為可能。對於每個扇區大小為512位元組的磁碟,那意味著可以有9.4ZB(9.4×1021位元組)或8 ZiB個512位元組(9,444,732,965,739,290,426,880位元組或18,446,744,073,709,551,615(264-1)個扇區×512(29)位元組每扇區)。
2.3 MBR與GPT的關係
與支援最大卷為2TB(Terabytes)並且每個磁碟最多有4個主分割槽(或3個主分割槽,1個擴充套件分割槽和無限制的邏輯驅動器)的MBR磁碟分割槽的型別相比,GPT磁碟分割槽樣式支援最大為128個分割槽,一個分割槽最大18EB(Exabytes),只受到作業系統限制(由於分割槽表本身需要佔用一定空間,最初規劃硬碟分割槽時,留給分割槽表的空間決定了最多可以有多少個分割槽,IA-64版Windows限制最多有128個分割槽,這也是EFI標準規定的分割槽表的最小尺寸)。與MBR分割槽的磁碟不同,至關重要的平臺操作資料位於分割槽,而不是位於非分割槽或隱藏扇區。另外,GPT分割槽磁碟有備份分割槽表來提高分割槽資料結構的完整性。在UEFI系統上,通常是通過ESP分割槽中的EFI應用程式檔案啟動GPT硬碟上的作業系統,而不是活動主分割槽上的載入程式。
在RHEL7系列及周邊發行版中,MBR型別的分割槽表是系統預設配置,如需使用GPT型別的分割槽表,還需要進行特殊配置(下文會進行介紹)。
三.實驗過程
3.1 在CentOS7.5中以GPT型別安裝作業系統
預設情況下,CentOS7系列是以MBR型別的分割槽表來安裝作業系統的,如果不通過特殊設定,那麼在GUI安裝介面無法選擇GPT分割槽表型別的。在安裝作業系統選擇的引導介面,講游標移到第一行,按下Tab鍵,插入一個空格,輸入inst gpt,按下回車鍵,繼續引導,即可將作業系統安裝到分割槽表型別為GPT的分割槽下。具體如下圖:
其他安裝、操作過程,大同小異。
3.2 檢視、磁碟或分割槽的常用工具
[[email protected] ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 9G 0 part
├─centos_gpt-root 253:0 0 8G 0 lvm /
└─centos_gpt-swap 253:1 0 1G 0 lvm [SWAP]
sr0 11:0 1 1024M 0 rom
[[email protected] ~]# fdisk -l /dev/sda
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
磁碟 /dev/sda:10.7 GB, 10737418240 位元組,20971520 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 位元組 / 4096 位元組
I/O 大小(最小/最佳):4096 位元組 / 4096 位元組
磁碟標籤型別:gpt
Disk identifier: 3B24C802-3FC5-4D42-9D76-F9D7250B310B
# Start End Size Type Name
1 2048 4095 1M BIOS boot
2 4096 2101247 1G Microsoft basic
3 2101248 20969471 9G Linux LVM
[[email protected] ~]# parted /dev/sda print
Model: Msft Virtual Disk (scsi)
Disk /dev/sda: 10.7GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: pmbr_boot
Number Start End Size File system Name 標誌
1 1049kB 2097kB 1049kB bios_grub
2 2097kB 1076MB 1074MB xfs
3 1076MB 10.7GB 9661MB lvm
[[email protected] ~]# cfdisk /dev/sda
cfdisk (util-linux 2.23.2)
磁碟驅動器:/dev/sda
大小:10737418240 位元組,10.7 GB
磁頭數:255 每磁軌扇區數:63 柱面數:1305
名稱 標誌 分割槽型別 檔案系統 [標籤] 大小 (MB)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sda1 啟動,不可用 主分割槽 GPT 10737.42 *
以上內容主要展示了lsblk、fdisk、parted、cfdisk等四款工具。lsblk主要用於檢視磁碟及分割槽情況,fdisk為較為常用的分割槽工具,支援2TB以下容量的磁碟的分割槽操作,如果超過2TB以上容量的磁碟,則需要使用parted來進行分割槽,cfdisk則是一款比較容易上手的分割槽工具。這些工具在之前的文章中有介紹,可以查閱之前文章。
3.3 MBR型別的分割槽表使用心得
[[email protected] ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 9G 0 part
├─centos-root 253:0 0 8G 0 lvm /
└─centos-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
sdc 8:32 0 1G 0 disk
sdd 8:48 0 1G 0 disk
sde 8:64 0 1G 0 disk
sr0 11:0 1 1024M 0 rom
[[email protected] ~]# fdisk -l /dev/sdb
WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.
裝置 Boot Start End Blocks Id System
/dev/sdb1 2048 501759 249856 83 Linux
/dev/sdb2 501760 706559 102400 83 Linux
/dev/sdb3 706560 911359 102400 83 Linux
/dev/sdb4 911360 1105919 97280 83 Linux
命令(輸入 m 獲取幫助):n
If you want to create more than four partitions, you must replace a
primary partition with an extended partition first.
命令(輸入 m 獲取幫助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁碟。
[[email protected] ~]# partprobe
[[email protected] ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 9G 0 part
├─centos-root 253:0 0 8G 0 lvm /
└─centos-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
├─sdb1 8:17 0 244M 0 part
├─sdb2 8:18 0 100M 0 part
├─sdb3 8:19 0 100M 0 part
└─sdb4 8:20 0 95M 0 part
sdc 8:32 0 1G 0 disk
sdd 8:48 0 1G 0 disk
sde 8:64 0 1G 0 disk
sr0 11:0 1 1024M 0 rom
從上面的實驗,我們可以看出,MBR型別的分割槽表在使用過程中會造成h 儲空間的浪費。也就是說,一塊磁碟,建立了4個主分割槽,如果4個主分割槽的空間使用總和小於磁碟實際可用空間,那麼就無法再繼續進行分割槽操作,因此是無法充分利用這些磁碟空間的。
刪除這些分割槽後,從該磁碟第4個分割槽開始,系統預設使用擴充套件分割槽,通過擴充套件分割槽新建分割槽,儲存空間浪費的情況同樣存在。
[[email protected] ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 9G 0 part
├─centos-root 253:0 0 8G 0 lvm /
└─centos-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
├─sdb1 8:17 0 100M 0 part
├─sdb2 8:18 0 100M 0 part
├─sdb3 8:19 0 100M 0 part
├─sdb4 8:20 0 1K 0 part
├─sdb5 8:21 0 10M 0 part
├─sdb6 8:22 0 10M 0 part
└─sdb7 8:23 0 77M 0 part
sdc 8:32 0 1G 0 disk
sdd 8:48 0 1G 0 disk
sde 8:64 0 1G 0 disk
sr0 11:0 1 1024M 0 rom
下面依然使用fdisk對磁碟sdb進行分割槽,但是把磁碟的分割槽表型別改成了GPT,部分結果如下:
[[email protected] ~]# fdisk -l /dev/sdb
命令(輸入 m 獲取幫助):g
Building a new GPT disklabel (GUID: 757B3774-B7F0-4650-80B1-EAA13E59C602)
將顯示/記錄單位更改為盲區。
命令(輸入 m 獲取幫助):n
分割槽號 (1-128,預設 1):
第一個扇區 (2048-2097118,預設 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-2097118,預設 2097118):+100M
已建立分割槽 1
命令(輸入 m 獲取幫助):p
磁碟 /dev/sdb:1073 MB, 1073741824 位元組,2097152 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 位元組 / 4096 位元組
I/O 大小(最小/最佳):4096 位元組 / 4096 位元組
磁碟標籤型別:gpt
Disk identifier: 757B3774-B7F0-4650-80B1-EAA13E59C602
# Start End Size Type Name
1 2048 206847 100M Linux filesyste
[[email protected] ~]# partprobe
[[email protected] ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 9G 0 part
├─centos-root 253:0 0 8G 0 lvm /
└─centos-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
├─sdb1 8:17 0 100M 0 part
├─sdb2 8:18 0 100M 0 part
├─sdb3 8:19 0 100M 0 part
├─sdb4 8:20 0 100M 0 part
├─sdb5 8:21 0 100M 0 part
├─sdb6 8:22 0 100M 0 part
└─sdb7 8:23 0 423M 0 part
sdc 8:32 0 1G 0 disk
sdd 8:48 0 1G 0 disk
sde 8:64 0 1G 0 disk
sr0 11:0 1 1024M 0 rom
從操作過程中,我們可用看到,分割槽號1-128,與前文所述一致。磁碟分割槽之後可用空間與實際空間差距不大,儲存空間浪費較小。
四.總結
4.1 在RHEL7.X系列及周邊發行版中,在磁碟空間小於2TB的系統安裝過程中採用的預設的分割槽型別是MBR,如需使用GPT還需特殊設定。
4.2 對於儲存空間大於2TB的儲存裝置,儘量在使用GPT型別的分割槽表,避免造成儲存空間的浪費。
4.3 在儲存裝置的使用之前,要明確用途,對資料的總量有一個總體性的把握。
4.4 在基於VMware、KVM等技術架構的雲端計算平臺中,磁碟空間的擴充套件儘量以獨立磁碟裝置的形式進行擴充套件,儘量減少在原磁碟上進行空間擴充套件這一類操作。因為在前文已經提及,預設情況下RHEL7.X的磁碟分割槽型別為MBR。也就是說,在原磁碟上進行空間擴充套件的話,每次都新建主分割槽,那麼最多隻能擴充套件4次,即使後期以擴充套件分割槽進行擴充套件,規劃不慎,也是會造成儲存空間的浪費。這一點筆者在過去兩三年的運維生涯中深有感悟。
4.5 針對不同規格的儲存裝置,分割槽工具的選擇也是有要求的,這一點需要特別注意。