Thursday, November 21, 2024

Extend Linux LVM Logical Volume

-

1. Tổng quan.

Quy trình này mô tả cách extend phân vùng đĩa chính (root) trên hệ thống Linux bằng cách sử dụng LVM (Logical Volume Manager). Điều này bao gồm việc extend phân vùng vật lý, cập nhật volume group và logical volume, sau đó thực hiện thay đổi trên filesystem.

Quy trình này thường cần thiết khi hệ thống cần thêm dung lượng lưu trữ mà không cần cài đặt lại.

2. Nâng dung lượng cho máy ảo truước.

Giả sử mình sử dụng ảo hóa ESXI đã Join vào vCenter và đã có 1 máy ảo với dung lượng /dev/sda là 50G nhu dưới.

shell> lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0   47M  1 loop /snap/snapd/16292
loop1                       7:1    0 79.9M  1 loop /snap/lxd/22923
loop2                       7:2    0   62M  1 loop /snap/core20/1587
sda                         8:0    0   50G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   48G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   24G  0 lvm  /
sdb                         8:16   0   30G  0 disk
sdc                         8:32   0   30G  0 disk
sdd                         8:48   0   30G  0 disk
sde                         8:64   0   30G  0 disk
sdf                         8:80   0   30G  0 disk
sr0                        11:0    1 1024M  0 rom

Tắt máy ảo và vào vCenter chọn máy ảo cần nâng dung lượng và tiến hành nâng dung lượng ổ đĩa /dev/sda từ 50G lên 100G.

Bật lại máy ảo khi nâng dung lượng.

3. Quy trình làm extend.

Sau khi mở lại máy ảo, bạn hãy xem lại thông tin về các thiết bị lưu trữ và các phân vùng bằng lệnh lsblk ta có đĩa chính (sda) có tổng dung lượng là 100GB, nhưng phân vùng sda3 chỉ có 48GB và logical volume ubuntu-lv có 24GB. Điều này cho thấy phân vùng chưa sử dụng toàn bộ dung lượng của đĩa.

shell> lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0 79.9M  1 loop /snap/lxd/22923
loop1                       7:1    0   47M  1 loop /snap/snapd/16292
loop2                       7:2    0   62M  1 loop /snap/core20/1587
sda                         8:0    0  100G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   48G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   24G  0 lvm  /
sdb                         8:16   0   30G  0 disk
sdc                         8:32   0   30G  0 disk
sdd                         8:48   0   30G  0 disk
sde                         8:64   0   30G  0 disk
sdf                         8:80   0   30G  0 disk
sr0                        11:0    1 1024M  0 rom

Sử dụng công cụ parted để thay đổi kích thước phân vùng thứ 3 (sda3), parted /dev/sdaresizepart 3giúp mở rộng nó để sử dụng toàn bộ dung lượng đĩa còn trống. Sau khi thực hiện lệnh resizepart, phân vùng sda3 đã được extend từ 48GB lên 98GB, chiếm toàn bộ dung lượng trống còn lại trên đĩa.

shell> parted /dev/sda
GNU Parted 3.4
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) resizepart 3
End?  [53.7GB]? -0
(parted) print
Model: VMware Virtual disk (scsi)
Disk /dev/sda: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name  Flags
 1      1049kB  2097kB  1049kB                     bios_grub
 2      2097kB  2150MB  2147MB  ext4
 3      2150MB  107GB   105GB

(parted) quit
Information: You may need to update /etc/fstab.

Dùng lệnh lsblk kiểm tra lại thì thấy /dev/sda3 đã được extend lên 98G thay cho 48G như truước

shell> lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0 79.9M  1 loop /snap/lxd/22923
loop1                       7:1    0   47M  1 loop /snap/snapd/16292
loop2                       7:2    0   62M  1 loop /snap/core20/1587
sda                         8:0    0  100G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   98G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   24G  0 lvm  /
sdb                         8:16   0   30G  0 disk
sdc                         8:32   0   30G  0 disk
sdd                         8:48   0   30G  0 disk
sde                         8:64   0   30G  0 disk
sdf                         8:80   0   30G  0 disk
sr0                        11:0    1 1024M  0 rom

