Nhảy tới nội dung

Một bài viết được gắn thẻ "volume"

Xem tất cả Thẻ

· Một phút để đọc
ManhPT

Mình đã có một bài viết về cách tăng dung lượng phân vùng ổ cứng trên linux. Nhưng có một trường hợp mà bài viết chưa nói đến là khi bạn sử dụng LVM. LVM cho phép bạn tạo, thay đổi dung lượng hoặc xóa phân vùng trong hệ thống mà không cần phải khởi động lại. Để tăng dung lượng cho LVM volume thì bạn có thể làm theo các bước sau:

1. Xác định phân vùng đĩa cứng chứa LVM volume

Trước tiên cần sử dụng lệnh lsblk để xem cấu trúc các phân vùng và ổ đĩa hiện tại.

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 30G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 29G 0 part
├─rhel-root 253:0 0 26.9G 0 lvm /
└─rhel-swap 253:1 0 2.1G 0 lvm [SWAP]

Có thể thấy là ta có một lvm volumerhel-root trong phân vùng /dev/vda2.

$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/vda2 rhel lvm2 a-- <29.00g 0

2. Mở rộng ổ đĩa vật lý (disk) và phân vùng (partition)

Bạn có thể bỏ qua bước này để đến thẳng 3 nếu phân vùng chứa ổ LVM của bạn đã được tự động tăng dung lượng (tự động hoặc ai đó đã tăng hộ bạn).

Như ở step 1, câu lệnh lsblk cho thấy rhel-root nằm trong ổ đĩa vật lý vda có dung lượng 30G. Mình sẽ tăng dung lượng của ổ đĩa này lên 40G (ổ đĩa cứng ảo - cách tăng dung lượng của một ổ đĩa cứng ảo sẽ tùy thuộc vào IaaS provider hoặc công cụ ảo hóa).

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 40G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 29G 0 part
├─rhel-root 253:0 0 26.9G 0 lvm /
└─rhel-swap 253:1 0 2.1G 0 lvm [SWAP]

Sau khi sử dụng lệnh lsblk một lần nữa thì ta thấy dung lượng của vda đã tăng lên thành 40G. Tiếp tục sử dụng lệnh growpart để mở rộng dung lượng cho phân vùng vda2 đang chứa rhel-root.

$ sudo growpart /dev/vda 2
CHANGED: partition=2 start=2099200 old: size=18872320 end=20971520 new: size=60815327,end=62914527

Sau khi growpart thì dung lượng của vda2 sẽ tăng lên xấp xỉ dung lượng của vda. Do có 1 phân vùng boot là vda1 đã chiếm 1G nên dung lượng còn lại thuộc về vda2 là 39G.

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 40G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 39G 0 part
├─rhel-root 253:0 0 26.9G 0 lvm /
└─rhel-swap 253:1 0 2.1G 0 lvm [SWAP]

Bây giờ ta đã đủ điều kiện để có thể tăng dung lượng cho ổ LVM là rhel-root.

3. Tăng dung lượng cho LVM volume

Resize volume vật lý:

$ sudo pvresize /dev/vda2
Physical volume "/dev/vda2" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized

$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/vda2 rhel lvm2 a-- <39.00g 10.00g

Kiểm tra dung lượng được cấu hình cho volume group:

$ sudo vgs
VG #PV #LV #SN Attr VSize VFree
rhel 1 2 0 wz--n- <39.00g 10.00g

Bây giờ là lệnh quan trọng nhất, resize ổ LVM với lvextend.

$ sudo lvextend -l +100%FREE /dev/mapper/rhel-root
Size of logical volume rhel/root changed from <26.93 GiB (6893 extents) to <36.93 GiB (9453 extents).
Logical volume rhel/root successfully resized.

Bạn có thể thay thế +100%FREE bằng giá trị khác để phù hợp với nhu cầu. Ví dụ bạn muốn tăng dung lượng thêm 10GB thì có thể thay thế bằng +10G.

4. Cập nhật filesystem để nhận diện dung lượng mới

Nếu kiểm tra dung lượng thực tế được sử dụng bởi filesystem thì có thể thấy nó vẫn hiển thị dung lượng cũ.

$ df -hT | grep mapper
/dev/mapper/rhel-root xfs 27G 1.9G 26G 8% /

Để filesystem có thể nhận diện dung lượng đã thay đổi thì ta chỉ cần sử dụng resize2fs đối với ext4xfs_growfs đối với xfs.

Với ext4:

$ sudo resize2fs /dev/mapper/rhel-root
resize2fs 1.45.5 (07-Jan-2020)
Filesystem at /dev/mapper/rhel-root is mounted on /; on-line resizing required
old_desc_blocks = 60, new_desc_blocks = 121
The filesystem on /dev/mapper/rhel-root is now 253365248 (4k) blocks long.

