Hướng dẫn Cloud VPS

Hướng dẫn mở rộng ổ đĩa Linux, nhận đủ dung lượng VPS

Huỳnh Long Đăng 6 ngày trước 11 0

Vừa nâng cấp ổ cứng VPS mà df -h vẫn báo dung lượng cũ? Dung lượng không mất, nó nằm ở cuối ổ chưa được chia. Bài này hướng dẫn mở rộng ổ đĩa Linux bằng vài lệnh có sẵn, ảnh chụp thật trước và sau, không cài lại máy, không khởi động lại.

Bạn vừa tăng dung lượng ổ cứng VPS Linux, hoặc thuê gói ổ lớn, nhưng gõ df -h thì máy vẫn báo dung lượng cũ? Phần dung lượng đó không mất đi đâu cả. Nó đang nằm ở cuối ổ đĩa, chỉ là chưa được chia cho hệ thống dùng. Bài này hướng dẫn mở rộng ổ đĩa Linux bằng vài lệnh có sẵn, mất vài phút, không phải cài lại máy và không cần khởi động lại. Ảnh trong bài chụp thật trên một VPS Ubuntu 22.04 vừa nâng ổ từ 30GB lên 40GB, trước và sau khi mở rộng.

Vì sao phải mở rộng ổ đĩa Linux sau khi nâng cấp VPS?

Trên Linux, dung lượng ổ đĩa phải đi qua ba lớp rồi mới tới tay bạn:

  1. Ổ đĩa (disk): toàn bộ dung lượng của gói VPS, ví dụ 40GB.
  2. Phân vùng (partition): phần của ổ được "khoanh" ra để dùng. Nhiều máy còn có thêm một lớp tên là LVM nằm bên trong phân vùng, giúp chia dung lượng linh hoạt hơn.
  3. Hệ thống tệp (filesystem) như ext4 hay XFS: nơi thật sự chứa file của bạn. Lệnh df -h đo ở lớp này.

VPS được dựng từ một bản cài sẵn (image) có kích thước cố định, chẳng hạn 20GB. Lúc tạo máy, có bản được giãn ra lấp kín ổ, có bản thì không. Còn khi bạn nâng cấp ổ về sau, hạ tầng chỉ nới được lớp ngoài cùng. Các lớp bên trong giữ nguyên kích thước cũ cho tới khi bạn bảo chúng nới ra. Trên máy thử của bài, nâng ổ xong máy tự khởi động lại, ổ đã thành 40GB nhưng hệ thống vẫn chỉ dùng 26GB.

Hình dung thế này: mảnh đất của bạn vừa được cấp thêm, nhưng hàng rào vẫn đứng ở chỗ cũ. Ngôi nhà chỉ xây được bên trong hàng rào. Muốn dùng phần đất mới, bạn phải dời hàng rào ra trước, rồi mới nới ngôi nhà. Máy có LVM thì giữa hàng rào và ngôi nhà còn một tấm bản đồ chia lô: dời rào xong phải cập nhật bản đồ, giao phần đất mới cho lô có nhà, rồi mới nới nhà.

Nói gọn: dung lượng thừa đã có sẵn trên ổ. Việc của bạn là nới lần lượt phân vùng, LVM (nếu có) và hệ thống tệp, đi từ ngoài vào trong.

Chuẩn bị trước khi làm

  • Sao lưu dữ liệu quan trọng. Làm đúng thứ tự thì các lệnh chỉ nới vào phần trống, không đụng tới file đang có. Dù vậy, lệnh ở Bước 3 có ghi lại bảng phân vùng của ổ hệ thống, nên hãy chép dữ liệu quan trọng ra nơi khác trước. Nếu dịch vụ VPS của bạn có tính năng snapshot, tạo thêm một bản ngay trước khi làm: đó là cách quay lại nhanh nhất khi gõ nhầm, nhưng không thay được bản sao lưu. Chưa rõ hai thứ này khác nhau ở đâu thì xem bài backup và snapshot.
  • Đăng nhập bằng quyền root. Bạn có thể vào bằng SSH theo hướng dẫn đăng nhập vào VPS, hoặc mở Console ngay trên trang quản lý VPS. Nếu tài khoản của bạn không phải root, gõ sudo -i một lần để chuyển sang quyền root, sau đó chạy nguyên văn các lệnh trong bài.
  • Gõ trên Console thì gõ chậm. Tắt bộ gõ tiếng Việt trước, đối chiếu từng ký tự với bài rồi mới bấm Enter, nhất là các dấu +, % và chữ hoa. Lệnh dài thì vào bằng SSH để dán cho chắc.
  • Chọn giờ vắng khách khi nâng cấp ổ. Trên máy thử, lúc nâng dung lượng trên trang quản lý, máy tự khởi động lại một lần. Còn các lệnh trong bài thì chạy được khi máy đang chạy, không cần tắt website.

Bước 1: Kiểm tra ổ đĩa đang thừa bao nhiêu

Gõ hai lệnh sau:

lsblk -e7
df -h /

Phần -e7 chỉ để ẩn các dòng loop (ổ ảo của ứng dụng snap trên Ubuntu, cột MAJ:MIN của chúng bắt đầu bằng số 7) cho dễ nhìn. Gõ lsblk trơn cũng được, cứ bỏ qua các dòng loop.

Kết quả lsblk và df -h trên VPS Linux: ổ đĩa 40G nhưng phân vùng và hệ thống tệp chỉ 26G

Cách đọc kết quả trên máy thử:

  • Dòng sda loại disk báo 40G: ổ đĩa đã nhận đủ dung lượng sau khi nâng cấp.
  • Dòng sda4 loại part chỉ có 26G: phân vùng chứa hệ thống vẫn ở kích thước cũ.
  • Dòng vg0-lv--0 loại lvm gắn vào /: máy này dùng LVM.
  • df -h / báo cột Size là 26G: hệ thống mới dùng được chừng đó.
  • Dòng sr0 loại rom là ổ CD ảo, bỏ qua.

Lấy dung lượng dòng disk trừ tổng các phân vùng là ra phần đang bỏ trống. Máy thử có sda1 1M, sda2 2G, sda3 2G và sda4 26G, tức còn khoảng 10GB ở cuối ổ. Bản lsblk cũ hơn ghi tên cột là MOUNTPOINT, bản mới ghi MOUNTPOINTS, nội dung như nhau.

Trước khi đi tiếp, ghi lại ba điều:

  1. Máy có dùng LVM không. Thấy dòng lvm nằm dưới phân vùng như trên là có. Nếu dấu / gắn thẳng vào một dòng part (ví dụ vda1) thì không.
  2. Hệ thống tệp là ext4 hay XFS. Gõ df -hT / rồi xem cột Type.
  3. Máy có LVM thì xem thêm cột VFree khi gõ vgs. Lớn hơn 0 nghĩa là bên trong LVM đã có sẵn chỗ trống chưa dùng. Máy tự cài bằng bộ cài Ubuntu Server hay gặp cảnh này.

Từ ba điều đó, chọn đường đi theo bảng sau:

Bạn thấy gìLàm bước nào
Có LVM, dòng disk lớn hơn tổng các phân vùngBước 2, 3, rồi Bước 4 phần có LVM. lvextend gom luôn cả VFree nếu có
Có LVM, VFree lớn hơn 0, dòng disk không dưChỉ chạy lệnh lvextend ở Bước 4, bỏ Bước 2, 3 và pvresize
Không LVM, hệ thống tệp ext4Bước 2, 3, rồi resize2fs ở Bước 4
Không LVM, hệ thống tệp XFSBước 2, 3, rồi xfs_growfs / ở Bước 4
Dòng disk bằng tổng các phân vùng, VFree bằng 0Không có gì để nới. Kiểm tra lại việc nâng cấp đã xong chưa

Nói gọn: chỗ trống có thể nằm ở cuối ổ (dòng disk dư ra), bên trong LVM (VFree), hoặc cả hai. Máy thử thuộc dòng đầu tiên của bảng.

Bước 2: Cài công cụ growpart nếu máy chưa có

growpart là công cụ nới một phân vùng ra phần trống liền phía sau nó. Kiểm tra máy đã có chưa:

command -v growpart

Nếu lệnh in ra một đường dẫn, ví dụ /usr/bin/growpart, là dùng được ngay. Nếu không in gì, cài theo hệ điều hành của máy:

# Ubuntu, Debian
apt update && apt install -y cloud-guest-utils

# AlmaLinux, Rocky Linux
dnf install -y cloud-utils-growpart

Có sẵn hay phải cài tuỳ bản cài sẵn của từng nơi. Trên các máy thử của bài, Ubuntu 22.04 và 24.04 có sẵn growpart, còn Debian 11 và AlmaLinux 8 phải cài thêm. Cài xong gõ lại command -v growpart để chắc chắn.

Máy còn chạy CentOS 7 thì nên tính chuyện đổi hệ điều hành trước. CentOS 7 đã hết vòng đời hỗ trợ từ ngày 30/06/2024, kho cài gói mặc định của nó không còn hoạt động, nên lệnh cài thường báo lỗi. AlmaLinux hoặc Rocky Linux là hai lựa chọn gần nó nhất.

Bước 3: Nới phân vùng bằng growpart

Cú pháp là growpart <ổ đĩa> <số phân vùng>. Tên ổ và số phân vùng phải cách nhau bằng dấu cách. Cả hai lấy từ kết quả lsblk ở Bước 1. Phân vùng cần chọn là dòng part có dấu / ở cột MOUNTPOINT(S), hoặc dòng part có dòng lvm ngay bên dưới. Đừng chọn theo số lớn nhất: nhiều máy Ubuntu có vda1 chứa hệ thống, còn vda14, vda15 chỉ là phân vùng khởi động nhỏ.

lsblk hiệnLệnh cần gõ
sda4growpart /dev/sda 4
vda1growpart /dev/vda 1
nvme0n1p2growpart /dev/nvme0n1 2

Máy thử là sda4, nên lệnh là:

growpart /dev/sda 4
Lệnh growpart /dev/sda 4 báo CHANGED, phân vùng đã được nới tới cuối ổ đĩa

Kết quả trên máy thử:

CHANGED: partition=4 start=8392704 old: size=54521823 end=62914527 new: size=75493343 end=83886047

Dòng bắt đầu bằng CHANGED là thành công. Hai con số size sau chữ old và new là kích thước phân vùng trước và sau khi nới, tính bằng sector (trên máy thử, mỗi sector 512 byte). Đổi ra là từ khoảng 26 lên khoảng 36 GiB; lsblk tính theo 1024 nên ghi là 26G và 36G. Lúc này gõ df -h vẫn chưa thấy gì thay đổi. Giống chuyện mảnh đất lúc nãy: hàng rào đã dời ra, còn ngôi nhà thì chưa nới.

Bước 4: Nới phần bên trong để hệ thống dùng được

Máy có dùng LVM

Chạy hai lệnh:

pvresize /dev/sda4
lvextend -r -l +100%FREE /dev/mapper/vg0-lv--0
  • pvresize báo cho LVM biết phân vùng bên dưới đã lớn hơn, tức cập nhật tấm bản đồ chia lô. Thay /dev/sda4 bằng đúng phân vùng bạn vừa nới ở Bước 3.
  • lvextend -l +100%FREE dồn toàn bộ chỗ trống của LVM vào phần LVM chứa hệ thống. Tham số -r tự nới luôn hệ thống tệp, dù là ext4 hay XFS, nên bạn không phải nhớ thêm lệnh riêng.
  • Đường dẫn ở cuối lệnh lấy y nguyên từ cột Filesystem khi gõ df -h / ở Bước 1. Tên trên máy bạn sẽ khác máy thử; máy cài bằng bộ cài Ubuntu Server thường có dạng /dev/mapper/ubuntu--vg-ubuntu--lv. Tên có hai dấu gạch -- là đúng, đừng sửa thành một.
Lệnh pvresize và lvextend -r trên VPS Linux dùng LVM, hệ thống tệp ext4 được nới cùng lúc

Trên máy thử, lvextend báo phần LVM chứa hệ thống đổi từ <26.00 GiB lên <36.00 GiB, kèm dòng successfully resized. Vì hệ thống tệp là ext4, tham số -r tự gọi resize2fs. Dòng on-line resizing required nghĩa là nới ngay khi máy đang chạy. Dòng cuối The filesystem … is now … blocks long báo việc nới đã xong.

Máy thuộc dòng thứ hai của bảng ở Bước 1 (chỉ có VFree) thì bỏ pvresize, chạy riêng lệnh lvextend là đủ.

Máy không dùng LVM

Phân vùng đã nới ở Bước 3 chứa thẳng hệ thống tệp, nên chỉ cần một lệnh. Chọn theo cột Type ở Bước 1:

# hệ thống tệp ext4: ghi tên phân vùng
resize2fs /dev/vda1

# hệ thống tệp XFS: ghi điểm gắn kết, không ghi tên phân vùng
xfs_growfs /

Thay /dev/vda1 bằng phân vùng của bạn. Với XFS, dấu / ở đây chính là thư mục gốc, chỗ hệ thống tệp đang "cắm" vào.

Cột Type ra một giá trị khác ext4 và xfs (ví dụ btrfs) thì dừng lại, hỏi bộ phận hỗ trợ trước khi làm tiếp.

Bước 5: Kiểm tra lại dung lượng

df -h /
lsblk -e7
Sau khi mở rộng ổ đĩa Linux, df -h báo dung lượng tăng từ 26G lên 36G

Cột Size của / đã lên 36G, đúng bằng 26G cũ cộng 10GB vừa nâng (máy có VFree thì cộng thêm phần đó). Trong lsblk, cả sda4 lẫn vg0-lv--0 cũng báo 36G. Cột Used vẫn 3.6G như trước: dữ liệu cũ còn nguyên, máy không phải khởi động lại.

Trên một máy thử khác chạy Debian 11, dùng LVM với hệ thống tệp XFS, cùng chuỗi lệnh đưa ổ gốc từ 19G lên 29G. Riêng máy đó phải cài growpart trước ở Bước 2.

Gặp lỗi thì xử lý thế nào

Thông báo bạn thấyNghĩa làCách xử lý
NOCHANGE: partition 1 is size … it cannot be grownSau phân vùng không còn chỗ trốngXem lại lsblk. Dòng disk bằng tổng các phân vùng là ổ đã dùng hết. Nếu dòng disk vẫn lớn hơn mà vẫn NOCHANGE, xem dòng cuối bảng
The filesystem is already … blocks long. Nothing to do!Hệ thống tệp đã lấp kín phân vùngThường do chạy Bước 4 trước Bước 3. Nới phân vùng trước rồi chạy lại
Size of logical volume … unchanged from … (vẫn kèm dòng successfully resized)LVM không còn chỗ trống để giao thêmChưa làm Bước 3 hoặc quên pvresize. Làm hai việc đó rồi chạy lại lvextend
Invalid argument for --extents: …Gõ sai ký tự trong +100%FREEĐối chiếu lại dấu +, % và chữ hoa. Tắt bộ gõ tiếng Việt rồi gõ lại
growpart: command not foundMáy chưa có công cụCài theo Bước 2
no tools available to resize disk with 'gpt'Ổ dùng bảng phân vùng GPT (kiểu máy mới hay dùng) nhưng hệ điều hành đời cũ thiếu công cụ đi kèmCài thêm gói gdisk, trong đó có lệnh sgdisk mà growpart cần, rồi chạy lại Bước 3. Bản mới hiếm khi gặp lỗi này
lsblk vẫn báo dung lượng ổ cũ dù đã nâng cấpHệ điều hành chưa nhận kích thước mớiKhởi động lại VPS trên trang quản lý rồi kiểm tra lại từ Bước 1
Phân vùng chứa / không nằm cuối ổgrowpart chỉ nới vào khoảng trống liền phía sau. Ca hay gặp là phân vùng swap nằm ngay sau phân vùng hệ thống: trong lsblk, dòng ghi [SWAP] mang số lớn hơn phân vùng chứa / (ví dụ sda1 chứa /, sda5 là [SWAP])Đừng tự xoá hay dời phân vùng khác. Gửi kèm kết quả lsblk khi mở yêu cầu hỗ trợ để được hướng dẫn tiếp

NOCHANGE, Nothing to do! và unchanged không phải lỗi hỏng máy: lệnh chỉ báo không có gì để làm và không thay đổi gì. Trên máy thử, cả ba thông báo đều chạy ra đúng như trong bảng.

Câu hỏi thường gặp

Mở rộng ổ đĩa Linux như trong bài có làm mất dữ liệu không?

Nếu làm đúng thứ tự, các lệnh chỉ nới vào phần trống, file đang có không bị đụng tới. Vì lệnh có ghi lại bảng phân vùng của ổ hệ thống, vẫn nên sao lưu trước khi làm.

Có phải khởi động lại VPS sau khi mở rộng không?

Không. ext4 và XFS đều mở rộng được khi đang chạy, dung lượng mới hiện ngay trong df -h. Chỉ khi lsblk chưa nhận kích thước ổ mới sau lúc nâng cấp thì mới cần khởi động lại một lần.

Ubuntu, Debian và AlmaLinux làm có khác nhau không?

Các bước giống nhau. Khác nhau chủ yếu ở tên gói cài growpart (Bước 2) và loại hệ thống tệp. Nếu máy dùng LVM, lệnh lvextend -r tự xử lý cả ext4 lẫn XFS. Rocky Linux dùng cùng tên gói với AlmaLinux.

Muốn thu nhỏ ổ lại thì có làm ngược được không?

Không nên tự làm. Thu nhỏ ext4 chứa hệ thống phải làm khi ổ không được gắn vào, tức phải khởi động từ chế độ cứu hộ. XFS gần như không thu nhỏ được. Nếu cần máy nhỏ hơn, cách an toàn là tạo máy mới rồi chuyển dữ liệu sang.

Gắn thêm một ổ thứ hai thì có làm theo bài này không?

Không. Ổ thứ hai hiện ra như một ổ riêng (ví dụ sdb hoặc vdb) chưa có phân vùng nào. Bạn phải tạo phân vùng, định dạng rồi gắn nó vào một thư mục. Đó là một quy trình khác, không dùng growpart.

Thế là xong việc mở rộng ổ đĩa Linux: phần dung lượng bạn trả thêm đã về tay hệ thống, máy không phải cài lại. Nếu bạn đang thuê Cloud VPS tại cloudmoon.net mà chưa chắc máy mình thuộc trường hợp nào, hãy gửi kèm kết quả lsblk khi mở yêu cầu hỗ trợ với CloudMoon để được hướng dẫn tiếp. Dùng VPS Windows thì xem bài mở rộng ổ đĩa Windows. Còn nếu ổ đầy vì rác chứ không phải thiếu dung lượng, hãy đọc VPS bị đầy ổ cứng trước khi nghĩ tới chuyện nâng cấp.

Nguồn tham khảo

Bài viết liên quan

Bình luận (0)

Bạn cần đăng nhập để bình luận.

Chưa có bình luận nào. Hãy là người đầu tiên!

Zalo