Lệnh pvresize /dev/sda3sẽ cập nhật physical volume để phản ánh thay đổi kích thước của phân vùng sda3. Lệnh này cho phép LVM nhận biết rằng physical volume (PV) đã được extend. Lúc này, hệ thống biết rằng PV có dung lượng lớn hơn và có thể sử dụng dung lượng trống mới.

shell> pvresize /dev/sda3
  Physical volume "/dev/sda3" changed
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized

Để hiển thị thông tin chi tiết về logical volume (ubuntu-lv) bạn sử dụng lệnh lvdisplay. Logical volume hiện tại vẫn còn 24GB, chưa sử dụng thêm dung lượng từ việc mở rộng PV. Điều này đòi hỏi thực hiện bước tiếp theo để extend logical volume.

shell> lvdisplay
  --- Logical volume ---
  LV Path                /dev/ubuntu-vg/ubuntu-lv
  LV Name                ubuntu-lv
  VG Name                ubuntu-vg
  LV UUID                529HEc-d9o4-Qi6k-yKDk-lE07-xyan-Ua1hIS
  LV Write Access        read/write
  LV Creation host, time ubuntu-server, 2024-05-10 02:34:31 +0000
  LV Status              available
  # open                 1
  LV Size                <24.00 GiB
  Current LE             6143
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

Mở rộng logical volume ubuntu-lv để sử dụng toàn bộ dung lượng trống mới từ PV bằng lệnh lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv. Sau khi chạy lệnh này logical volume đã được extend từ 24GB lên 98GB, sử dụng toàn bộ dung lượng có sẵn từ physical volume sda3.

shell> lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
  Size of logical volume ubuntu-vg/ubuntu-lv changed from <24.00 GiB (6143 extents) to <98.00 GiB (25087 extents).
  Logical volume ubuntu-vg/ubuntu-lv successfully resized.

Hiển thị thông tin về dung lượng của filesystem hiện tại bằng lệnh df -h bạn thấy mặc dù logical volume đã được extend, nhưng filesystem vẫn còn kích thước cũ là 24GB.

shell> df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              794M  1.2M  793M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   24G  7.6G   15G  34% /
tmpfs                              3.9G     0  3.9G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  250M  1.6G  14% /boot
tmpfs                              794M  4.0K  794M   1% /run/user/0

Sử dụng lệnh resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv để mở rộng filesystem để khớp với kích thước mới của logical volume. Lệnh này đã mở rộng filesystem trên phân vùng ubuntu-lv lên kích thước mới (98GB), đồng bộ với thay đổi trên logical volume.

shell> resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
resize2fs 1.46.5 (30-Dec-2021)
Filesystem at /dev/mapper/ubuntu--vg-ubuntu--lv is mounted on /; on-line resizing required
old_desc_blocks = 3, new_desc_blocks = 13
The filesystem on /dev/mapper/ubuntu--vg-ubuntu--lv is now 25689088 (4k) blocks long.

Xác nhận filesystem đã được extend sau khi chạy lệnh resize2fs bằng lệnh df -h.


shell> df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                              794M  1.2M  793M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   97G  7.6G   85G   9% /
tmpfs                              3.9G     0  3.9G   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          2.0G  250M  1.6G  14% /boot
tmpfs                              794M  4.0K  794M   1% /run/user/0

Xác nhận filesystem đã được extend sau khi chạy lệnh resize2fs bằng lệnh lsblk.

shell> lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0                       7:0    0 79.9M  1 loop /snap/lxd/22923
loop1                       7:1    0   47M  1 loop /snap/snapd/16292
loop2                       7:2    0   62M  1 loop /snap/core20/1587
sda                         8:0    0  100G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    2G  0 part /boot
└─sda3                      8:3    0   98G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   98G  0 lvm  /
sdb                         8:16   0   30G  0 disk
sdc                         8:32   0   30G  0 disk
sdd                         8:48   0   30G  0 disk
sde                         8:64   0   30G  0 disk
sdf                         8:80   0   30G  0 disk
sr0                        11:0    1 1024M  0 rom

