一、简述
什么是逻辑卷?LVM(Logical Volume Manager)利用Linux内核device-mapper实现存储系统的虚
拟化。通过LVM,把底层存储硬件抽象化成存储逻辑块,再将这些逻辑块集合构成存储池,从存储池空间划分分区,可以简单地扩大或缩小分区,而不用担心硬盘没有足够的连续空间。
使用逻辑卷分区有什么用?使用逻辑卷分区重点在于可以弹性地调整文件系统的容量。在实际环境中我们经常会遇一个文件系统空间不足,想要扩展却又十分麻烦,一开始划分空间偏大,想要缩减也是同样不方便。而LVM可以很好地解决这些问题。
逻辑卷的缺点:由于LVM的原理,导致一个文件数据可能分布在多个硬件设备上,这些设备中只要有一个损坏,数据便有丢失。而且存储效率上也有所下降。通常LVM结合RAID使用,提升读写效能或数据可靠性。
二、LVM原理
首先理解四个逻辑卷基本概念:
1、PV(Physical Volume)物理卷:LVM的基本存储逻辑块,可以在上面建立卷组的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件(loopback file)。物理卷包括一个特殊的header,其余部分被切割为一块块物理区域(physical extents)。
2、VG(Volume Group)卷组:一个或多个物理卷组成卷组,即构成一个存储池。可以在卷组上创建“LVM分区”(逻辑卷)
3、LV(Logical Volume)逻辑卷:由若干物理区域组成的虚拟分区,类似于硬盘分区
4、PE(Physical Extent)物理区域:硬盘可供指派给逻辑卷的最小单位。
5、LE(Logical Extent)逻辑区域:物理区域被指派给逻辑卷后变为逻辑区域,组成逻辑卷的最小单位。
简单来讲,我们先将块设备初始化为PV,将若干个PV划分为一个VG卷组并命名,卷组被创建时,将PV划分为若干个PE,默认PE大小为4M,即这些PE构成了卷组,最后我们从卷组中拿出若干个PE组成逻辑卷并命名,相当于划分出一块硬盘分区,逻辑卷创建后就可以正常使用它了,比如进行格式化操作,然后挂载到目录树上。
三、LVM创建演示
以下操作环境为Centos6.5 准备工作:我划分了三个分区/dev/vdb{1,2,3},并设置分区类型为 Linux LVM Device Boot Start End Blocks Id System /dev/vdb1 1 6243 3146440+ 8e Linux LVM /dev/vdb2 6244 12486 3146472 8e Linux LVM /dev/vdb3 12487 16648 2097648 8e Linux LVM 1.PV初始化 [root@localhost /]# pvcreate /dev/vdb{1,2,3} Physical volume "/dev/vdb1" successfully created Physical volume "/dev/vdb2" successfully created Physical volume "/dev/vdb3" successfully created 2.查看创建的PV信息 [root@localhost /]# pvs PV VG Fmt Attr PSize PFree /dev/vdb1 lvm2 ---- 3.00g 3.00g /dev/vdb2 lvm2 ---- 3.00g 3.00g /dev/vdb3 lvm2 ---- 2.00g 2.00g 详细查看PV信息 [root@localhost /]# pvdisplay "/dev/vdb1" is a new physical volume of "3.00 GiB" --- NEW Physical volume --- PV Name /dev/vdb1 VG Name PV Size 3.00 GiB Allocatable NO PE Size 0 #在未被加入卷组前,未划分PE Total PE 0 Free PE 0 Allocated PE 0 PV UUID 3ZEbcc-3S6o-jwfD-0Nxq-C038-uHVv-q50cKZ "/dev/vdb2" is a new physical volume of "3.00 GiB" --- NEW Physical volume --- PV Name /dev/vdb2 VG Name PV Size 3.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID cnhxZf-t5bM-FCca-Yp36-QfR2-1Ydd-aHTiqa "/dev/vdb3" is a new physical volume of "2.00 GiB" --- NEW Physical volume --- PV Name /dev/vdb3 VG Name PV Size 2.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID Dk932c-o5oW-BGz8-3z05-rYTn-i4mu-XEwv1F 3.创建VG [root@localhost /]# vgcreate test /dev/vdb{1,2} Volume group "test" successfully created 4.查看vg信息 [root@localhost /]# vgs VG #PV #LV #SN Attr VSize VFree test 2 0 0 wz--n- 5.99g 5.99g 详细查看vg信息 [root@localhost /]# vgdisplay --- Volume group --- VG Name test 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 5.99 GiB #卷组容量为两个PV容量总 PE Size 4.00 MiB #默认PE大小为4M Total PE 1534 #PE的总数 Alloc PE / Size 0 / 0 #PE分配的情况 Free PE / Size 1534 / 5.99 GiB VG UUID 7KC6at-C49L-2kao-rtHA-6SyU-UHb9-NcZiWF 5.创建LV [root@localhost /]# lvcreate -L 2G -n test1 test Logical volume "test1" created. 6.查看lv信息 [root@localhost /]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert test1 test -wi-a----- 2.00g 详细查看lv信息 [root@localhost /]# lvdisplay --- Logical volume --- LV Path /dev/test/test1 #逻辑卷设备地址 LV Name test1 VG Name test LV UUID QQkAgi-LkCY-eRhg-MNW0-L128-t7gr-e5P3HK LV Write Access read/write LV Creation host, time localhost, 2016-09-06 16:30:38 +0800 LV Status available #新创建的LV默认激活可用 # open 0 LV Size 2.00 GiB Current LE 512 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:0 7.格式化逻辑卷,并挂载 [root@localhost /]# mkfs.ext4 /dev/test/test1 mke2fs 1.41.12 (17-May-2010) 文件系统标签= 操作系统:Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 131072 inodes, 524288 blocks 26214 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=536870912 16 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 正在写入inode表: 完成 Creating journal (16384 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 This filesystem will be automatically checked every 31 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. [root@localhost /]# mount /dev/test/test1 /mnt [root@localhost /]# cp /etc/redhat-release /mnt [root@localhost /]# cat /mnt/redhat-release CentOS release 6.5 (Final) 尝试向逻辑卷挂载点拷贝一些数据,完全正常,至此逻辑卷创建成功。
四、在线扩展LV
命令工具:lvextend 格式: -l|–extents [+]LogicalExtentsNumber[%{VG|LV|PVS|FREE|ORIGIN}] 此选项可以指定逻辑卷新的LE数量,或增加的数量,也可指定百分比形式扩展 -L|–size [+]LogicalVolumeSize[bBsSkKmMgGtTpPeE]} 此选项指定大小来扩展 使用方法: [root@localhost /]# -l +100%FREE /dev/test/test1 #将test卷组的所有剩余PE分配给test1 [root@localhost /]# -L 5G /dev/test/test1 #将test1扩展至5G大小 [root@localhost /]# -L +1G /dev/test/test1 #增加1G的容量 开始扩展test1 [root@localhost /]# lvextend -L +2G /dev/test/test1 Size of logical volume test/test1 changed from 2.00 GiB (512 extents) to 4.00 GiB (1024 extents). Logical volume test1 successfully resized. 再对文件系统调整大小 [root@localhost /]# fsadm resize /dev/test/test1 resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/mapper/test-test1 is mounted on /mnt; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/mapper/test-test1 to 1048576 (4k) blocks. The filesystem on /dev/mapper/test-test1 is now 1048576 blocks long. 查看扩展后的容量 [root@localhost /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda2 48G 28G 18G 62% / tmpfs 3.9G 0 3.9G 0% /dev/shm /dev/mapper/test-test1 4.0G 68M 3.7G 2% /mnt [root@localhost /]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert test1 test -wi-ao---- 4.00g
五、缩减LV
缩减操作较为危险,谨慎操作。缩减LV之前确保已对文件系统重新调整大小。 1、卸载逻辑卷 [root@localhost /]# umount /mnt/ 2、强制检测文件系统 [root@localhost /]# e2fsck -f /dev/test/test1 e2fsck 1.41.12 (17-May-2010) 第一步: 检查inode,块,和大小 第二步: 检查目录结构 第3步: 检查目录连接性 Pass 4: Checking reference counts 第5步: 检查簇概要信息 /dev/test/test1: 12/262144 files (0.0% non-contiguous), 33871/1048576 blocks 3、resize文件系统 [root@localhost /]# fsadm resize /dev/test/test1 3G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/mapper/test-test1 to 786432 (4k) blocks. The filesystem on /dev/mapper/test-test1 is now 786432 blocks long. 4、缩减LV [root@localhost ~]# lvchange -an /dev/test/test1 #停止test1逻辑卷 [root@localhost ~]# lvreduce -L 3G /dev/test/test1 #缩减至3G Size of logical volume test/test1 changed from 4.00 GiB (1024 extents) to 3.00 GiB (768 extents). Logical volume test1 successfully resized. 5、激活,挂载 [root@localhost ~]# lvchange -ay /dev/test/test1 #激活test1逻辑卷 [root@localhost ~]# mount /dev/test/test1 /mnt #挂载 6、查看 [root@localhost /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda2 48G 28G 18G 62% / tmpfs 3.9G 0 3.9G 0% /dev/shm /dev/mapper/test-test1 3.0G 68M 2.8G 3% /mnt [root@localhost /]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert test1 test -wi-ao---- 3.00g [root@localhost /]# cat /mnt/redhat-release CentOS release 6.5 (Final)
六、移除PV
[root@localhost ~]# pvmove /dev/vdb1 #转移pv上的pe到其他pv上,注意其余pv上的剩余pe要能够够容纳现有的pe /dev/vdb1: Moved: 0.1% /dev/vdb1: Moved: 88.9% /dev/vdb1: Moved: 99.9% /dev/vdb1: Moved: 100.0% [root@localhost ~]# vgreduce test /dev/vdb1 #踢出卷组 Removed "/dev/vdb1" from volume group "test " [root@localhost ~]# pvremove /dev/vdb1 #踢出pv Labels on physical volume "/dev/vdb1" successfully wiped
七、LVM快照功能
快照是一种特殊的逻辑卷,是复制原始卷的元数据而建立的逻辑卷,因此它创建速度很快,而且与原始卷在同一卷组。LVM 快照利用一种称为“写时复制(COW – Copy-On-Write)”的技术来跟踪和维持其数据的一致性。当原始卷的数据块(指原始卷所包含的所有数据块,即是空白数据块)第一次写入新数据时,会将旧数据块内容拷贝至快照空间中,也就是说如果只是删掉原始卷某一文件,但是其占用的数据块内容没有改变,删除文件只是不再占有这些数据块,COW认为数据块内容没发生改变,所以不会占用快照空间;还有如果数据块已经重写过一次数据,COW不会再跟踪。
分配给快照的空间,要依据写入的数据量多大和写入的频率,不一定要指派原始卷一样大的空间。快照空间可以扩展或缩减。
利用快照可以记录一个正在使用中的逻辑卷,然后制作一份拍照时刻的备份,由于这个备份是具有一致性的,因此非常的适合于用来备份实时系统。例如,您的运行中的数据库可能即使在备份时刻也是不允许暂停服务的,那么就可以考虑使用LVM的快照模式,然后再针对此快照来进行文件系统级别或者块设备级别的数据备份。
创建快照
为test1创建一个快照,大小为128M [root@localhost ~]# lvcreate -s /dev/test/test1 -n snap_test1 -L 128M Logical volume "snap_test1" created. 查看LV信息,已经有快照相关信息生成 [root@localhost /]# lvdisplay --- Logical volume --- LV Path /dev/test/test1 LV Name test1 VG Name test LV UUID QQkAgi-LkCY-eRhg-MNW0-L128-t7gr-e5P3HK LV Write Access read/write LV Creation host, time localhost, 2016-09-06 16:30:38 +0800 LV snapshot status source of snap_test1 [active] LV Status available # open 1 LV Size 3.00 GiB Current LE 768 Segments 3 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:0 --- Logical volume --- LV Path /dev/test/snap_test1 LV Name snap_test1 VG Name test LV UUID 63oKDT-Mii7-6jTF-KBt7-Pj6k-IavE-y1G3zq LV Write Access read/write LV Creation host, time localhost, 2016-09-06 16:42:22 +0800 LV snapshot status active destination for test1 LV Status available # open 0 LV Size 3.00 GiB Current LE 768 COW-table size 128.00 MiB COW-table LE 32 Allocated to snapshot 0.01% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 252:3 快照逻辑卷创建时带有文件系统,可以直接挂载,建议只读挂载 [root@localhost /]# mount -r /dev/test/snap_test1 /media/ 删除原卷上的文件,对比快照卷 [root@localhost /]# rm -f /mnt/redhat-release [root@localhost /]# cat /media/ lost+found/ redhat-release [root@localhost /]# cat /media/redhat-release CentOS release 6.5 (Final)