Giới thiệu về LVM Image Giới thiệu về LVM

Bài viết này giới thiệu các bạn về LVM trên hệ điều hành Linux.

1. Giới thiệu LVM

Logical Volume Management(LVM) dùng quản lí các thiết bị lưu trữ .LVM là một tiện ích cho phép chia không gian đĩa cứng thành những Logical Volume từ đó giúp cho việc thay đổi kích thước trở nên dễ dàng.

Ưu điểm của LVM là tăng tính linh hoạt và khả năng kiểm soát. Các tập có thể được thay đổi kích thước động khi yêu cầu không gian thay đổi và di chuyển giữa các thiết bị vật lý trong nhóm trên hệ thống đang chạy hoặc xuất dễ dàng. LVM cũng cung cấp các tính năng nâng cao như Backup hệ thống bằng cách snapshot các phân vùng ổ cứng(real-time), Migrate dữ liệu dễ dàng.

LVM hiện có 2 phiên bản cho hệ điều hành Linux:

  • LVM 1: Phiên bản nằm trong kernel 2.4 series
  • LVM 2: Phiên bản mới nhất và lớn nhất của LVM cho Linux. LVM 2 sử dụng trình điều khiển kernel mapper.

Cấu tạo của LVM:

Sơ đồ dưới đây sẽ cung cấp tổng quan về các yếu tố chính trong hệ thống LVM:

+-- Volume Group --------------------------------+
|                                                |
|    +----------------------------------------+	 |
| PV | PE |  PE | PE | PE | PE | PE | PE | PE |	 |
|    +----------------------------------------+	 |
|      .       	  .    	     . 	      .	       	 |
|      .          .    	     .        .	         |
|    +----------------------------------------+	 |
| LV | LE |  LE | LE | LE | LE | LE | LE | LE |	 |
|    +----------------------------------------+	 |
|            .          .        .     	   .     |
|            . 	        .        .     	   .     |
|    +----------------------------------------+	 |
| PV | PE |  PE | PE | PE | PE | PE | PE | PE |	 |
|    +----------------------------------------+	 |
|                                                |
+------------------------------------------------+

LVM có thể mở rộng một phân vùng trong khi nó được gắn kết. Khi mở rộng phân vùng, LVM có thể sử dụng không gian trống ở bất kỳ đâu trong Volume Group, ngay cả trên một đĩa khác.

LVM có thể di chuyển một phân vùng trong khi nó đang được sử dụng và sẽ không làm hỏng dữ liệu của bạn nếu nó bị gián đoạn. Bạn có thể di chuyển hệ thống sang đĩa mới trong khi sử dụng, sau đó loại bỏ cái cũ sau.

LVM cho phép bạn đóng băng một Logical Volume bất cứ lúc nào, ngay cả khi hệ thống đang chạy. Chúng ta có thể tiếp tục sử dụng volume một cách bình thường, nhưng snapshot volume dường như là một hình ảnh của bản gốc, bị đóng băng đúng lúc tại thời điểm bạn tạo ra nó. Bạn có thể sử dụng điều này để có được một hình ảnh hệ thống tập tin nhất quán để sao lưu, mà không cần tắt hệ thống. Bạn cũng có thể sử dụng nó để lưu trạng thái của hệ thống, để sau này bạn có thể quay lại trạng thái đó nếu bạn làm mọi thứ rối tung lên.

2. Kiến trúc và thuật ngữ LVM

2.1. Cấu trúc quản lý lưu trữ LVM

Chức năng LVM bằng cách xếp các lớp lên trên các thiết bị lưu trữ vật lý. Các lớp cơ bản mà LVM sử dụng:

  • Physical Volume(pv): Ổ cứng vật lý (đĩa cứng, partition, SSD…) có thể chia thành nhiều phân vùng vật lý
  • Volume Group(vg): Là một nhóm bao gồm các Physical Volume trên 1 hoặc nhiều ổ đĩa khác nhau được kết hợp lại thành một Volume Group
  • Logical Volume(lv): Một Volume Group được chia nhỏ thành nhiều Logical Volume. Nó được dùng cho các để mount tới hệ thống tập tin (File System) và được format với những chuẩn định dạng khác nhau như ext2, ext3, ext4…

Tóm lại, LVM có thể được sử dụng để kết hợp các Physical Volume thành các Volume Group để thống nhất không gian lưu trữ có sẵn trên một hệ thống. Sau đó, quản trị viên có thể phân Volume Group thành các Logical Volume tùy ý, hoạt động như các phân vùng.

2.2. Extent

Mỗi Extent là một volume trong Volume Group được tách ra thành khối cố định có kích thước nhỏ. Kích thước của các extent được xác định bởi Volume Group.

Extent trên Physical Volume được gọi là Physical extent.

Extent trên Logical Volume* được gọi là các Logical extent.

Một Logical Volume đơn giản là một ánh xạ mà LVM duy trì giữa các Logical và Physical extent. Do mối quan hệ này, kích thước extent thể hiện lượng không gian nhỏ nhất có thể được phân bổ bởi LVM.

Extent là tính linh hoạt và sức mạnh của LVM. Các Logical extent được trình bày dưới dạng thiết bị hợp nhất bởi LVM.

LVM có thể sao chép và sắp xếp lại các Physical extent tạo thành một Logical Volume mà không có bất kỳ sự gián đoạn nào đối với người dùng. Logical Volume cũng có thể dễ dàng được mở rộng hoặc thu hẹp bằng cách thêm extent vào hoặc loại bỏ extent khỏi volume.

3. Sử dụng Physical Device như Physical Volume

Chúng ta cần phải cài đặt LVM để sử dụng:

LVM có thể không được cài đặt trên máy CentOS 7 của bạn. Nhưng nó có sẵn trong kho lưu trữ gói chính thức của CentOS 7.

Đầu tiên cập nhật bộ đệm kho lưu trữ bằng lệnh sau:

yum makecache

Chạy lệnh sau để cài đặt LVM:

yum install lvm

Đầu tiên chúng ta quét hệ thống để tìm các thiết bị khối mà LVM có thể nhìn thấy và quản lý. Chúng ta thực hiện lệnh sau:

lvmdiskscan

Đầu ra sẽ hiển thị tất cả các thiết bị khối có sẵn mà LVM có thể tương tác với:

[root@localhost ~]# lvmdiskscan
  /dev/cl/root [      13.39 GiB]
  /dev/sda1    [       1.00 GiB]
  /dev/cl/swap [       1.60 GiB]
  /dev/sda2    [     <15.00 GiB] LVM physical volume
  /dev/sdb     [      16.00 GiB]
  3 disks
  1 partition
  0 LVM physical volume whole disks
  1 LVM physical volume

Từ ví dụ trên, chúng ta có thể thấy rằng hiện tại có 3 đĩa và 1 phân vùng và 1 LVM physical volume. Các phân vùng là các /dev/cl/swap phân vùng được sử dụng hệ thống như một đĩa Ram để cải thiện hiệu suất. Các đĩa trong ví dụ này là /dev/sda1có dung lượng là 1GiB, /dev/sda2 có dung lượng bé hơn 15GiB và /dev/sdb có dung lượng là 16GiB.

Chú ý: Đảm bảo rằng khi kiểm tra xem các thiết bị định sử dụng với LVM không có bất kỳ dữ liệu quan trọng nào đã được ghi cho chúng. Sử dụng các thiết bị này trong LVM sẽ ghi đè lên nội dung hiện tại. Nếu bạn đã có dữ liệu quan trọng trên máy chủ của mình, hãy tạo bản sao lưu trước khi tiếp tục.

Chúng ta đã biết các thiết bị vật lý mà chúng ta muốn sử dụng, chúng ta có thể đánh dấu chúng là các Physical Volume trong LVM bằng lệnh: pvcreate

pvcreate /dev/sdb

Kết quả như sau:

[root@localhost ~]# pvcreate /dev/sdb
  Physical volume "/dev/sdb" successfully created.

Ví dụ trên, sẽ viết một tiêu đề LVM cho các thiết bị để chỉ chúng đã sẵn sàng để được thêm vào Volume Group.

Chúng ta có thể kiểm tra LVM đã đăng ký Logical Volume bằng cách sử dụng lệnh sau:

[root@localhost ~]# pvs
  PV         VG Fmt  Attr PSize   PFree
  /dev/sda2  cl lvm2 a--  <15.00g     0
  /dev/sdb      lvm2 ---   16.00g 16.00g

Qua kết quả kiểm tra trên cả hai thiết bị đều có tại cột PV(Physical Volume).

Lưu ý: Nếu chúng ta có 2 ổ đĩa hay nhiều ổ đĩa để tạo một volume mà một đĩa ở volume bị mất thì dẫn tới volume đó mất luôn, vì thế phải chạy LVM trên RAID hoặc dùng tính năng RAID của LVM để có khả năng dung lỗi.

4. Thêm Physical Volume vào một Volume Group

Chúng ta đã tạo các Physical Volume từ các thiết bị của mình, chúng ta có thể tạo một Volume Group. Chúng ta phải đặt một tên cho Volume Group. Bạn sẽ chỉ có một Volume Group duy nhất cho mỗi hệ thống để linh hoạt tối đa trong phân bổ.

Để tạo Volume Group và thêm một Physical Volume /dev/sdb vào sử dụng lệnh vgcreate như sau:

[root@localhost ~]# vgcreate LVMGroup1 /dev/sdb
  Volume group "LVMGroup1" successfully created

Kiểm tra lại pvs

[root@localhost ~]# pvs
  PV         VG        Fmt  Attr PSize   PFree
  /dev/sda2  cl        lvm2 a--  <15.00g      0
  /dev/sdb   LVMGroup1 lvm2 a--  <16.00g <16.00g

Chúng ta thấy /dev/sdb đã được thêm vàO VG(Volume Group) có tên là "LVMGroup1"

Kiểm tra trên vgs

[root@localhost ~]# vgs
  VG        #PV #LV #SN Attr   VSize   VFree
  LVMGroup1   1   0   0 wz--n- <16.00g <16.00g
  cl          1   2   0 wz--n- <15.00g      0

Volume Group với tên "LVMGroup1" của chúng ta hiện 1 Physical Volume, Logical Volume bằng không và có khả năng kết hợp của các thiết bị bên dưới.

5. Tạo các Logical Volume từ Volume Group Pool

Chúng ta đã có một Volume Group, chúng ta có thể sử dụng nó như một nhóm mà chúng tôi có thể phân bổ các Logical Volume từ đó. Không giống như phân vùng thông thường, khi làm việc với các Logical Volume, bạn không cần biết bố cục của volume nó được LVM ánh xạ và xử lý. Bạn chỉ cần cung cấp kích thước của volume và tên.

Chúng ta sẽ tạo bốn Logical Volume trong Volume Group của chúng tôi:

  • 1GB "www" nội dung cho web
  • 2GB "projects"
  • 3GB "db" nội dung database
  • Phần còn lại cho công việc "work"

Để tạo các Logical Volume, chúng ta sử dụng cú pháp sau:

lvcreate -L [size] -n [Name] [Volume Group]

Trong đó:

  • Tùy chọn -n dùng để đặt tên cho Logical Volume
  • Tùy chọn -L dùng chỉ định kích thước trực tiếp

Chúng ta sẽ tạo ba Logical Volume sau:

[root@localhost ~]# lvcreate -L 1G -n www LVMGroup1
  Logical volume "www" created.
[root@localhost ~]# lvcreate -L 2G -n projects LVMGroup1
  Logical volume "projects" created.
[root@localhost ~]# lvcreate -L 3G -n db LVMGroup1
  Logical volume "db" created.

Kiểm tra vgs

[root@localhost ~]# vgs -o +lv_size,lv_name
  VG        #PV #LV #SN Attr   VSize   VFree   LSize  LV
  LVMGroup1   1   3   0 wz--n- <16.00g <10.00g  1.00g www
  LVMGroup1   1   3   0 wz--n- <16.00g <10.00g  2.00g projects
  LVMGroup1   1   3   0 wz--n- <16.00g <10.00g  3.00g db
  cl          1   2   0 wz--n- <15.00g      0   1.60g swap
  cl          1   2   0 wz--n- <15.00g      0  13.39g root

Bây giờ, chúng ta phân bổ phần còn lại của không gian trong Volume Group cho volume "work" sử dụng lệnh sau:

lvcreate -l [Size] -n [Name] [Volume Group]

Trong đó:

  • Tùy chọn -n dùng để đặt tên cho Logical Volume.
  • Tùy chọn -L dùng chỉ định hoạt động trong phạm vi. Chúng ta có thể cung cấp một tỷ lệ phần trăm và một đơn vị để truyền đạt. Trong trường hợp này, chúng tôi muốn phân bổ không gian trống còn lại nên chuyển qua 100%FREE.

    [root@localhost ~]# lvcreate -l 100%FREE -n work LVMGroup1
    Logical volume "work" created.
    
    [root@localhost ~]# vgs -o +lv_size,lv_name
    VG        #PV #LV #SN Attr   VSize   VFree LSize   LV
    LVMGroup1   1   4   0 wz--n- <16.00g    0    1.00g www
    LVMGroup1   1   4   0 wz--n- <16.00g    0    2.00g projects
    LVMGroup1   1   4   0 wz--n- <16.00g    0    3.00g db
    LVMGroup1   1   4   0 wz--n- <16.00g    0  <10.00g work
    cl          1   2   0 wz--n- <15.00g    0    1.60g swap
    cl          1   2   0 wz--n- <15.00g    0   13.39g root
    

Ví dụ trên cho thấy volume "work" đã được tạo và Volume Group "LVMgroup1" được phân bổ hoàn toàn.

6. Định dạng và gắn kết các Logical Volume

Chúng ta đã có Logical Volume có thể sử dụng chúng như các thiết bị khối(block device) bình thường.

Các thiết bị logic có sẵn trong thư mục /dev giống như các thiết bị lưu trữ khác. Bạn có thể truy cập chúng ở hai nơi:

  • /dev/volume_group_name/logical_volume_name
  • /dev/mapper/volume_group_name-logical_volume_name

Vì vậy, để định dạng bốn Logical Volume của chúng tôi với hệ thống tệp Ext4, chúng ta thực hiện như sau:

mkfs.ext4 /dev/LVMGroup1/www
mkfs.ext4 /dev/LVMGroup1/projects
mkfs.ext4 /dev/LVMGroup1/db
mkfs.ext4 /dev/LVMGroup1/work

Hoặc chúng ta có thể thực hiện:

mkfs.ext4 /dev/mapper/LVMGroup1-www
mkfs.ext4 /dev/mapper/LVMGroup1-projects
mkfs.ext4 /dev/mapper/LVMGroup1-db
mkfs.ext4 /dev/mapper/LVMGroup1-work

Sau khi định dạng, chúng ta có thể tạo điểm gắn kết:

mkdir -p /mnt/{www,projects,db,work}

Sau đó chúng ta có thể gắn các khối hợp lý vào vị trí thích hợp:

mount /dev/LVMGroup1/www /mnt/www
mount /dev/LVMGroup1/projects /mnt/projects
mount /dev/LVMGroup1/db /mnt/db
mount /dev/LVMGroup1/work /mnt/work

Để làm cho việc gắn kết liên tục, sử dụng trình soạn thảo vi thêm chúng vào /etc/fstab giống như bạn làm với các thiết bị khối thông thường:

[root@localhost ~]# vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Jan 19 15:13:26 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=5c37800c-c832-443e-8f49-3e6d41e3cccb /mnt/www ext4 defaults,nofail 0 0
UUID=a4962396-1753-4f25-8119-31e7ad169a82 /mnt/projects ext4 defaults,nofail 0 0
UUID=32b49dda-2305-4796-9fce-d8b878c835e5 /mnt/db ext4 defaults,nofail 0 0
UUID=90669d78-ecb4-48e2-8bcf-1cbf6c841547 /mnt/work ext4 defaults,nofail 0 0
UUID=3a3cfe2e-4c9c-4017-9c40-2104dfcbc72f /boot                   xfs     defaults        0 0
/dev/mapper/cl-swap     swap                    swap    defaults        0 0

Cách để lấy UUID của đĩa chúng ta chạy lệnh sau:

blkid [disk]

Ví dụ: Lấy UUID của 4 đĩa word, www, project, bd, work chúng ta thực hiện như bên dưới

[root@localhost ~]# blkid /dev/mapper/LVMGroup1-www
/dev/mapper/LVMGroup1-www: UUID="5c37800c-c832-443e-8f49-3e6d41e3cccb" TYPE="ext4"
[root@localhost ~]# blkid /dev/mapper/LVMGroup1-projects
/dev/mapper/LVMGroup1-projects: UUID="a4962396-1753-4f25-8119-31e7ad169a82" TYPE="ext4"
[root@localhost ~]# blkid /dev/mapper/LVMGroup1-db
/dev/mapper/LVMGroup1-db: UUID="32b49dda-2305-4796-9fce-d8b878c835e5" TYPE="ext4"
[root@localhost ~]# blkid /dev/mapper/LVMGroup1-work
/dev/mapper/LVMGroup1-work: UUID="90669d78-ecb4-48e2-8bcf-1cbf6c841547" TYPE="ext4"

Lưu lại file và chạy lệnh:

[root@localhost ~]# mount -a

Nếu có lỗi, không reboot server để tránh tình trạng server không thể khởi động. Kiểm tra cấu hình trong file /etc/fstab và chạy lại lệnh cho tới khi không có thông báo lỗi.