跳到主要內容
節省工具箱Jason Tools
經驗分享

資料碟超過 2 TiB:MBR 轉 GPT 並擴充

Jason Cheng 發布
資料碟超過 2 TiB:MBR 轉 GPT 並擴充
本文目錄
  1. MBR 的 2 TiB 上限
  2. 轉換前確認
  3. 先備份
  4. MBR 轉 GPT
  5. 擴充分割區
  6. 擴充檔案系統
  7. 確認
  8. 步驟整理
  9. 結論
  10. 參考資料

幫一台 Graylog 主機的資料碟擴充空間,在 Proxmox VE 上把虛擬磁碟從 2 TB 加到 3 TB,進到 VM 裡想用 cfdisk 把分割區拉大,結果畫面跳出兩個訊息:

Device is currently in use, repartitioning is probably a bad idea.
The size of this disk is 2.9 TiB (3221225472000 bytes). DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT).

第一個只是提醒磁碟正在使用中,第二個才是真正的問題:這顆磁碟用的是 MBR(DOS)分割表,最多只能用到 2 TiB。這篇整理把資料碟從 MBR 轉成 GPT、再擴充分割區與檔案系統的完整步驟。

MBR 的 2 TiB 上限

MBR 分割表用 32 位元記錄磁區位置,以每個磁區 512 bytes 計算,最多只能定址到 2 TiB(2,199,023,255,040 bytes)。磁碟再大,超過的部分 MBR 都用不到,cfdisk 也不會讓你把分割區拉超過這個範圍。

GPT 沒有這個限制,現在的磁碟一律建議用 GPT。

轉換前確認

lsblk -f /dev/sdb
parted /dev/sdb print

parted 的輸出裡 Partition Table: msdos 就是 MBR。

注意:本文的做法只適用於資料碟。如果要轉的是用 BIOS(非 UEFI)開機的系統碟,轉成 GPT 之後 GRUB 還需要一個 BIOS boot 分割區,沒處理好就會開不了機,請另外規劃,不要直接套用。

先備份

分割表轉換本身不會動到資料,但只要打錯磁碟或中途斷電,後果就是整顆磁碟的資料不見。動手前務必先備份:虛擬機做快照,實體機至少先把重要資料複製出去。

另外把分割表也備份下來:

sfdisk -d /dev/sdb > /root/sdb-mbr-backup.txt

MBR 轉 GPT

用 gdisk 套件裡的 sgdisk:

apt install gdisk
sgdisk --mbrtogpt /dev/sdb
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory.

Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot or after you
run partprobe(8) or kpartx(8)
The operation has completed successfully.

轉換是就地進行的,原本的分割區位置與資料都不會改變。GPT 需要在磁碟開頭與結尾各保留一小塊空間放分割表,現在的分割區一般都從第 2048 個磁區開始,開頭的空間是夠的;結尾的空間因為磁碟剛擴充過,也不會有問題。

讓核心重新讀取分割表,並確認:

partprobe /dev/sdb
parted /dev/sdb print

Partition Table 變成 gpt 就完成了。如果 partprobe 回報裝置忙碌,代表核心還不能重新讀取使用中的磁碟,可以先卸載該磁碟的檔案系統,或安排重新開機。

擴充分割區

轉成 GPT 之後,分割區還是原本的大小,要再把它拉到整顆磁碟。最簡單的是用 growpart:

apt install cloud-guest-utils
growpart /dev/sdb 1

growpart 會把指定的分割區延伸到磁碟結尾,而且支援使用中的磁碟。也可以用 parted:

parted /dev/sdb resizepart 1 100%

確認分割區已經變大:

lsblk /dev/sdb

擴充檔案系統

分割區變大之後,最後一步是讓上面的檔案系統用到新空間。依實際的架構選擇:

直接是 ext4

resize2fs /dev/sdb1

直接是 XFS

XFS 要指定掛載點而不是裝置:

xfs_growfs /var/lib/graylog-data

中間有 LVM

先擴充 PV,再擴充 LV 與檔案系統:

pvresize /dev/sdb1
lvextend -r -l +100%FREE /dev/vg-data/lv-data

lvextend -r 會連同檔案系統一起擴充,不用再另外執行 resize2fs。

ext4 與 XFS 都支援線上擴充,不需要卸載,服務也不用停。

確認

df -h
lsblk

確認檔案系統的大小已經是新的容量。如果是 Graylog、OpenSearch 這類服務,也可以看一下服務的磁碟使用率是否已經更新。

步驟整理

步驟指令
1備份,sfdisk -d 存下原本的分割表
2sgdisk --mbrtogpt /dev/sdb
3partprobe /dev/sdb,parted print 確認是 GPT
4growpart /dev/sdb 1 擴充分割區
5resize2fs、xfs_growfs 或 pvresize + lvextend -r
6df -h 確認

結論

cfdisk 拉不大分割區,先看是不是撞到 MBR 的 2 TiB 上限。資料碟可以用 sgdisk --mbrtogpt 就地轉成 GPT,不用搬資料,再依序擴充分割區、PV/LV、檔案系統即可。

新建的磁碟也建議一開始就用 GPT,現在的磁碟動不動就超過 2 TB,之後才不會又要轉一次。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