Lab005: CentOS - Gộp và chia các PhysicalVolume cho trước thành LogicalVolume tùy ý

 

"Giả sử cho 3 ổ cứng vật lí có dung lượng 2GB, 3GB, 5GB gắn vào máy chủ CentOS. Hãy tạo ra 2 phân vùng ảo có dung lượng 4GB và 6GB"



**

I Các bước thực hiện

1.1 Cài đặt môi trường thực hành trên Hyper-V

Tại thời điểm này, trên môi trường Windows mình dùng Terminal để remote vào máy ảo, trên máy ảo đã có sẵn user l11 và địa chỉ IP LAN 192.168.1.111 sau đó dùng lệnh lsblk để hiển thị các ổ đĩa đang được gắn vào hệ thống.
Ở đây ta chỉ thấy có ổ đĩa (Disk) sda dung lượng 10GB cùng các phân vùng (Partition) sda1, sda2, sda3 được cấu hình sẵn khi cài đặt hệ điều hành.
Để giả lập tình huống một máy chủ chạy CentOS được gắn thêm 3 ổ cứng 2GB, 3GB, 5GB như đề bài, chúng ta sẽ thực hiện trên Hyper-V với một máy ảo đã được cài CentOS. Ví dụ như máy CentOS-11 trong hình, ta chọn máy ảo -> Setting:
Chúng ta chọn mục SCSI Controller -> Hard Drive -> Add:
Chọn mục Hard Drive mới xuất hiện -> Virtual Hard Disk -> New:
Mục Before You Begin thường chả ai thèm đọc -> Next 
Mục Choose Disk Type -> Dynamically expanding -> Next 
Mục Specify Name and Location:
  • Name: đặt một cái tên dễ nhớ, ví dụ như CentOS-11-VHD01 (tượng trưng cho ổ cứng gắn thêm thứ nhất)
  • Location: mình thường qui hoạch để các file config, đĩa ảo.. của một máy ảo ở trong cùng 1 folder (ở đây là folder CentOS-11) cho nên phần đường dẫn mình sẽ lái hướng vào folder CentOS-11/virtualHardDisks. Đây chỉ là một lựa chọn cá nhân, nếu bạn không quan tâm thì để mặc định.
Mục Configure Disk -> Create a new blank virtual hard disk -> chọn dung lượng 2GB. Chúng ta cần tuyệt đối cẩn thận phần này vì nếu lỡ để dung lượng mặc định (127GB) thì ổ ảo này sẽ chiếm hết dung lượng ổ đĩa thực của chúng ta mất.
Cuối cùng, ta review lại các lựa chọn và nhấn Apply. Vậy là coi như chúng ta đã "cắm" một ổ cứng dung lượng 2GB vào máy chủ CentOS trên môi trường Hyper-V rồi.
Lặp lại các bước trên để tạo thêm ổ cứng dung lượng 3GB, 5GB theo yêu cầu đề bài để có kết quả như sau:
Trở về với giao diện dòng lệnh của máy ảo CentOS-11 và dùng lệnh lsblk để kiểm tra kết quả. Chúng ta có thể thấy các ổ đĩa 2GB, 3GB, 5GB lần lượt được kí hiệu là sdb, sdc, sdd. Nhưng đến đây chúng ta mới chỉ "cắm" các ổ đĩa này vào Server thôi, hoàn toàn chưa được chia phân vùng hay định dạng gì cả nên chưa thể dùng được, việc đó ta sẽ tìm hiểu ở phần tiếp theo.
**

1.2 Thứ tự các bước thực hiện

Để thêm ổ cứng vào Server  thì chúng ta đều sẽ phải thực hiện các bước sau:
  • Phân chia ổ cứng vật lí thành 1 hoặc nhiều phân vùng (Partition) tùy mục đích sử dụng
  • Định dạng các phân vùng đã được chia ở bước trước (Format).
  • Gắn phân vùng đã format vào hệ thống để sử dụng (Mount).
  • Cấu hình fstab để hệ thống tự động mount các phân vùng khi khởi động.
Trong quá trình này, chúng ta có thể gặp trường hợp như đề bài đã đề cập đó là: số lượng và dung lượng các ổ đĩa cứng vật lí không khớp với nhu cầu sử dụng thực tế. Ví dụ chúng ta cần thêm 2 phân vùng có dung lượng 6GB và 4GB cho các ứng dụng trên hệ thống nhưng trong tay ta chỉ có 3 ổ cứng 2GB, 3GB, 5GB chẳng hạn.
Vậy để giải quyết bài toán này, chúng ta sẽ sử dụng công cụ LVM2 để thực hiện gộp dung lượng các ổ cứng vật lí sau đó chia ra thành các phân vùng luận lí với dung lượng tùy ý.
Cụ thể hơn, ta cần thực hiện các công việc đối với 3 ổ cứng vật lí 2GB, 3GB, 5GB như sau:
  1. Định dạng các ổ đĩa vật lí, chia phân vùng. Một ổ đĩa có thể được chia thành nhiều phân vùng con, trong trường hợp này ta sẽ chỉ tạo 1 phân vùng cho toàn bộ ổ đĩa cứng.
  2. Định dạng các phân vùng được chia.
  3. Tạo các PhysicalVolume từ các phân vùng được chia.
  4. Gộp các PhysicalVolume vào thành VolumeGroup, đây chính là bước gộp dung lượng của các ổ đĩa vật lí để chuẩn bị phân bổ lại dung lượng.
  5. Chia VolumeGroup thành các LogicalVolume có dung lượng, định dạng tùy nhu cầu sử dụng.
  6. Cấu hình fstab để hệ thống tự động mount các phân vùng luận lí khi khởi động.
**

1.3 Các câu lệnh cần dùng

Lưu ý là phần này sẽ chỉ giới thiệu và mình họa tác dụng của từng câu lệnh, nếu tuần tự làm theo thì sẽ giải quyết được bài toán theo cách thủ công. Để thực hiện bài toán một cách tự động thì chúng ta sẽ gom toàn bộ các lệnh vào thành 1 Script và chạy ở phần sau.
Cài đặt gói LVM2
sudo yum install lvm2 -y
Liệt kê các thiết bị lưu trữ hiện được gắn vào hệ thống - lệnh lsblk. Ở đây chúng ta cần lưu ý, với lệnh lsblk ta đã có thể nhìn thấy 3 ổ cứng mới gắn thêm có tên và dung lượng lần lượt là sdb 2GB, sdc 3GB, sdd 5GB nhưng các ổ cứng này chưa được phân vùng, định dạng hay mounto đâu cả, tức là chưa thể sử dụng được. Lệnh fdisk -l cũng có công dụng tương tự nhưng sẽ cung cấp thông tin chi tiết hơn.
lsblk # List block devices
fdisk -l # List disks

1.3.1 Định dạng ổ đĩa vật lí và tạo phân vùng

Lệnh
fdisk. Ví dụ chúng ta cần thực hiện định dạng ổ cứng sdb 2GB ở hình trên:
fdisk /dev/sdb
Sau khi gõ lệnh, nhấn "m" để xem các tác vụ mà chúng ta có thể thực hiện:
Trong trường hợp này, ta cần tạo một phân vùng -> gõ "n" -> Enter
Tiếp đó, ta cần trả lời 4 mục: PartitionType, PartitionNumber, FirstSector, LastSector. Trong trường hợp này ta chỉ cần tạo 1 Partition trên toàn bộ Disk -> tất cả đều chọn default value -> Enter 4 lần không cần điền giá trị. Bước tiếp theo, gõ "w" để Format ổ đĩa và tạo Partition.
Sau đó dùng lệnh lsblk để xem kết quả. Ở đây chúng ta thấy ổ đĩa sdb (disk) đã được tạo 1 phân vùng sdb1 (part).
Thực hiện tương tự với 2 ổ đĩa sdcsdd còn lại ta sẽ được kết quả:
**

1.3.2 Định dạng phân vùng

Ta tiếp tục lấy phân vùng sdb1 trên ổ đĩa sdb để làm ví dụ. Dùng câu lệnh mkfs (Make File System) để định dạng Partition sdb1 như sau (thực hiện tương tự với phân vùng sdc1, sdd1):
mkfs -t ext4 /dev/sdb1
Đến đây thì ổ đĩa này đã có thể sử dụng được rồi, chỉ cần "gắn" nó vào một thư mục (MountPoint) nào đó trong hệ thống là ta có thể truy cập và lưu trữ tùy ý bằng câu lệnh mount như sau:
sudo mkdir /mnt/sdb1_mp # Tạo thư mục sdb1_mp để làm MountPoint
sudo mount /dev/sdb1 /mnt/sdb1_mp # Mount phân vùng sdb1 vào thư mục sdb1_mp
sudo touch /mnt/sdb1_mp/new_file # Thử tạo 1 file có tên new_fle trên phân vùng vừa được mount
ls -la /mnt/sdb1_mp # List ra các file có trong thư mục sdb1_mp
Dùng lệnh lsblk để kiểm tra kết quả:
Thế nhưng đây không phải là mục tiêu của chúng ta ngày hôm nay, mình sẽ xóa các file đã tạo và gỡ phân vùng sdb1 ra khỏi hệ thống thư mục bằng lệnh umount, xóa thư mục MountPoint để tiếp tục thực hiện bài toán.
sudo rm -rf /mnt/sdb1_mp/new_file
sudo umount /mnt/sdb1_mp
sudo rm -rf /mnt/sdb1_mp
lsblk
**

1.3.3 Tạo PhysicalVolume

Chúng ta sẽ tạo PhysicalVolume cho các phân vùng sdb1 bằng câu lệnh pvcreate -> nhập "y" khi được hỏi và kiểm tra kết quả bằng lệnh pvdisplay:
sudo pvcreate /dev/sdb1
sudo pvdisplay
Tiếp tục thực hiện tương tự với phân vùng sdc1sdd1 và dùng lệnh pvdisplay để xem kết quả, ta sẽ nhận được nội dung sau:
"/dev/sdc1" is a new physical volume of "<3.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc1
  VG Name
  PV Size               <3.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               NRo3JL-DDnb-MOmV-aCZi-KcOz-KBxu-1sLIHg

  "/dev/sdd1" is a new physical volume of "<5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd1
  VG Name
  PV Size               <5.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               TZdBX2-uMLv-ueBu-1Jno-Fa9j-q3fS-4rjwkh

  "/dev/sdb1" is a new physical volume of "<2.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               <2.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               9JIL7s-9qKg-2Exy-TJcK-z0N0-WLqu-5RYLkr
Ở đây ta thấy, mỗi PhysicalVolume đều có 1 PV UUID phân biệt.
**

1.3.4 Tạo GroupVolume gộp dung lượng

Ở bước này, ta sẽ gộp cả 3 PhysicalVolume sdb1, sdc1, sdd1 thành 1 đối tượng ảo là GroupVolume, đây chính là bước gộp dung lượng của 3 ổ đĩa 2GB, 3GB, 5GB thành 1 GroupVolume có dung lượng 10GB để phục vụ việc phân bổ về sau. Ta sẽ dùng câu lệnh vgcreate để tạo GroupVolume và lệnh gvdisplay để kiểm tra kết quả. Cú pháp câu lệnh như sau:
vgcreate <VolumeGroupName> <PhysicalVolume1> <PhysicalVolume2> <..>
với VolumeGroupName là tên chúng ta tự đặt cho VolumeGroup (mình lấy tên vol_gr_total cho dễ nhớ)
sudo vgcreate vol_gr_total /dev/sdb1 /dev/sdc1 /dev/sdd1
sudo vgdisplay
**

1.3.5 Tạo LogicalVolume phân bổ lại dung lượng

Theo yêu cầu bài toán, ta sẽ dựa trên 3 ổ đĩa vật lí có dung lượng 2GB, 3GB, 5GB tạo ra 2 ổ đĩa luận lí có dung lượng 4GB và 6GB. Để thực hiện, ta sẽ dùng lệnh lvcreate định nghĩa 2 LogicalVolume và dùng lệnh lvdisplay để kiểm tra kết quả. Cú pháp:
lvcreate -L <Capacity> -n <LogicalVolumeName> <GroupVolumeName>
Với các thành phần:
  • Option "-L" chỉ định dung lượng cho LogicalVolume cần tạo
  • Option "-n" chỉ định tên cho LogicalVolume cần tạo
  • Capacity: dung lượng của LogicalVolume cần tạo.
Dùng 2 câu lệnh sau để tạo 2 LogicalVolume có dung lượng lần lượt là 4GB và 6GB:
lvcreate -L 4G -n log_vol_4GB vol_gr_total
lvcreate -l 100%FREE -n log_vol_6GB vol_gr_total lvdisplay
Ở câu lệnh thứ 2, chúng ta hãy chú ý đên một Option hữu dụng là "-l 100%FREE" (lờ nhỏ). Sau khi câu lệnh đầu tiên lấy đi 4GB dung lượng cho LogicalVolume log_vol_4GB, ta sẽ dùng Option này với ý nghĩa "lấy toàn bộ dung lượng trống còn lại trong VolumeGroup để tạo LogicalVolume tiếp theo
Sử dụng lệnh lvdisplay, ta sẽ nhận được nội dung tương tự như sau:
  --- Logical volume ---
  LV Path                /dev/vol_gr_total/log_vol_4GB
  LV Name                log_vol_4GB
  VG Name                vol_gr_total
  LV UUID                1QY8Wh-RaNX-tfXd-1sxZ-ehRf-1cKk-bniDIW
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2021-12-12 19:02:02 +0700
  LV Status              available
  # open                 0
  LV Size                4.00 GiB
  Current LE             1024
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

  --- Logical volume ---
  LV Path                /dev/vol_gr_total/log_vol_6GB
  LV Name                log_vol_6GB
  VG Name                vol_gr_total
  LV UUID                9gn524-iUog-YFBZ-s0hU-ZQPr-xns8-faPMpA
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2021-12-12 19:02:20 +0700
  LV Status              available
  # open                 0
  LV Size                <5.99 GiB
  Current LE             1533
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1
**

1.3.6 Định dạng LogicalVolume

Tương tự như định dạng phân vùng của một ổ đĩa vật lí, ta dùng lệnh mkfs để định dạng ext4 cho LogicalVolume với cú pháp đường dẫn sau:
mkfs -t ext4 /dev/<VolumeGroupName>/<LogicalVolumeName>
Với dev/<VolumeGroupName>/<LogicalVolumeName> là đường dẫn đến LogicalVolume. Đến bước này thì chúng ta cần phải đăng nhập vào tài khoản root để thực hiện câu lệnh:
su root
Trong bài Lab trước, mình đã hướng dẫn đặt pass cho cả tài khoản Root lẫn tài khoản thường ngay khi cài đặt CentOS. Nếu bạn chưa từng đăng nhập hay đặt pass cho tải khoản root thì ta sẽ tiến hành đăng nhập và đặt pass luôn:
su root # Đăng nhập tk Root
passwd # Set password cho tk Root
Khi đã ở tài khoản root, ta bắt đầu chạy lệnh định dạng LogicalVolume, lúc này thì không cần sudo nữa, vì chúng ta đang đứng trên tài khoản có quyền tối cao với hệ thống rồi:
mkfs -t ext4 /dev/vol_gr_total/log_vol_4G
mkfs -t ext4 /dev/vol_gr_total/log_vol_6G
lsblk
**

1.3.7 Cấu hình fstab

Hiện giờ chúng ta đã có 2 LogicalVolume với dung lượng 4GB và 6GB rồi, nhưng thay vì dùng câu lệnh mount như ví dụ ở phần trước, chúng ta sẽ phải cấu hình file /etc/fstab để hệ thống CentOS tự động mount 2 phân vùng này vào hệ thống thư mục.
Việc tự động mount này là rất quan trọng, ví dụ như ta dùng phân vùng 4GB cho dịch vụ DatabaseServer chẳng hạn, thì dịch vụ không thể đợi chúng ta mount thủ công phân vùng nó sử dụng sau mỗi lần khởi động được, mọi việc cần được tự động hóa ở mức tối đa có thể.
Vẫn đứng trên root user, ta thực hiện câu lệnh sau:
echo "" >> /etc/fstab # Chèn thêm 1 dòng trống
echo "/dev/vol_gr_total/log_vol_4GB /mnt/log_vol_4GB_mp/ ext4 defaults 0 0" >> /etc/fstab
echo "/dev/vol_gr_total/log_vol_6GB /mnt/log_vol_6GB_mp/ ext4 defaults 0 0" >> /etc/fstab
Câu lệnh gồm 2 phần trước và sau kí tự chuyển hướng dòng lệnh ">>" (2 dấu lớn hơn). Ý nghĩa câu lệnh như sau:
  • echo "<nội dung>" : xuất nội dung trong dấu ngoặc kép ra màn hình.
  • Kí tự chuyển hướng dòng lệnh ">>" : sẽ lái hướng cho kết quả của lệnh echo vào mục tiêu là tệp /etc/fstab thay vì xuất ra màn hình.
Và ta sẽ xem nội dung file /etc/fstab để hiểu thêm về công dụng của câu lệnh trên:
Nội dung mà ta ghi vào file /etc/fstab là cấu hình để hệ thống biết được vị trí và định dạng của phân vùng cần mount khi khởi động với cú pháp:
<đường dẫn đến LogicalVolume> <MountPoint: cần mount vào đâu> <Format: định dạng gì> defaults 0 0
Cuối cùng là khởi động lại hệ thống và xem kết quả bằng lệnh lsblk.
**

II Thực hiện bài toán

2.1 Tạo Script thực thi tự động

Từ các câu lệnh trên, ta xây dựng Script với nội dung sau. lưu ý là ta sẽ đứng trên tài khoản root để tạo và chạy script này:
# Cho 3 Physical Disk 2GB, 3GB, 5GB
# Yeu cau phan chia thanh 2 Logical Volume 4GB va 6GB # Format Disks echo "*** Format Disks ***" lsblk fdisk /dev/sdb lsblk fdisk /dev/sdc lsblk fdisk /dev/sdd lsblk # Format Partitions echo "*** Format Partitions ***" mkfs -t ext4 /dev/sdb1 mkfs -t ext4 /dev/sdc1 mkfs -t ext4 /dev/sdd1 lsblk | grep part # Create Physical Volume echo "*** Create Physical Volume ***" pvcreate /dev/sdb1 pvdisplay pvcreate /dev/sdc1 pvdisplay pvcreate /dev/sdd1 pvdisplay # Create Volume Group from Physical Volume echo "*** Create Volume Group ***" vgcreate vol_gr_total /dev/sdb1 /dev/sdc1 /dev/sdd1 vgdisplay # Create Logical Volume from Volume Group echo "*** Create Logical Volume ***" lvcreate -L 4G -n log_vol_4GB vol_gr_total lvcreate -n log_vol_6GB -l 100%FREE vol_gr_total lvdisplay # Format Logical Volume echo "*** Format Logical Volume ***" mkfs -t ext4 /dev/vol_gr_total/log_vol_4GB mkfs -t ext4 /dev/vol_gr_total/log_vol_6GB lsblk # Edit /etc/fstab for automount Logical Volume when system booting echo "" >> /etc/fstab echo "/dev/vol_gr_total/log_vol_4GB /mnt/log_vol_4GB_mp/ ext4 defaults 0 0" >> /etc/fstab echo "/dev/vol_gr_total/log_vol_6GB /mnt/log_vol_6GB_mp/ ext4 defaults 0 0" >> /etc/fstab echo "*** Configure /etc/fstab for auto-mount Logical Volume done ***"
init 6
**

2.2 Kiểm tra kết quả

Ta sẽ xem lại BlockDevice trước khi phân chia LogicalVolumes bằng câu lệnh lsblk:
Sau khi chạy thành công Script và chưa khởi động lại máy ảo, sử dụng lệnh ls -la /mntlsblk ta sẽ thấy 2 LogicalVolume vừa tạo vẫn chưa được mount vào thư mục /mnt:
Sau khi khởi động lại máy ảo, ta thấy 2 LogicalVolume có dung lượng 4GB và 6GB đã được mount vào thư mục /mnt. Như vậy, chúng ta đã thành công cấu hình file /etc/fstab để hệ thống CentOS tự động mount 2 LogicalVolume trong quá trình khởi động.
Trong trường hợp này, dung lượng 6GB của ổ đĩa luận lí đã được gom từ cả 3 ổ đĩa vật lí có dung lượng không quá 5GB.
**
lvextend -L +2G /dev/vol_gr_total/log_vol_4GB
resize2fs /dev/vol_gr_total/log_vol_4GB
resize2fs /dev/vol_gr_total/log_vol_3GB <desired size>
lvreduce -L <desired size> /dev/vol_gr_total/log_vol_3GB
**

Nhận xét

Bài đăng phổ biến