Với xfs:

$ sudo xfs_growfs /
meta-data=/dev/mapper/rhel-root isize=512 agcount=4, agsize=1764608 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=7058432, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=3446, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 7058432 to 9679872

Để cho chắc thì bạn có thể kiểm tra lại với câu lệnh lsblk.

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 40G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 39G 0 part
├─rhel-root 253:0 0 36.9G 0 lvm /
└─rhel-swap 253:1 0 2.1G 0 lvm [SWAP]

Vậy là xong.

· Một phút để đọc
ManhPT

Trên các hệ thống hạ tầng cloud, sau khi sizing (bổ sung dung lượng) ổ đĩa ảo (volume), ta cần phải thực hiện thêm một vài lệnh đặc thù trên từng phân vùng ổ đĩa (partition) để hệ thống thực sự nhận diện được dung lượng mới thêm.

Chú ý: Trước khi cập nhật dụng lượng trên ổ đĩa có chứa dữ liệu quan trọng thì ta nên backup dữ liệu hoặc tạo snapshot cho ổ đĩa đó trên các hệ thống cloud mà có hỗ trợ tính năng snapshot.

Các bước cơ bản

Sau đó, thực hiện cập nhật dung lượng phân vùng theo các bước sau:

  1. Việc tăng thêm dung lượng cho ổ đĩa ảo không đồng thời tăng dung lượng cho phân vùng bên trong nó. Do đó, ta cần phải kiểm tra xem phân vùng cần tăng thêm dung lượng có nằm bên trong ổ đĩa vừa được bổ sung dung lượng hay không.
  2. Thực hiện các câu lệnh đặc thù để tăng dung lượng cho các phân vùng dựa trên định dạng của phân vùng đó.

Nội dung bài viết hiện tại chỉ hướng dẫn cách tăng dung lượng phân vùng cho các sử dụng định dạng: xfs, ext4 trên các máy chủ ảo của AWS, GCP, Azure hoặc VMWare.

Các bước chi tiết

Trong ví dụ sau, giả sử bạn đã tăng dung lượng ổ đĩa...

1. Kiểm tra định dạng của phân vùng cần tăng bằng câu lệnh df -hT

$ df -hT

Sau đây là kết quả mà bạn sẽ nhận được

$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/xvda1 ext4 8.0G 1.9G 6.2G 24% /
/dev/xvdf1 xfs 8.0G 45M 8.0G 1% /data

2. Kiểm tra phân vùng cần tăng dung lượng có nằm trong ổ đĩa đã được bổ sung dung lượng không bằng lệnh lsblk

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 16G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 30G 0 disk
└─xvdf1 202:81 0 8G 0 part /data

Từ kết quả trên ta thấy:

  • Ổ đĩa /dev/xvda có 1 phân vùng là /dev/xvda1. Trong khi dung lượng ổ đĩa là 16G thì dung lượng phân vùng chỉ có 8G nên có thể tăng dung lượng cho phân vùng /dev/xvda1.
  • Ổ đĩa /dev/xvdf có 1 phân vùng là /dev/xvdf1. Trong khi dung lượng ổ đĩa là 30G thì dung lượng phân vùng chỉ có 8G nên có thể tăng dung lượng cho phân vùng /dev/xvdf1.

3. Thực hiện tăng dung lượng phân vùng bằng lệnh growpart

ubuntu@ip-172-31-13-xxx:~$ sudo growpart /dev/xvda 1
ubuntu@ip-172-31-13-xxx:~$ sudo growpart /dev/xvdf 1

Nếu phân vùng có định dạng xfs, dùng lệnh xfs_growfs:

ubuntu@ip-172-31-13-xxx:~$ sudo xfs_growfs -d /
ubuntu@ip-172-31-13-xxx:~$ sudo xfs_growfs -d /data

Nếu xfs_growfs chưa tồn tại thì cài đặt bằng cách:

for debian/ubuntu-based
ubuntu@ip-172-31-13-xxx:~$ sudo apt-get install xfs_growfs
for centos/rehl-based
ubuntu@ip-172-31-13-xxx:~$ sudo yum install xfs_growfs

Nếu phân vùng có định dạng ext4, dùng lệnh resize2fs:

ubuntu@ip-172-31-13-xxx:~$ sudo resize2fs /dev/xvda1
ubuntu@ip-172-31-13-xxx:~$ sudo resize2fs /dev/xvdf1

Kiểm tra lại kết quả thay đổi với df -h

$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 16G 1.9G 14G 12% /
/dev/xvdf1 30G 45M 30G 1% /data

Bài viết có tham khảo và dịch lại từ: Extending a Linux file system after resizing a volume - Amazon Elastic Compute Cloud