4. Trick để VMWare nhận biết máy ảo tăng dung lượng khi extend dung lượng mà không cần reboot máy ảo.

Đoạn script này sẽ quét lại các thiết bị SCSI trên VMware để phát hiện thay đổi dung lượng, nhưng nó không tự động mở rộng mức sử dụng dung lượng (filesystem resizing) của các đĩa ảo trong máy ảo.

Để hoàn thành tự động việc mở rộng này, bạn cần làm tương tự các bước thực hiện mở rộng volume group (VG), logical volume (LV) và cuối cùng là filesystem sau khi quét lại thiết bị SCSI. Điều này thường bao gồm các lệnh như pvresize, lvextendresize2fs hoặc xfs_growfs (tuỳ thuộc vào filesystem sử dụng).

Cron Job tự động hóa.

Đoạn script sẽ được thiết lập trong một cron job để tự động chạy theo lịch và thực hiện tất cả các bước từ quét lại thiết bị, đến mở rộng filesystem, nếu có sự thay đổi về dung lượng.

Quét các host SCSI.

for host in `ls /sys/class/scsi_host`
do
    echo ${host}
    echo "- - -" > "/sys/class/scsi_host/${host}/scan"
done

– /sys/class/scsi_host: Liệt kê tất cả các host SCSI hiện có trong hệ thống. Một host SCSI là một phần của hệ thống điều khiển để kết nối với các thiết bị SCSI (như ổ cứng SCSI hoặc bộ điều khiển lưu trữ).

– echo “- – -” > “/sys/class/scsi_host/${host}/scan”: Đây là lệnh gửi chuỗi `”—“` vào file `scan` của từng host SCSI. Chuỗi `”—“` yêu cầu hệ thống quét lại tất cả các kênh, ID và LUNs (Logical Unit Numbers), tức là nó sẽ tìm kiếm bất kỳ thiết bị lưu trữ SCSI mới nào được gắn vào các host này.

Rescan các thiết bị SCSI.

for device in `ls /sys/class/scsi_device`
do
     echo "$device"
     name=$(echo ${device} | sed "s/:/\\\:/g")
     echo 1 > /sys/class/scsi_device/$name/device/rescan
done
  • Trong đó:
    • ls /sys/class/scsi_device: Liệt kê tất cả các thiết bị SCSI hiện có trong hệ thống.
    • sed "s/:/\\\:/g": Thay thế các dấu hai chấm (:) trong tên thiết bị bằng dấu hai chấm thoát (\:) để xử lý chính xác tên thiết bị trong câu lệnh sau. Điều này là cần thiết vì tên của các thiết bị SCSI thường chứa dấu hai chấm và cần thoát ký tự này trong các lệnh shell.
    • echo 1 > /sys/class/scsi_device/$name/device/rescan: Câu lệnh này yêu cầu hệ thống quét lại thiết bị SCSI cụ thể để kiểm tra xem có bất kỳ thay đổi nào, ví dụ như thiết bị lưu trữ mới được kết nối.

Đoạn script này mình research được trên Google nhưng chưa test trên thực tế, do mình không có hệ thống VMWare nên lười test. Các bạn có nhu cầu có thể thử nhé, nên thử trên môi trường lab trước nhé các bạn.

Kết luận.

Quy trình này thành công trong việc extend phân vùng đĩa root từ 24GB lên 98GB mà không cần cài đặt lại hệ thống. Các bước bao gồm mở rộng phân vùng vật lý, cập nhật logical volume và cuối cùng là mở rộng filesystem. Điều này cho thấy khả năng linh hoạt của LVM trong việc quản lý dung lượng lưu trữ, giúp tăng dung lượng của hệ thống mà không cài lại hệ điều hành ở phân vùng mới.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories