一.引言
存儲的選型、規劃與管理等工作一直以來都是日常系統運維工作中的重點。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的分區下。具體如下圖:
GPT
其他安裝、操作過程,大同小異。
3.2 查看、磁碟或分區的常用工具
[root@gpt ~]# 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
[root@gpt ~]# 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
[root@gpt ~]# 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
[root@gpt ~]# 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類型的分區表使用心得
[root@mbr ~]# 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
[root@gpt ~]# 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.
正在同步磁碟。
[root@mbr ~]# partprobe
[root@mbr ~]# 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個分區開始,系統默認使用擴展分區,通過擴展分區新建分區,存儲空間浪費的情況同樣存在。
[root@mbr ~]# 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,部分結果如下:
[root@gpt ~]# 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
[root@mbr ~]# partprobe
[root@mbr ~]# 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 針對不同規格的存儲設備,分區工具的選擇也是有要求的,這一點需要特別注意。
本文同步更新於本人同名GitHub及CSDN,敬請關注。