Quản lý phân vùng đĩa Linux với parted, gdisk và fdisk: Hướng dẫn GPT/MBR

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Ba Công Cụ, Một Nhiệm Vụ — Bạn Nên Chọn Cái Nào?

Mỗi lần tôi khởi động server mới hoặc thêm ổ đĩa, đồng nghiệp lại hỏi tôi câu quen thuộc: “Nên dùng fdisk, parted hay gdisk?” Câu trả lời thật ra là cả ba đều có thể xử lý hầu hết các tác vụ phân vùng — nhưng chúng có những khác biệt thực sự quan trọng tùy thuộc vào kích thước đĩa, loại bảng phân vùng, và việc bạn thích menu tương tác hay lệnh một dòng có thể viết script.

Hướng dẫn này sẽ đi qua từng công cụ, so sánh chúng song song, và chỉ cho bạn biết chính xác nên dùng cái nào trong tình huống nào — kèm theo các lệnh bạn có thể chạy ngay.

So sánh các công cụ: fdisk vs gdisk vs parted

Trước khi động vào bất kỳ ổ đĩa nào, việc hiểu từng công cụ được thiết kế để làm gì sẽ rất hữu ích.

fdisk — Công cụ cổ điển, nhưng có giới hạn

fdisk đã tồn tại từ những ngày đầu của Unix. Nó hoạt động tốt với bảng phân vùng MBR (DOS) và có mặt trên mọi bản phân phối Linux. Điểm hạn chế: các phiên bản cũ của fdisk (trước 2.26) không xử lý GPT đúng cách, và ngay cả phiên bản hiện đại cũng có hỗ trợ GPT hạn chế hơn so với hai công cụ kia. Với đĩa dưới 2TB và cấu hình legacy, fdisk hoàn toàn đủ dùng. Vượt quá ngưỡng đó, bạn đang dùng sai công cụ rồi.

gdisk — Người anh em GPT-native của fdisk

gdisk được xây dựng dành riêng cho bảng phân vùng GPT. Giao diện gần như giống hệt fdisk — cùng luồng điều hướng bằng menu, cùng các phím lệnh — giúp việc chuyển đổi trở nên dễ dàng. Nó xử lý GPT natively, hỗ trợ đĩa trên 2TB, và cũng có thể chuyển đổi bảng MBR sang GPT (cần cẩn thận). Nếu bạn đang làm việc với server hiện đại hoặc ổ NVMe, gdisk là lựa chọn hàng đầu.

parted — Vũ khí mạnh mẽ có thể viết script

parted hỗ trợ cả MBR lẫn GPT, xử lý đĩa ở bất kỳ kích thước nào, và — quan trọng hơn — hoạt động theo chế độ non-interactive. Bạn có thể nối chuỗi lệnh trên một dòng shell duy nhất, giúp nó lý tưởng cho tự động hóa, cloud-init script, và provisioning Terraform. Trên server production Ubuntu 22.04 của tôi với 4GB RAM, tôi thấy cách tiếp cận này giảm đáng kể thời gian xử lý khi provisioning nhiều ổ dữ liệu trong quá trình triển khai, vì tôi có thể chạy lệnh parted trong script mà không cần chờ các prompt tương tác.

Ưu và Nhược điểm

fdisk

  • Ưu điểm: Có sẵn ở mọi nơi, giao diện quen thuộc, tuyệt vời cho đĩa MBR, không cần cài thêm package
  • Nhược điểm: Hỗ trợ GPT hạn chế, không có chế độ non-interactive thân thiện với scripting theo mặc định, giới hạn 2TB trên các phiên bản cũ

gdisk

  • Ưu điểm: Hỗ trợ GPT đầy đủ, chuyển đổi MBR sang GPT, giao diện kiểu fdisk quen thuộc, xử lý được đĩa lớn
  • Nhược điểm: Không phải lúc nào cũng được cài sẵn (cần package gdisk), hỗ trợ MBR là thứ yếu

parted

  • Ưu điểm: Hỗ trợ cả GPT lẫn MBR, chế độ non-interactive cho scripting, hỗ trợ resize, phổ biến rộng rãi
  • Nhược điểm: Cú pháp khác với fdisk/gdisk, ít prompt cảnh báo an toàn hơn (dễ mắc lỗi hơn), không có các thao tác đặc thù GUID như gdisk

Hướng dẫn chọn công cụ

Đây là mô hình tư duy tôi dùng hàng ngày:

  • Đĩa MBR, làm việc tương tácfdisk
  • Đĩa GPT, làm việc tương tácgdisk
  • Bất kỳ đĩa nào, scripting/tự động hóaparted
  • Thay đổi kích thước phân vùngparted (công cụ duy nhất trong ba cái có lệnh resizepart)

Với server mới từ 2024 trở đi, hầu hết mọi thứ đều dùng GPT. Tôi mặc định dùng parted cho việc provisioning bằng script và gdisk khi cần kiểm tra hoặc sửa chữa bảng phân vùng thủ công.

Hướng dẫn thực hiện

Liệt kê đĩa và bảng phân vùng hiện tại

Luôn bắt đầu bằng việc xác định ổ đĩa của bạn:

# Liệt kê tất cả block device
lsblk -f

# Hiển thị thông tin bảng phân vùng chi tiết
sudo parted -l

# Kiểm tra đĩa dùng GPT hay MBR
sudo fdisk -l /dev/sdb

Tạo bảng phân vùng GPT với parted

Giả sử ổ đĩa mục tiêu là /dev/sdb và hiện đang trống:

# Tạo bảng GPT
sudo parted /dev/sdb mklabel gpt

# Tạo một phân vùng duy nhất sử dụng toàn bộ không gian
sudo parted /dev/sdb mkpart primary ext4 0% 100%

# Kiểm tra
sudo parted /dev/sdb print

Để cấu hình chi tiết hơn với nhiều phân vùng:

# Phân vùng đầu tiên 20GB, phần còn lại là phân vùng thứ hai
sudo parted /dev/sdb mkpart primary ext4 1MiB 20GiB
sudo parted /dev/sdb mkpart primary ext4 20GiB 100%

Tạo phân vùng GPT với gdisk (Tương tác)

sudo gdisk /dev/sdb

Bên trong menu gdisk:

GPT fdisk (gdisk) version 1.0.8

Command (? for help): n       # phân vùng mới
Partition number: 1
First sector: (nhấn Enter để dùng mặc định)
Last sector: +20G             # hoặc +100% để dùng toàn bộ
Hex code or GUID: 8300        # hệ thống file Linux

Command (? for help): w       # ghi và thoát
Do you want to proceed? (Y/N): Y

Mã loại phân vùng phổ biến cho gdisk:

  • 8300 — Hệ thống file Linux
  • 8200 — Linux swap
  • 8e00 — Linux LVM
  • fd00 — Linux RAID
  • ef00 — Phân vùng hệ thống EFI

Tạo phân vùng MBR với fdisk

sudo fdisk /dev/sdb
Command (m for help): o       # tạo bảng MBR mới
Command (m for help): n       # phân vùng mới
Partition type: p             # primary
Partition number: 1
First sector: (Enter)
Last sector: +20G

Command (m for help): t       # thay đổi loại phân vùng (tùy chọn)
Hex code: 83                  # Linux

Command (m for help): w       # ghi

Định dạng sau khi phân vùng

Sau khi tạo phân vùng, hãy định dạng chúng. Kernel thường nhận diện bảng phân vùng mới tự động, nhưng chạy partprobe nếu không nhận:

sudo partprobe /dev/sdb

# Định dạng dạng ext4
sudo mkfs.ext4 /dev/sdb1

# Hoặc xfs (tốt hơn cho file lớn)
sudo mkfs.xfs /dev/sdb1

# Mount và thêm vào fstab
sudo mkdir /mnt/data
sudo mount /dev/sdb1 /mnt/data

# Lấy UUID cho mục fstab
blkid /dev/sdb1

Thay đổi kích thước phân vùng với parted

Đây là nơi parted thực sự tỏa sáng. Giả sử bạn muốn mở rộng /dev/sdb1 để sử dụng toàn bộ không gian còn lại:

# Trước tiên, kiểm tra cấu hình hiện tại
sudo parted /dev/sdb print

# Thay đổi kích thước phân vùng 1 để lấp đầy đĩa
sudo parted /dev/sdb resizepart 1 100%

# Sau đó thay đổi kích thước filesystem (ví dụ ext4)
sudo resize2fs /dev/sdb1

Với XFS, bạn thay đổi kích thước filesystem sau khi mount:

sudo xfs_growfs /mnt/data

Sửa bảng GPT bị hỏng

GPT thực ra lưu hai bản sao của bảng phân vùng — một ở đầu đĩa và một ở cuối đĩa. Nếu một bản bị hỏng, gdisk có thể khôi phục từ bản sao lưu:

sudo gdisk /dev/sdb
# gdisk sẽ cảnh báo về các vấn đề GPT
# Sử dụng menu khôi phục
Command (? for help): r       # khôi phục và chuyển đổi

Recovery/transformation menu:
b   # dùng backup GPT header (từ cuối đĩa)
c   # tải bảng phân vùng backup từ đĩa
d   # dùng main GPT header (từ đầu đĩa)

# Sau khi chọn, ghi bảng đã sửa
Command (? for help): w

Với MBR bị hỏng, fdisk có thể xây dựng lại bảng nếu bạn biết cấu hình phân vùng gốc. Ngoài ra, testdisk (package riêng biệt) rất tốt để khôi phục phân vùng tự động.

Chuyển đổi MBR sang GPT

Nếu bạn cần chuyển đổi đĩa MBR hiện có sang GPT mà không mất dữ liệu (hữu ích khi đạt giới hạn 2TB hoặc cần nhiều hơn 4 phân vùng primary):

sudo gdisk /dev/sdb
# gdisk phát hiện MBR và đề nghị chuyển đổi
Found valid MBR and corrupt GPT. Which do you want to use?
 1 - MBR
 2 - GPT
 3 - Create blank GPT

# Chọn 2 để chuyển đổi — gdisk chuyển đổi trong bộ nhớ
# Xem lại bảng phân vùng, sau đó:
Command (? for help): w       # ghi GPT vào đĩa

Hãy sao lưu dữ liệu trước khi thực hiện. Quá trình chuyển đổi thường hoạt động tốt, nhưng các thao tác với đĩa luôn tiềm ẩn rủi ro.

Bảng tham khảo nhanh

# --- parted (không tương tác) ---
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary ext4 1MiB 100%
parted /dev/sdb resizepart 1 100%
parted /dev/sdb rm 2
parted -l                              # liệt kê tất cả đĩa

# --- gdisk (tương tác) ---
gdisk /dev/sdb
  n = phân vùng mới
  d = xóa phân vùng
  p = in bảng
  w = ghi thay đổi
  r = menu khôi phục
  q = thoát không lưu

# --- fdisk (tương tác) ---
fdisk /dev/sdb
  o = bảng MBR mới
  n = phân vùng mới
  d = xóa phân vùng
  t = thay đổi loại
  p = in bảng
  w = ghi thay đổi

Lưu ý cuối trước khi phân vùng

Luôn kiểm tra lại ổ đĩa mục tiêu với lsblk hoặc fdisk -l trước khi chạy bất kỳ lệnh phá hủy nào. Các thao tác phân vùng hoạt động ở cấp block — không có tính năng hoàn tác. Trên các hệ thống production, tôi luôn snapshot đĩa hoặc chạy lệnh dd backup nhanh vài megabyte đầu tiên (nơi lưu bảng phân vùng) trước khi thực hiện thay đổi:

# Backup 10MB đầu tiên (bao gồm MBR + GPT headers)
sudo dd if=/dev/sdb of=~/sdb_header_backup.img bs=1M count=10

# Khôi phục nếu có sự cố
sudo dd if=~/sdb_header_backup.img of=/dev/sdb bs=1M count=10

Với ba công cụ này trong tay cùng sự hiểu biết rõ ràng về khi nào dùng cái nào, việc phân vùng đĩa sẽ không còn là nguồn lo lắng nữa mà trở thành một công việc server thường ngày.

Share: