Bài viết này giới thiệu với các bạn cách tạo và quản lý LVM trong hệ điều hành Linux giúp các bạn có thể tự học Linux dễ dàng.
1. Logical Volume Management
Logical Volume Management (LVM) đã có sẵn trên hầu hết trên các bản phân phối Linux, có nhiều lợi thế so với quản lý phân vùng truyền thống. Logical Volume Management được sử dụng để tạo nhiều ổ đĩa logic. Nó cho phép các bộ phận logic được thay đổi kích thước (giảm hoặc tăng) theo ý muốn của người quản trị.
Cấu trúc của LVM bao gồm:
- Một hoặc nhiều đĩa cứng hoặc phân vùng được định cấu hình là physical volume(PV).
- Một volume group(VG) được tạo bằng cách sử dụng một hoặc nhiều khối vật lý.
- Nhiều logical volume có thể được tạo trong một volume group.
2. Các bước để quản lý và tạo LVM bằng các lệnh vgcreate, lvcreate và lvextend
2.1. Tạo Physical Volume, Volume Group, và Logical Volume
2.1.1. Tạo Physical Volume
Chạy lệnh sau để tạo physical volume(PV) trên /dev/sdb
, /dev/sdc
, và /dev/sdd
[root@localhost ~]# pvcreate /dev/sdb /dev/sdc /dev/sdd
Physical volume "/dev/sdb" successfully created.
Physical volume "/dev/sdc" successfully created.
Physical volume "/dev/sdd" successfully created.
Để liệt kê các physical volume(PV) mới được tạo, chạy như sau:
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 cl lvm2 a-- <19.00g 0
/dev/sdb lvm2 --- 10.00g 10.00g
/dev/sdc lvm2 --- 10.00g 10.00g
/dev/sdd lvm2 --- 10.00g 10.00g
Ý nghĩa các trường của pvs
:
PV
: Đĩa được sử dụngPFree
: Kích thước đĩa vật lý (Kích thước PV)
Để có được thông tin chi tiết về mỗi physical volume(PV), sử dụng lệnh sau: pvdisplay
Xem thông tin chi tiết về physical volume(PV) /dev/sdb
. Chúng ta thực hiện như sau:
[root@localhost ~]# pvdisplay /dev/sdb
"/dev/sdb" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID sprsx7-glR2-P7w3-40FG-Fzey-ad57-VTGhA2
Tương tự cho /dev/sdc
và /dev/sdd
:
[root@localhost ~]# pvdisplay /dev/sdc
"/dev/sdc" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID HBbxa9-pepX-Dr5z-B4fJ-lTSb-JcfV-me7Wwo
[root@localhost ~]# pvdisplay /dev/sdd
"/dev/sdd" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdd
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 7cGgRT-DVBS-Kz0x-LIiB-qzN8-bvxl-HYxKdl
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.
2.1.2. Tạo Volume Group
Để tạo volume group với tên vg0
bằng cách sử dụng /dev/sdb
và /dev/sdc
. Chúng ta thực hiện như sau:
[root@localhost ~]# vgcreate vg0 /dev/sdb /dev/sdc
Volume group "vg0" successfully created
Thực hiện lệnh sau để xem thông tin volume group vừa tạo:
[root@localhost ~]# vgdisplay vg0
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 19.99 GiB
PE Size 4.00 MiB
Total PE 5118
Alloc PE / Size 0 / 0
Free PE / Size 5118 / 19.99 GiB
VG UUID 3M10Re-sNdU-3UGY-h4WO-IXV1-pOW7-NUBOBC
Vì vg0 chứa hai đĩa 10GB nên VG Size = 19.99GB
Ý nghĩa các thông tin của Volume group khi chạy lệnh vgdisplay
:
VG Name
: Tên Volume Group.Format
: Kiến trúc LVM được sử dụng.VG Access
: Volume Group có thể đọc và viết và sẵn sàng để sử dụng.VG Status
: Volume Group có thể được định cỡ lại, chúng ta có thể mở rộng thêm nếu cần thêm dung lượng.PE Size
: Mở rộng Physical, Kích thước cho đĩa có thể được xác định bằng kích thước PE hoặc GB, 4MB là kích thước PE mặc định của LVMTotal PE
: Dung lượng Volume Group cóAlloc PE
: Tổng PE đã sử dụngFree PE
: Tổng PE chưa được sử dụng
Chúng ta có thể kiểm tra số lượng physical volume(PV) dùng để tạo volume group như sau:
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
cl 1 2 0 wz--n- <19.00g 0
vg0 2 0 0 wz--n- 19.99g 19.99g
Trong đó:
VG
: Tên Volume Group#PV
: Physical Volume sử dụng trong Volume GroupVFree
: Hiển thị không gian trống có sẵn trong Volume GroupVSize
: Tổng kích thước của Volume Group#LV
: Logical Volume nằm trong volume group#SN
: Số lượng Snapshot của volume groupAttr
: Trạng thái của Volume group có thể ghi, có thể đọc, có thể thay đổi,
Khi tạo ra các logical volume, chúng ta cần phải xem xét dung lượng khi tạo logical volume sau cho phù hợp với nhu cầu sử dụng.
2.1.3. Tạo Logical Volume
Chúng ta sẽ tạo 2 logical volume với tên projects
có dung lượng là 10GB và backups
sử dụng toàn bộ dung lượng còn lại của volume group. Chúng ta chạy lệnh sau:
[root@localhost ~]# lvcreate -n projects -L 10G vg0
Logical volume "projects" created.
[root@localhost ~]# lvcreate -n backups -l 100%FREE vg0
Logical volume "backups" created.
Trong đó:
-n
: Sử dụng chỉ ra tên của logical volume cần tạo.-L
: Sử dụng chỉ một kích thước cố định.-l
: Sử dụng chỉ phần trăm của không gian còn lại trong volume group.
Chạy lệnh sau để xem danh sách logical volume vừa được tạo:
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- <17.00g
swap cl -wi-a----- 2.00g
backups vg0 -wi-a----- 9.99g
projects vg0 -wi-a----- 10.00g
Ý nghĩa các trường của lvs
:
LV
: Tên logical volume%Data
: Phần trăm dung lượng logical volume được sử dụngLsize
: Kích thước của logical volume
Sử dụng lệnh sau để hiển thị thông tin chi tiết của các logical volume:
[root@localhost ~]# lvdisplay vg0/projects
--- Logical volume ---
LV Path /dev/vg0/projects
LV Name projects
VG Name vg0
LV UUID zGbCrQ-FyrO-EjPu-cE5N-7JmQ-ECxt-kJuuFJ
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-04-14 20:14:30 +0700
LV Status available
# open 0
LV Size 10.00 GiB
Current LE 2560
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
[root@localhost ~]# lvdisplay vg0/backups
--- Logical volume ---
LV Path /dev/vg0/backups
LV Name backups
VG Name vg0
LV UUID Hdk7t7-OyYj-q5gn-kNla-1cM5-rDCH-6FCmph
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-04-14 20:14:41 +0700
LV Status available
# open 0
LV Size 9.99 GiB
Current LE 2558
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
Chúng tôi sẽ sử dụng file system ext4
vì nó cho phép chúng ta tăng và giảm kích thước của mỗi logical volume (với file system xfs
chỉ cho phép tăng kích thước). Chúng ta thực hiện như sau:
[root@localhost ~]# mkfs.ext4 /dev/vg0/projects
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]# mkfs.ext4 /dev/vg0/backups
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2619392 blocks
130969 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
2.2. Mở rộng Volume Group và thay đổi kích thước các Logical Volume
Trong ví dụ dưới đây chúng ta sẽ thêm một physical volume có tên /dev/sdd
với kích thước 10GB vào volume group vg0, sau đó chúng ta sẽ tăng kích thước của logical volume /projects
lên 10GB thực hiện như sau:
Chạy các lệnh sau để tạo điểm gắn kết:
[root@localhost ~]# mkdir /projects
[root@localhost ~]# mkdir /backups
Chạy lệnh sau để mount:
[root@localhost ~]# mount /dev/vg0/projects /projects/
[root@localhost ~]# mount /dev/vg0/backups /backups/
Chạy lệnh sau kiểm tra sử dụng không gian đĩa hệ thống tập tin:
[root@localhost ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/cl-root xfs 19G 1.1G 18G 6% /
devtmpfs devtmpfs 501M 0 501M 0% /dev
tmpfs tmpfs 512M 0 512M 0% /dev/shm
tmpfs tmpfs 512M 7.1M 505M 2% /run
tmpfs tmpfs 512M 0 512M 0% /sys/fs/cgroup
/dev/sda1 xfs 1.1G 145M 919M 14% /boot
tmpfs tmpfs 103M 0 103M 0% /run/user/0
/dev/mapper/vg0-projects ext4 11G 38M 9.9G 1% /projects
/dev/mapper/vg0-backups ext4 11G 38M 9.9G 1% /backups
Sử dụng lệnh sau để thêm /dev/sdd
vào volume group vg0:
[root@localhost ~]# vgextend vg0 /dev/sdd
Volume group "vg0" successfully extended
Chúng ta chạy lệnh vgdisplay vg0
trước và sau khi thực hiện lệnh vgextend vg0 /dev/sdd
, bạn sẽ thấy sự tăng kích thước của volume group(VG):
Trước khi chạy lệnh vgextend vg0 /dev/sdd
[root@localhost ~]# vgdisplay vg0
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 19.99 GiB
PE Size 4.00 MiB
Total PE 5118
Alloc PE / Size 5118 / 19.99 GiB
Free PE / Size 0 / 0
VG UUID 3M10Re-sNdU-3UGY-h4WO-IXV1-pOW7-NUBOBC
Sau khi chạy lệnh vgextend vg0 /dev/sdd
[root@localhost ~]# vgdisplay vg0
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 6
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size <29.99 GiB
PE Size 4.00 MiB
Total PE 7677
Alloc PE / Size 5118 / 19.99 GiB
Free PE / Size 2559 / <10.00 GiB
VG UUID 3M10Re-sNdU-3UGY-h4WO-IXV1-pOW7-NUBOBC
Qua lệnh kiểm tra trên chúng ta thấy dung lượng thêm vào của chúng ta là 10GB chúng ta có thể tăng kích thước của logical volume /projects
lên 10GB thực hiện như sau:
[root@localhost ~]# lvextend -l +2000 /dev/vg0/projects
Size of logical volume vg0/projects changed from 10.00 GiB (1920 extents) to 17.81 GiB (4560 extents).
Logical volume vg0/projects successfully resized.
Sau khi chạy lệnh trên chúng ta cần thay đổi kích thước hệ thống tệp, vì thế chúng ta phải chạy lệnh sau để resize:
- Đối với file system (ext2, ext3, ext 4):
resize2fs
. Đối với file system (xfs):
xfs_growfs
.[root@localhost ~]# resize2fs /dev/vg0/projects resize2fs 1.42.9 (28-Dec-2013) Filesystem at /dev/vg0/projects is mounted on /projects; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 2 The filesystem on /dev/vg0/projects is now 4669440 blocks long. [root@localhost ~]# df -TH Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/cl-root xfs 19G 1.1G 18G 6% / devtmpfs devtmpfs 501M 0 501M 0% /dev tmpfs tmpfs 512M 0 512M 0% /dev/shm tmpfs tmpfs 512M 7.1M 505M 2% /run tmpfs tmpfs 512M 0 512M 0% /sys/fs/cgroup /dev/sda1 xfs 1.1G 145M 919M 14% /boot tmpfs tmpfs 103M 0 103M 0% /run/user/0 /dev/mapper/vg0-projects ext4 19G 47M 18G 1% /projects /dev/mapper/vg0-backups ext4 11G 38M 9.9G 1% /backups
2.3. Giảm kích cỡ Logical Volume
Khi chúng ta muốn giảm dung lượng các Logical Volume. Chúng ta cần phải chú ý vì nó rất quan trọng và có thể bị lỗi trong khi chúng ta giảm dung lượng Logical Volume. Để đảm bảo an toàn khi giảm Logical Volume cần thực hiện các bước sau:
- Trước khi bắt đầu, cần sao lưu dữ liệu vì vậy sẽ không phải đau đầu nếu có sự cố xảy ra.
- Để giảm dung lượng Logical Volume, cần thực hiện đầy đủ và cẩn thận 5 bước cần thiết.
- Khi giảm dung lượng Logical Volume chúng ta phải ngắt kết nối hệ thống tệp trước khi giảm.
Cần thực hiện cẩn thận 5 bước dưới đây:
- Ngắt kết nối file system.
- Kiểm tra file system sau khi ngắt kết nối.
- Giảm file system.
- Giảm kích thước Logical Volume hơn kích thước hiện tại.
- Kiểm tra lỗi cho file system.
- Mount lại file system và kiểm tra kích thước của nó.
Ví dụ: Giảm Logical Volume có tên project
với kích thước từ 17.81GB giảm xuống còn 10GB mà không làm mất dữ liệu. Chúng ta thực hiện các bước như sau:
Kiểm tra dung lượng của Logical Volume và kiểm tra file system trước khi thực hiện giảm:
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
backups vg0 -wi-ao---- 10.00g
projects vg0 -wi-ao---- 17.81g
[root@localhost ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/cl-root xfs 19G 6.8G 12G 37% /
devtmpfs devtmpfs 501M 0 501M 0% /dev
tmpfs tmpfs 512M 0 512M 0% /dev/shm
tmpfs tmpfs 512M 7.1M 505M 2% /run
tmpfs tmpfs 512M 0 512M 0% /sys/fs/cgroup
/dev/sda1 xfs 1.1G 145M 919M 14% /boot
tmpfs tmpfs 103M 0 103M 0% /run/user/0
/dev/mapper/vg0-projects ext4 19G 4.4G 14G 25% /projects
/dev/mapper/vg0-backups ext4 11G 4.4G 5.6G 44% /backups
Bước 1: Umount file system
Sử dụng lệnh umount
bên dưới:
[root@localhost ~]# umount /projects/
[root@localhost ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/cl-root xfs 19G 6.8G 12G 37% /
devtmpfs devtmpfs 501M 0 501M 0% /dev
tmpfs tmpfs 512M 0 512M 0% /dev/shm
tmpfs tmpfs 512M 7.1M 505M 2% /run
tmpfs tmpfs 512M 0 512M 0% /sys/fs/cgroup
/dev/sda1 xfs 1.1G 145M 919M 14% /boot
tmpfs tmpfs 103M 0 103M 0% /run/user/0
/dev/mapper/vg0-backups ext4 11G 4.4G 5.6G 44% /backups
Bước 2: Kiểm tra lỗi file system bằng lệnh e2fsck
.
[root@localhost ~]# e2fsck -f /dev/vg0/projects
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg0/projects: 11/1171456 files (0.0% non-contiguous), 117573/4669440 blocks
Trong đó tùy chọn -f
dùng để kiểm tra(force check).
Bước 3: Giảm kích thước của projects
theo kích thước mong muốn.
Giảm Logical Volume có tên projects
với kích thước từ 17.81GB giảm xuống còn 10GB chúng ta thực hiện như sau:
[root@localhost ~]# resize2fs /dev/vg0/projects 10G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/vg0/projects to 2621440 (4k) blocks.
The filesystem on /dev/vg0/projects is now 2621440 blocks long.
Bước 4: Bây giờ giảm kích thước bằng lệnh lvreduce
.
[root@localhost ~]# lvreduce -L 10G /dev/vg0/projects
WARNING: Reducing active logical volume to 10.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vg0/projects? [y/n]: y
Size of logical volume vg0/projects changed from 17.81 GiB (4560 extents) to 10.00 GiB (2560 extents).
Logical volume vg0/projects successfully resized.
Bước 5: Để đảm bảo an toàn, bây giờ kiểm tra lỗi file system đã giảm
[root@localhost ~]# e2fsck -f /dev/vg0/projects
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/vg0/projects: 11/655360 files (0.0% non-contiguous), 83137/2621440 blocks
Bước 6: Gắn kết file system và kiểm tra kích thước của nó.
[root@localhost ~]# mount /dev/vg0/projects /projects/
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
backups vg0 -wi-ao---- 10.00g
projects vg0 -wi-ao---- 10.00g
[root@localhost ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/cl-root xfs 19G 6.8G 12G 37% /
devtmpfs devtmpfs 501M 0 501M 0% /dev
tmpfs tmpfs 512M 0 512M 0% /dev/shm
tmpfs tmpfs 512M 7.1M 505M 2% /run
tmpfs tmpfs 512M 0 512M 0% /sys/fs/cgroup
/dev/sda1 xfs 1.1G 145M 919M 14% /boot
tmpfs tmpfs 103M 0 103M 0% /run/user/0
/dev/mapper/vg0-backups ext4 11G 4.4G 5.6G 44% /backups
/dev/mapper/vg0-projects ext4 11G 4.4G 5.6G 44% /projects
2.4. Mounting Logical Volume
Chúng ta cần phải gắn kết vĩnh viễn. Để thực hiện gắn kết vĩnh viễn phải nhập trong tệp /etc/fstab
. Bạn có thể sử dụng trình soạn thảo vi để nhập vào:
[root@localhost ~]# vi /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Apr 11 21:36:46 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
#
/dev/mapper/cl-root / xfs defaults 0 0
UUID=8c1d2c4f-13d0-4ec9-ae3d-f706311400ad /boot xfs defaults 0 0
UUID=3fe80222-0f42-4d34-8ce7-e4f51c3a7f61 /backups ext4 defaults 0 0
UUID=314f59be-2c3c-4ded-bc3e-cd79544ef1ee /projects ext4 defaults 0 0
Để xác định UUID trên mỗi đĩa. Chúng ta chạy lệnh sau:
[root@localhost ~]# blkid /dev/vg0/projects
/dev/vg0/projects: UUID="314f59be-2c3c-4ded-bc3e-cd79544ef1ee" TYPE="ext4"
[root@localhost ~]# blkid /dev/vg0/backups
/dev/vg0/backups: UUID="3fe80222-0f42-4d34-8ce7-e4f51c3a7f61" TYPE="ext4"
Khi đã biết UUID và hệ thống tệp, chúng tôi có thể nhập vào tệp /etc/fstab
. Các tập tin fstab
có định dạng sau.
[Device] [Mount Point] [File System Type] [Options] [Dump] [Pass]
Lưu lại file /etc/fstab
và chạy lệnh sau lưu các thay đổi và gắn kết LV:
[root@localhost ~]# mount -a
[root@localhost ~]# mount | grep backups
/dev/mapper/vg0-backups on /backups type ext4 (rw,relatime,seclabel,data=ordered)
[root@localhost ~]# mount | grep projects
/dev/mapper/vg0-projects on /projects type ext4 (rw,relatime,seclabel,data=ordered)
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.
3. Snapshot và restore của Logical Volume
3.1. Snapshot Logical Volume
3.1.1. Tạo snapshot LVM
Trước khi tạo snapshot thì chúng ta kiểm tra dev/vg0/projects
:
[root@localhost ~]# cd /projects/
[root@localhost projects]# ls -l
total 417812
-rw-r--r--. 1 root root 427819008 Apr 28 12:11 CentOS-6.9-x86_64-minimal.iso
drwx------. 2 root root 16384 Apr 28 12:02 lost+found
-rw-r--r--. 1 root root 12 Apr 28 12:20 test1.txt
[root@localhost projects]# cat test1.txt
Hello Blogd
Kiểm tra không gian trống trong volume groupg để tạo snapshot mới chúng ta thực hiện như sau:
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
cl 1 2 0 wz--n- 19.00g 0
vg0 3 2 0 wz--n- 29.99g 2.18g
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
backups vg0 -wi-ao---- 9.99g
projects vg0 -wi-ao---- 17.81g
Qua lệnh kiểm tra trên chúng ta thấy hiện có 2.18GB dung lượng trống còn lại. Vì vậy, tạo một snapshot có tên là snapshot_1 với dung lượng 1GB bằng các lệnh sau:
[root@localhost ~]# lvcreate -L 1GB -s -n snapshot_1 /dev/vg0/projects
Using default stripesize 64.00 KiB.
Logical volume "snapshot_1" created.
Trong đó ý nghĩa các tuỳ chọn là:
-s
: Tạo snapshot-n
: Tên cho snapshot
Tương tự chúng ta tạo một snapshot có tên là snapshot_2 với dung lượng 1GB.
Nếu bạn muốn snapshot, bạn có thể sử dụng lệnh lvremove
.
[root@localhost ~]# lvremove /dev/vg0/snapshot_2
Do you really want to remove active logical volume vg0/snapshot_2? [y/n]: y
Logical volume "snapshot_2" successfully removed
Kiểm tra lại snapshot đã được tạo, chúng ta thực hiện như bên dưới:
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
backups vg0 -wi-ao---- 9.99g
projects vg0 owi-aos--- 17.81g
snapshot_1 vg0 swi-a-s--- 1.00g projiects 0.00
Chúng ta sẽ thêm một số tệp mới vào /dev/vg0/projects
với dung lượng tệp khoảng 719MB và kích thước snapshot của chúng ta là 1GB. Vì vậy, có đủ không gian để sao lưu các thay đổi của chúng ta. Chúng ta thực hiện lệnh bên dưới để kiểm tra:
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
backups vg0 -wi-ao---- 9.99g
projects vg0 owi-aos--- 17.81g
snapshot_1 vg0 swi-a-s--- 1.00g projects 68.30
Qua việc kiểm tra trên chúng ta thấy 68.30% dung lượng snapshot đã được sử dụng. Để biết thêm thông tin chi tiết chúng ta sử dụng lệnh sau:
[root@localhost ~]# lvdisplay /dev/vg0/snapshot_1
--- Logical volume ---
LV Path /dev/vg0/snapshot_1
LV Name snapshot_1
VG Name vg0
LV UUID se3aTX-JKSc-yaIZ-ht55-jIrF-w4Hc-Uy9WXd
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-04-21 07:23:46 +0700
LV snapshot status INACTIVE destination for projects
LV Status available
# open 0
LV Size 17.81 GiB
Current LE 4560
COW-table size 1.00 GiB
COW-table LE 384
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:6
Trong đó ý nghĩa các trường của lệnh lvdisplay
như sau:
LV Name
: Tên của Snapshot Logical Volume.VG Name.
: Tên Volume group đang được sử dụng.LV Write Access
: Snapshot volume ở chế độ đọc và ghi.LV Creation host, time
: Thời gian khi snapshot được tạo. Nó rất quan trọng vì snapshot sẽ tìm mọi thay đổi sau thời gian này.LV snapshot status
: Snapshot này thuộc vào logical volumeprojects
.LV Size
: Kích thước của Source volume mà bạn đã snapshot.COW-table size
: Kích thước bảng Cow.Snapshot chunk size
: Cung cấp kích thước của chunk cho snapshot.
Chúng ta tiếp tục sao chép tệp có dung lượng lớn hơn 1GB vào /dev/vg0/projects
và bạn sẽ nhận được thông báo lỗi "Input/output error" điều đó có nghĩa là hết dung lượng trong snapshot.
/dev/vg0/snapshot_1: read failed after 0 of 4096 at 10737355714: Input/output error
/dev/vg0/snapshot_1: read failed after 0 of 4096 at 10737412422: Input/output error
/dev/vg0/snapshot_1: read failed after 0 of 4096 at 0: Input/output error
/dev/vg0/snapshot_1: read failed after 0 of 4096 at 4096: Input/output error
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
backups vg0 -wi-ao---- 9.99g
projects vg0 owi-aos--- 17.81g
snapshot_1 vg0 swi-I-s--- 1.00g projects 100.00
Nếu chúng ta có Source volume có kích thước là 10GB thì chúng ta cũng nên tạo snapshot có dung lượng 10GB để đủ không gian chứa các thay đổi của Source volume.
Chú ý: Dung lượng Snapshot tăng lên đúng bằng dung lượng tạo mới trên LV. Không thể tạo Snapshot mới ghi đè lên Snapshot cũ. Trường hợp bạn có 2 Snapshot cho cùng 1 ổ LV thì dữ liệu mới cũng được ghi cả vào 2 ổ Snapshot.
3.1.2. Tăng dung lượng snapshot trong lvm
Chúng ta cần mở rộng kích thước của snapshot, chúng ta có thể thực hiện bằng cách sử dụng:
[root@localhost ~]# lvextend -L +1GB /dev/vg0/snapshot_1
Size of logical volume vg0/snapshot_1 changed from 1.0 GiB (256 extents) to 2.00 GiB (512 extents).
Logical volume vg0/snapshot_1 successfully resized.
Sau khi thực thi lệnh trên thì snapshot có kích thước 2GB.
Tiếp theo, kiểm tra kích thước mới và bảng COW bằng lệnh sau.
[root@localhost ~]# lvdisplay /dev/vg0/snapshot_1
--- Logical volume ---
LV Path /dev/vg0/snapshot_1
LV Name snapshot_1
VG Name vg0
LV UUID cGujY8-n70P-U1Vd-IQBA-bPnY-Rds7-7jJVjT
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-04-20 20:07:29 +0700
LV snapshot status active destination for projiects
LV Status available
# open 0
LV Size 17.81 GiB
Current LE 4560
COW-table size 2.00 GiB
COW-table LE 512
Allocated to snapshot 0.00%
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:6
Qua lệnh kiểm tra trên chúng ta thấy COW-table size
nó chính là kích thước bảng Cow và kích thước bảng cow đã tăng lên thêm 1GB so với kích thước trước khi chạy lệnh lvextend
.
Bây giờ sau khi tăng dung lượng chúng ta tiếp tục thêm vào 1 tệp có kích thước 1GB Và chỉnh sữa 1 tệp có tên test1.txt trong /dev/vg0/projects
:
[root@localhost ~]# cd /projects/
[root@localhost projects]# ls -l
total 1058144
-rw-r--r--. 1 root root 655693824 Apr 28 12:23 CentOS-5.10-x86_64-bin-1of9.iso
-rw-r--r--. 1 root root 427819008 Apr 28 12:11 CentOS-6.9-x86_64-minimal.iso
-rw-r--r--. 1 root root 978432342 Apr 28 12:11 CentOS-7.1-x68_64-minimal.iso
drwx------. 2 root root 16384 Apr 28 12:02 lost+found
-rw-r--r--. 1 root root 12 Apr 28 12:20 test1.txt
##Truoc chinh sua
[root@localhost projects]# cat test1.txt
Hello Blogd
##Sau chinh sua
[root@localhost projects]# cat test1.txt
Blogd.net
3.2. Restore Logical Volume
Để restore snapshot, chúng ta cần hủy gắn kết hệ thống tệp.
[root@localhost ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/cl-root xfs 19G 1.1G 18G 6% /
devtmpfs devtmpfs 501M 0 501M 0% /dev
tmpfs tmpfs 512M 0 512M 0% /dev/shm
tmpfs tmpfs 512M 7.1M 505M 2% /run
tmpfs tmpfs 512M 0 512M 0% /sys/fs/cgroup
/dev/sda1 xfs 1.1G 145M 919M 14% /boot
tmpfs tmpfs 103M 0 103M 0% /run/user/0
/dev/mapper/vg0-projects ext4 18G 1.1G 16G 7% /projects
/dev/mapper/vg0-backups ext4 11G 38M 9.9G 1% /backups
[root@localhost ~]# umount /projects/
Kiểm tra xem điểm gắn kết còn hay không:
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 17G 1013M 16G 6% /
devtmpfs 478M 0 478M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6.8M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 1014M 139M 876M 14% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/vg0-backups 9.8G 37M 9.2G 1% /backups
Điểm gắn kết của chúng ta đã được huỷ, vì vậy chúng ta có thể tiếp tục restore snapshot. Để restore snapshot bằng lệnh lvconvert
.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
backups vg0 -wi-ao---- 9.99g
projects vg0 owi-aos--- 17.81g
snapshot_1 vg0 swi-a-s--- 2.00g projects 51.33
[root@localhost ~]# lvconvert --merge /dev/vg0/snapshot_1
Merging of volume vg0/snapshot_1 started.
projects: Merged: 67.30%
projects: Merged: 100.00%
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
backups vg0 -wi-ao---- 9.99g
projects vg0 -wi-a----- 17.81gi
[root@localhost ~]# mount /dev/vg0/projects /projects/
[root@localhost ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/cl-root xfs 19G 1.1G 18G 6% /
devtmpfs devtmpfs 501M 0 501M 0% /dev
tmpfs tmpfs 512M 0 512M 0% /dev/shm
tmpfs tmpfs 512M 7.1M 505M 2% /run
tmpfs tmpfs 512M 0 512M 0% /sys/fs/cgroup
/dev/sda1 xfs 1.1G 145M 919M 14% /boot
tmpfs tmpfs 103M 0 103M 0% /run/user/0
/dev/mapper/vg0-projects ext4 19G 474M 18G 3% /projects
/dev/mapper/vg0-backups ext4 11G 38M 9.9G 1% /backups
Sau khi merge hoàn thành, snapshot volume sẽ tự động bị xóa.
Chúng ta kiểm tra lại /dev/vg0/projects
để xem kết quả:
[root@localhost ~]# cd /projects/
[root@localhost projects]# ls -l
total 417812
-rw-r--r--. 1 root root 427819008 Apr 28 12:11 CentOS-6.9-x86_64-minimal.iso
drwx------. 2 root root 16384 Apr 28 12:02 lost+found
-rw-r--r--. 1 root root 12 Apr 28 12:20 test1.txt
[root@localhost projects]# cat test1.txt
Hello Blogd
Qua kiểm tra trên thì kết quả restore cho chúng ta thấy kết quả trả về ban đầu trước khi chúng ta thực hiện snapshot, dù cho chúng ta có điều chỉnh gì sau khi tạo snapshot thì khi restore vẫn trở về lúc chúng ta tạo snapshot.
4. Tính năng Thin Provisioning Volume
Tính năng này cho phép chúng ta tạo ra số Volume có tổng dung lượng lớn hơn dung lượng cho phép.
4.1. Setup Thin Pool và Volume
Chúng ta tạo 1 Physical Volume /dev/sde
và sau đó dùng lệnh sau để tạo ra 1 Volume group cho Thin-Pool:
[root@localhost ~]# pvcreate /dev/sde
Physical volume "/dev/sde" successfully created.
[root@localhost ~]# vgcreate vg-thin /dev/sde
Volume group "vg-thin" successfully created
Tiếp theo, kiểm tra kích thước Logical volume, trước khi tạo thin pool và volume. Thực hiện như bên dưới:
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
cl 1 2 0 wz--n- 19.00g 0
vg-thin 1 0 0 wz--n- 20.00g 20.00g
vg0 3 2 0 wz--n- 29.99g 2.18g
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
backups vg0 -wi-ao---- 9.99g
projects vg0 -wi-ao---- 17.81g
4.1.1. Tạo một Thin Pool
Chúng ta thực hiện tạo một Thin Pool với kích thước 15GB trong volume group(vg-thin) sử dụng lệnh sau:
[root@localhost ~]# lvcreate -L 15GB --thinpool demo vg-thin
Using default stripesize 64.00 KiB.
Logical volume "demo" created.
Trong đó ý nghĩa các tùy chọn như sau:
-L
: Kích thước của volume group--thinpool
: Tạo mới một thinpooldemo
: Tên của thinpoolvg-thin
: Tên của volume group mà chúng ta muốn tạo thinpool
4.1.2. Tạo Thin Volume
Chúng ta có thể xác định thin volume bên trong thin pool bằng cách sử dụng lệnh lvcreate
cùng với tùy chọn -V
. Thực hiện như bên dưới:
[root@localhost ~]# lvcreate -V 5G --thin -n thin-client1 vg-thin/demo
Using default stripesize 64.00 KiB.
Logical volume "thin-client1" created.
Thin virtual volume đã được tạo với tên thin-client1 bên trong demo trong volume group vg_thin.
Tương tự chúng ta sẽ tạo thin virtual volume với tên lần lượt là thin-client2 và thin-client3:
[root@localhost ~]# lvcreate -V 5G --thin -n thin-client2 vg-thin/demo
Using default stripesize 64.00 KiB.
Logical volume "thin-client2" created.
[root@localhost ~]# lvcreate -V 5G --thin -n thin-client3 vg-thin/demo
Using default stripesize 64.00 KiB.
Logical volume "thin-client3" created.
Liệt kê các logical volume bằng cách sử dụng lệnh dưới đây.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
demo vg-thin twi-aotz-- 15.00g 0.00 0.66
thin-client1 vg-thin Vwi-a-tz-- 5.00g demo 0.00
thin-client2 vg-thin Vwi-a-tz-- 5.00g demo 0.00
thin-client3 vg-thin Vwi-a-tz-- 5.00g demo 0.00
backups vg0 -wi-ao---- 9.99g
projects vg0 -wi-ao---- 17.81g
4.1.3. Tạo file system
Bây giờ, chúng ta sẽ tạo các điểm gắn kết và gắn 3 thin volume này và cho chúng chứa một số tệp bên trong chúng ta thực hiện như sau:
Chạy các lệnh sau để tạo điểm gắn kết:
[root@localhost ~]# mkdir -p /client1 /client2 /client3
Chúng tôi sẽ sử dụng file system
ext4
. Chúng ta thực hiện như sau:[root@localhost ~]# mkfs.ext4 /dev/vg-thin/thin-client1 mke2fs 1.42.9 (28-Dec-2013) Discarding device blocks: done Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=16 blocks, Stripe width=16 blocks 327680 inodes, 1310720 blocks 65536 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1342177280 40 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done [root@localhost ~]# mkfs.ext4 /dev/vg-thin/thin-client2 mke2fs 1.42.9 (28-Dec-2013) Discarding device blocks: done Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=16 blocks, Stripe width=16 blocks 327680 inodes, 1310720 blocks 65536 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1342177280 40 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done [root@localhost ~]# mkfs.ext4 /dev/vg-thin/thin-client3 mke2fs 1.42.9 (28-Dec-2013) Discarding device blocks: done Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=16 blocks, Stripe width=16 blocks 327680 inodes, 1310720 blocks 65536 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1342177280 40 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
Gắn kết cả ba client volume vào điểm gắn kết đã tạo bằng lệnh
mount
.[root@localhost ~]# mount /dev/vg-thin/thin-client1 /client1/ [root@localhost ~]# mount /dev/vg-thin/thin-client2 /client2/ [root@localhost ~]# mount /dev/vg-thin/thin-client3 /client3/
Chạy lệnh sau để xem các lient volume đã được mount đủ chưa:
[root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/cl-root 17G 6.3G 11G 37% / devtmpfs 478M 0 478M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 482M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 1014M 139M 876M 14% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/mapper/vg0-projects 18G 44M 17G 1% /projects /dev/mapper/vg0-backups 9.8G 37M 9.2G 1% /backups /dev/mapper/vg--thin-thin--client1 4.8G 20M 4.6G 1% /client1 /dev/mapper/vg--thin-thin--client2 4.8G 20M 4.6G 1% /client2 /dev/mapper/vg--thin-thin--client3 4.8G 20M 4.6G 1% /client3
Chúng ta chuyển dữ liệu vào dung lượng của các client volume, chạy lệnh sau để kiểm tra:
[root@localhost ~]# df -TH Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/cl-root xfs 19G 6.8G 12G 37% / devtmpfs devtmpfs 501M 0 501M 0% /dev tmpfs tmpfs 512M 0 512M 0% /dev/shm tmpfs tmpfs 512M 7.1M 505M 2% /run tmpfs tmpfs 512M 0 512M 0% /sys/fs/cgroup /dev/sda1 xfs 1.1G 145M 919M 14% /boot tmpfs tmpfs 103M 0 103M 0% /run/user/0 /dev/mapper/vg0-projects ext4 19G 47M 18G 1% /projects /dev/mapper/vg0-backups ext4 11G 38M 9.9G 1% /backups /dev/mapper/vg--thin-thin--client1 ext4 5.2G 734M 4.2G 16% /client1 /dev/mapper/vg--thin-thin--client2 ext4 5.2G 2.3G 2.7G 46% /client2 /dev/mapper/vg--thin-thin--client3 ext4 5.2G 1.4G 3.6G 28% /client3 [root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert root cl -wi-ao---- 17.00g swap cl -wi-ao---- 2.00g demo vg-thin twi-aotz-- 15.00g 30.49 14.87 thin-client1 vg-thin Vwi-aotz-- 5.00g demo 17.41 thin-client2 vg-thin Vwi-aotz-- 5.00g demo 45.15 thin-client3 vg-thin Vwi-aotz-- 5.00g demo 28.92 backups vg0 -wi-ao---- 9.99g projects vg0 -wi-ao---- 17.81g
Qua việc kiểm tra cho chúng ta thấy, ba mount pints cùng với kích thước của chúng theo tỷ lệ phần trăm và cho chúng ta thin-pool biết chỉ có 30% dữ liệu được viết hoàn toàn. Đây là tổng số ba clients virtual volume.
4.2 Cung cấp vượt mức bằng tính năng Thin Provisioning
Bây giờ chúng ta tạo thin-client4
với kích thước 5GB nhưng Thin Pool chỉ có kích thước 15GB chúng ta đạ dùng cho 3 thin-client
trước. Vậy là trên lý thuyết ta ko thể cho client 5GB nữa. Cách giải quyết là dùng chức năng Over Provisioning.
Tạo thin-client4 với kích thước 5GB. Tạo thư mục /client4. Tạo File System và mount thin-client4.
[root@localhost ~]# lvcreate -V 5G --thin -n thin-client4 vg-thin/demo
Using default stripesize 64.00 KiB.
WARNING: Sum of all thin volume sizes (20.00 GiB) exceeds the size of thin pool vg-thin/demo and the size of whole volume group (20.00 GiB)!
For thin pool auto extension activation/thin_pool_autoextend_threshold should be below 100.
Logical volume "thin-client4" created.
[root@localhost ~]# mkdir /client4
[root@localhost ~]# mkfs.ext4 /dev/vg-thin/thin-client4
mke2fs 1.42.9 (28-Dec-2013)
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=16 blocks, Stripe width=16 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
[root@localhost ~]# mount /dev/vg-thin/thin-client4 /client4/
[root@localhost ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/cl-root xfs 19G 6.8G 12G 37% /
devtmpfs devtmpfs 501M 0 501M 0% /dev
tmpfs tmpfs 512M 0 512M 0% /dev/shm
tmpfs tmpfs 512M 7.1M 505M 2% /run
tmpfs tmpfs 512M 0 512M 0% /sys/fs/cgroup
/dev/sda1 xfs 1.1G 145M 919M 14% /boot
tmpfs tmpfs 103M 0 103M 0% /run/user/0
/dev/mapper/vg0-projects ext4 19G 47M 18G 1% /projects
/dev/mapper/vg0-backups ext4 11G 38M 9.9G 1% /backups
/dev/mapper/vg--thin-thin--client1 ext4 5.2G 734M 4.2G 16% /client1
/dev/mapper/vg--thin-thin--client2 ext4 5.2G 2.3G 2.7G 46% /client2
/dev/mapper/vg--thin-thin--client3 ext4 5.2G 1.4G 3.6G 28% /client3
/dev/mapper/vg--thin-thin--client4 ext4 5.2G 20M 5.1G 1% /client4
Bây giờ chúng ta sao chép một số tệp vào /client4
. Chúng ta chạy lệnh sau để kiểm tra:
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
demo vg-thin twi-aotz-- 15.00g 58.47 28.00
thin-client1 vg-thin Vwi-aotz-- 5.00g demo 17.41
thin-client2 vg-thin Vwi-aotz-- 5.00g demo 45.15
thin-client3 vg-thin Vwi-aotz-- 5.00g demo 28.92
thin-client4 vg-thin Vwi-aotz-- 5.00g demo 83.92
backups vg0 -wi-ao---- 9.99g
projects vg0 -wi-ao---- 17.81g
[root@localhost ~]# df -TH
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/cl-root xfs 19G 6.8G 12G 37% /
devtmpfs devtmpfs 501M 0 501M 0% /dev
tmpfs tmpfs 512M 0 512M 0% /dev/shm
tmpfs tmpfs 512M 7.1M 505M 2% /run
tmpfs tmpfs 512M 0 512M 0% /sys/fs/cgroup
/dev/sda1 xfs 1.1G 145M 919M 14% /boot
tmpfs tmpfs 103M 0 103M 0% /run/user/0
/dev/mapper/vg0-projects ext4 19G 47M 18G 1% /projects
/dev/mapper/vg0-backups ext4 11G 38M 9.9G 1% /backups
/dev/mapper/vg--thin-thin--client1 ext4 5.2G 734M 4.2G 16% /client1
/dev/mapper/vg--thin-thin--client2 ext4 5.2G 2.3G 2.7G 46% /client2
/dev/mapper/vg--thin-thin--client3 ext4 5.2G 1.4G 3.6G 28% /client3
/dev/mapper/vg--thin-thin--client4 ext4 5.2G 4.4G 561M 89% /client4
Chúng ta có thể thấy, tổng kích thước được sử dụng của thin-client 4
lên tới 83.92% và kích thước của thin-pool là 59,19% được sử dụng. Nếu tất cả những người dùng sử dụng toàn ôộ dung lượng họ có thì dẫn đến nó sẽ không bị tràn. Để tránh trình trạng tràn, chúng ta cần mở rộng kích thước thin-pool.
Chú ý: Thin-pools là một logical volume, vì vậy nếu chúng ta cần mở rộng kích thước của thin-pool, chúng ta có thể sử dụng lệnh lvextend
Chúng ta có thể mở rộng logical thin-pool như sau:
[root@localhost ~]# lvextend -L +5G /dev/vg-thin/demo
Extending logical volume vg-thin/demo_tdata changed from 15.00 GiB (3840 extents) to 20.00 GiB (5169 extents).
Logical volume vg-thin/demo_tdata successfully resized.
Tiếp theo, liệt kê kích thước thin-pool.
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
demo vg-thin twi-aotz-- 20.80g 42.29 27.90
thin-client1 vg-thin Vwi-aotz-- 5.00g demo 17.41
thin-client2 vg-thin Vwi-aotz-- 5.00g demo 45.15
thin-client3 vg-thin Vwi-aotz-- 5.00g demo 28.92
thin-client4 vg-thin Vwi-aotz-- 5.00g demo 83.92
backups vg0 -wi-ao---- 9.99g
projects vg0 -wi-ao---- 17.81g
5. Tính năng Manage Multiple Logical Volume Management Disk sử dụng Striping I/O
LVM Striping là tính năng cho phép ghi dữ liệu lên nhiều ổ thay vì chỉ một ổ Physical volume.
Chúng ta tạo phân vùng trên 3 ổ cứng /dev/sdb
, /dev/sdc
, /dev/sdd
, mỗi phân vùng có kích thước 1 GB. Để kiểm tra chúng ta sử dụng lệnh fdisk
như sau:
[root@localhost ~]# fdisk -l |grep sd
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
/dev/sdb1 2048 2097151 1047552 83 Linux
Disk /dev/sdc: 10.7 GB, 10737418240 bytes, 20971520 sectors
/dev/sdc1 2048 2097151 1047552 83 Linux
Disk /dev/sdd: 10.7 GB, 10737418240 bytes, 20971520 sectors
/dev/sdd1 2048 2097151 1047552 83 Linux
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
Sau khi tạo 3 phân vùng thành công, bây giờ chúng ta tạo Physical volume bằng cách sử dụng tất cả 3 phân vùng này. Chạy lệnh như bên dưới:
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdd1" successfully created.
Kiểm tra lại các Physical volume đã được tạo như sau:
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 cl lvm2 a-- 19.00g 0
/dev/sdb1 lvm2 --- 1023.00m 1023.00m
/dev/sdc1 lvm2 --- 1023.00m 1023.00m
/dev/sdd1 lvm2 --- 1023.00m 1023.00m
Tiếp theo chúng ta tạo volume group với tên vg1
sử dụng 3 physical volume đã uược tạo bên trên:
[root@localhost ~]# vgcreate vg1 /dev/sdb1 /dev/sdc1 /dev/sdd1
Volume group "vg1" successfully created
Kiểm tra lại các volume group đã được tạo như sau:
[root@localhost ~]# vgs vg1
VG #PV #LV #SN Attr VSize VFree
vg1 3 0 0 wz--n- 2.95g 2.95g
[root@localhost ~]# vgdisplay vg1 -v
--- Volume group ---
VG Name vg1
System ID
Format lvm2
Metadata Areas 3
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 3
Act PV 3
VG Size 2.95 GiB
PE Size 16.00 MiB
Total PE 189
Alloc PE / Size 0 / 0
Free PE / Size 189 / 2.95 GiB
VG UUID PmIMGk-oGeo-i8LG-8PwW-NrfO-09ZH-rEgoYO
--- Physical volumes ---
PV Name /dev/sdb1
PV UUID rnwL7D-p6No-bwEa-rGId-52dO-tn1x-x1QwpP
PV Status allocatable
Total PE / Free PE 63 / 63
PV Name /dev/sdc1
PV UUID leCuzH-7bKd-LXhL-Fwx3-i78c-Qb41-5LG2jr
PV Status allocatable
Total PE / Free PE 63 / 63
PV Name /dev/sdd1
PV UUID nfMK6e-Elw7-OtIM-0xKZ-7KOc-UefL-aM25Wm
PV Status allocatable
Total PE / Free PE 63 / 63
Chúng ta tạo ra một logical volume có tên strp1 với kích thước 900MB, và được tạo trong volume group vg1, xác định sử dụng 3 stripe,có nghĩa là dữ liệu ghi vào logical volume của chúng ta, cần phải được logical volume trên 3PV.
[root@localhost ~]# lvcreate -L 900M -n strp1 -i3 vg1
Using default stripesize 64.00 KiB.
Rounding up size to full physical extent 912.00 MiB
Logical volume "strp1" created.
Trong đó:
-L
: Kích thước logical volume-n
: Tên logical volume-i
: stripes
Sau khi tạo logical volume chúng ta kiểm tra xem nó có được strips ghi vào 3PV không. Chúng ta có thể sử dụng lệnh lvdisplay
cùng với tuỳ chọn -m
:
[root@localhost ~]# lvdisplay vg1/strp1 -m
--- Logical volume ---
LV Path /dev/vg1/strp1
LV Name strp1
VG Name vg1
LV UUID vxhL7M-Zes9-2rPS-MErX-ssNT-F2hF-b3uoxo
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-04-22 23:23:07 +0700
LV Status available
# open 0
LV Size 912.00 MiB
Current LE 57
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
--- Segments ---
Logical extents 0 to 56:
Type striped
Stripes 3
Stripe size 64.00 KiB
Stripe 0:
Physical volume /dev/sdb1
Physical extents 0 to 18
Stripe 1:
Physical volume /dev/sdc1
Physical extents 0 to 18
Stripe 2:
Physical volume /dev/sdd1
Physical extents 0 to 18
Qua lệnh kiểm tra trên chúng ta thấy strips = 3 có nghĩa là chúng ta đã tạo chính sác theo mong muốn.
Để tạo kích thước strips được xác định, chúng ta cần tạo một logical volume với kích thước 1GB bằng kích thước strips được xác định là 256KB. Chỉ strips trên 2PV, chúng ta có thể xác định pv
nào chúng ta muốn được strips.
[root@localhost ~]# lvcreate -L 1G -i2 -I 256 -n strp2 vg1 /dev/sdb1 /dev/sdc1
Logical volume "strp2" created.
Tiếp theo, kiểm tra kích thước strips và số lượng strips.
[root@localhost ~]# lvdisplay vg1/strp2 -m
--- Logical volume ---
LV Path /dev/vg1/strp2
LV Name strp2
VG Name vg1
LV UUID BIC7S0-Wawd-cUcS-LRYp-rxOC-aRh1-fBdYNh
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2019-04-22 23:52:35 +0700
LV Status available
# open 0
LV Size 1.00 GiB
Current LE 64
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 2048
Block device 253:2
--- Segments ---
Logical extents 0 to 63:
Type striped
Stripes 2
Stripe size 256.00 KiB
Stripe 0:
Physical volume /dev/sdb1
Physical extents 0 to 31
Stripe 1:
Physical volume /dev/sdc1
Physical extents 0 to 31
Qua lệnh kiểm tra trên chúng ta thấy strips = 2 và Stripe size 256.00 KiB
Chúng ta có thể xem thông tin lvm bằng lệnh dmsetup
để biết phụ thuộc vào phân vùng nào.
[root@localhost ~]# dmsetup deps /dev/vg1/strp[1-2]
/dev/vg1/strp1: 3 dependencies : (8, 49) (8, 33) (8, 17)
/dev/vg1/strp2: 2 dependencies : (8, 33) (8, 17)
[root@localhost ~]# ls -l /dev/| grep sd
brw-rw----. 1 root disk 8, 0 Apr 22 23:15 sda
brw-rw----. 1 root disk 8, 1 Apr 22 23:15 sda1
brw-rw----. 1 root disk 8, 2 Apr 22 23:15 sda2
brw-rw----. 1 root disk 8, 16 Apr 22 23:15 sdb
brw-rw----. 1 root disk 8, 17 Apr 22 23:52 sdb1
brw-rw----. 1 root disk 8, 32 Apr 22 23:16 sdc
brw-rw----. 1 root disk 8, 33 Apr 22 23:52 sdc1
brw-rw----. 1 root disk 8, 48 Apr 22 23:17 sdd
brw-rw----. 1 root disk 8, 49 Apr 22 23:52 sdd1
6. Tính năng LVM Migration
Tính năng này cho phép di chuyển dữ liệu từ logical volume sang một ổ mới mà không làm mất dữ liệu hoặc downtime. Có thể áp dụng với disk SATA,SSD,SAN storage iSCSI or FC
Bước 1: Kiểm tra ổ đĩa hiện tại
Chúng ta đã có một ổ đĩa ảo có tên là /dev/sdb
đã được ánh xạ tới logical volume project. Bây giờ chúng ta muốn di chuyển dung lượng của /dev/sdb
này sang một số bộ lưu trữ mới khác.
Sử dụng các lệnh fdisk
và lvs
để hiển thị ổ đĩa hiện tại.
[root@localhost ~]# fdisk -l | grep sd
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
projects vg0 -wi-ao---- 9.90g
Bước 2: Kiểm tra ổ đĩa mới được thêm vào
Chúng ta chạy lệnh fdisk -l
để kiểm tra xem ổ mới đã được thêm vào hay chưa:
[root@localhost ~]# fdisk -l | grep sd
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 41943039 19921920 8e Linux LVM
Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Disk /dev/sdc: 10.7 GB, 10737418240 bytes, 20971520 sectors
Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
Ổ đĩa mới đã được thêm vào với tên /dev/sdc
và /dev/sdd
Bước 3: Kiểm tra Logical và Physical Volume hiện tại
Sử dụng các lệnh sau để liệt kê các mount và kiểm tra dữ liệu:
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 17G 2.5G 15G 15% /
devtmpfs 478M 0 478M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6.8M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 1014M 139M 876M 14% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/mapper/vg0-projects 9.7G 250M 8.9G 3% /projects
[root@localhost ~]# cd /projects/
[root@localhost projects]# ls -lh
total 214M
drwx------. 2 root root 16K Apr 22 05:00 lost+found
-rw-r--r--. 1 root root 25 Apr 22 05:01 test.txt
-rwxr-xr-x. 1 root root 213M Apr 22 05:01 vyatta-livecd_VC6.5R1_i386.iso
[root@localhost projects]# cat test.txt
Hello
https://blogd.net/
Lưu ý: Chúng ta đã có ba tệp trong điểm gắn kết /projects và chúng ta di chuyển các dữ liệu này sang ổ đĩa mới không làm mất dữ liệu hoặc downtime.
Trước khi di chuyển, chúng ta chạy lệnh sau để kiểm tra tên của logical volume và volume group:
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
projects vg0 -wi-ao---- 9.90g
[root@localhost ~]# vgs -o+devices | grep vg0
vg0 1 1 0 wz--n- 10.00g 96.00m /dev/sdb(0)
Qua lệnh kêểm tra trên chúng ta thấy /dev/sdb
đang giữ volume group vg0
.
Bước 4: Tạo Physical Volume mới
Để tạo Physical Volume mới cuúng ta thực hiện như sau:
[root@localhost ~]# pvcreate /dev/sdc -v
Wiping internal VG cache
Wiping cache of LVM-capable devices
Wiping signatures on new PV /dev/sdc.
Set up physical volume for "/dev/sdc" with 20971520 available sectors.
Zeroing start of device /dev/sdc.
Writing physical volume data to disk "/dev/sdc".
Physical volume "/dev/sdc" successfully created.
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 cl lvm2 a-- 19.00g 0
/dev/sdb vg0 lvm2 a-- 10.00g 96.00m
/dev/sdc lvm2 --- 10.00g 10.00g
Sử dụng lệnh sau để thêm /dev/sdc
vào volume group vg0:
[root@localhost ~]# vgextend vg0 /dev/sdc
Volume group "vg0" successfully extended
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
cl 1 2 0 wz--n- 19.00g 0
vg0 2 1 0 wz--n- 19.99g 10.09g
Để biết thêm thông tin về thiết bị nào được ánh xạ, sử dụng lệnh dmsetup
.
[root@localhost ~]# lvs -o+devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
root cl -wi-ao---- 17.00g /dev/sda2(512)
swap cl -wi-ao---- 2.00g /dev/sda2(0)
projects vg0 -wi-ao---- 9.90g /dev/sdb(0)
[root@localhost ~]# dmsetup deps /dev/vg0/projects
1 dependencies : (8, 16)
[root@localhost ~]# ls -l /dev | grep sd
brw-rw----. 1 root disk 8, 0 Apr 22 04:58 sda
brw-rw----. 1 root disk 8, 1 Apr 22 04:58 sda1
brw-rw----. 1 root disk 8, 2 Apr 22 04:58 sda2
brw-rw----. 1 root disk 8, 16 Apr 22 05:04 sdb
brw-rw----. 1 root disk 8, 32 Apr 22 05:04 sdc
brw-rw----. 1 root disk 8, 48 Apr 22 04:58 sdd
Bước 5: LVM Mirroring Method
Chúng ta dùng lệnh lvconvert
để migration dữ liệu sang ổ mới. Khi quá trình migration hoàn tất. Dùng lvs -o+devices
để kiểm tra thông tin.
[root@localhost ~]# lvconvert -m 1 /dev/vg0/projects /dev/sdc
Logical volume vg0/projects successfully converted.
[root@localhost ~]# lvs -o+devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
root cl -wi-ao---- 17.00g /dev/sda2(512)
swap cl -wi-ao---- 2.00g /dev/sda2(0)
projects vg0 rwi-aor--- 9.90g 53.93 projects_rimage_0(0),projects_rimage_1(0)
Trong đó tùy chọn có ý nghĩa sau:
-m
: mirror (Tạo ổ migration) 1: 1 mirror
Khi đã tạo 1 mirror mới thì bạn có thể bỏ /dev/sdb
và kiểm tra lại với lvs -o+devices
chúng ta sẽ thấy vg0
chỉ còn nối với /dev/sdc
. Thực hiện như bên dưới:
[root@localhost ~]# lvconvert -m 0 /dev/vg0/projects /dev/sdb
Logical volume vg0/projects successfully converted.
[root@localhost ~]# lvs -o+devices
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert Devices
root cl -wi-ao---- 17.00g /dev/sda2(512)
swap cl -wi-ao---- 2.00g /dev/sda2(0)
projects vg0 -wi-a----- 9.90g /dev/sdc(1)
[root@localhost ~]# dmsetup deps /dev/vg0/projects
1 dependencies : (8, 32)
[root@localhost ~]# ls -l /dev | grep sd
brw-rw----. 1 root disk 8, 0 Apr 22 04:58 sda
brw-rw----. 1 root disk 8, 1 Apr 22 04:58 sda1
brw-rw----. 1 root disk 8, 2 Apr 22 04:58 sda2
brw-rw----. 1 root disk 8, 16 Apr 22 05:11 sdb
brw-rw----. 1 root disk 8, 32 Apr 22 05:11 sdc
brw-rw----. 1 root disk 8, 48 Apr 22 05:07 sdd
Check lại nội dung đã tạo bên trong /projects để đảm bảo dữ liệu không bị mất.
[root@localhost ~]# cd /projects/
[root@localhost projects]# ls -lh
total 214M
drwx------. 2 root root 16K Apr 22 05:00 lost+found
-rw-r--r--. 1 root root 25 Apr 22 05:01 test.txt
-rwxr-xr-x. 1 root root 213M Apr 22 05:01 vyatta-livecd_VC6.5R1_i386.iso
[root@localhost projects]# cat test.txt
Hello
https://blogd.net/
Sau khi mọi thứ được tạo hoàn toàn chính sác bây giờ chúng ta xóa dev/sdb
khỏi volume group và kiểm tra thiết bị nào phụ thuộc vào volume group của chúng ta.
[root@localhost ~]# vgreduce /dev/vg0/ /dev/sdb
[root@localhost ~]# vgs -o+devices
VG #PV #LV #SN Attr VSize VFree Devices
cl 1 2 0 wz--n- 19.00g 0 /dev/sda2(0)
cl 1 2 0 wz--n- 19.00g 0 /dev/sda2(512)
vg0 2 1 0 wz--n- 19.99g 10.09g /dev/sdc(1)
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root cl -wi-ao---- 17.00g
swap cl -wi-ao---- 2.00g
projects vg0 -wi-ao---- 9.90g
Bước 6: LVM pvmove Mirroring Method
Phần này sẽ hướng dẫn dùng pvmove
thay vì lvconvert
Chuẩn bị đầy đủ các bước từ 1 đến 4, tiếp theo chúng ta sẽ dùng lệnh sau:
[root@localhost ~]# pvmove -n /dev/vg0/projects /dev/sdb /dev/sdc
Lưu ý: Đây là cách đơn giản nhưng trong thực tế thì thường sử dụng Mirroring hơn pvmove
7. Lời kết
Qua bài trên, giúp cho chúng ta biết cách sử dụng Logical Volume Management, nó một công cụ để quản lý các thiết bị lưu trữ cung cấp khả năng mở rộng trên hệ điều hành Linux. Ngoài ra còn giúp chúng ta biết cách sử dụng các tính năng của LVM
như: Snapshot, Thin Provisioning Volume, LVM Migration,... giúp chúng ta sử dụng LVM tốt hơn cho hệ thống chúng ta.