一  什么是LVM

普通的磁盘分区管理方式在逻辑分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,这个文件因为受上层文件系统的限制,也不能跨越多个分区来存放,所以也不能同时放到别的磁盘上。而遇到出现某个分区空间耗尽时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题

而LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制

想要了解LVM,就得先了解一些名词的概念:

物理存储介质(PhysicalStorageMedia)指系统的物理存储设备:磁盘,如:/dev/hda、/dev/sda等,是存储系统最底层的存储单元

物理卷(Physical Volume,PV)指磁盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与LVM相关的管理参数

逻辑卷(Logical Volume,LV)类似于非LVM系统中的磁盘分区,逻辑卷建立在卷组VG之上。在逻辑卷LV之上可以建立文件系统(比如/home或者/usr等)

物理块(Physical Extent,PE)每一个物理卷PV被划分为称为PE(Physical Extents)的基本单元,具有唯一编号的PE是可以被LVM寻址的最小单元。PE的大小是可配置的,默认为4MB。所以物理卷(PV)由大小等同的基本单元PE组成

逻辑块(Logical Extent,LE)逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应

和非LVM系统将包含分区信息的元数据保存在位于分区的起始位置的分区表中一样,逻辑卷以及卷组相关的元数据也是保存在位于物理卷起始处的VGDA(卷组描述符区域)中

每一个物理卷都被分成几个基本单元,即所谓的PE(Physical Extents)。PE的大小是可变的,但是必须和其所属卷组的物理卷相同。在每一个物理卷里,每一个PE都有一个唯一的编号。PE是一个物理存储里可以被LVM寻址的最小单元

每一个逻辑卷也被分成一些可被寻址的基本单位,即所谓的LE(Logical Extents)。在同一个卷组中,LE的大小和PE是相同的,很然,LE的大小对于一个卷组中的所有逻辑卷来说都是相同的

在一个物理卷中,每一个PE都有一个唯一的编号,但是对于逻辑卷这并不一定是必需的。这是因为当这些PEID号不能使用时,逻辑卷可以由一些物理卷组成。因此,LEID号是用于识别LE以及与之相关的特定PE的。每一次存储区域被寻址访问或者LE的ID被使用,都会把数据写在物理存储设备之上

二  LVM建立

1)建立一个100M的分区,并将其改为 Linux LVM(代号为8e的命令可以将其改为这个形式)

磁盘 lvs命令详解 磁盘lvm是什么_磁盘 lvs命令详解

pvcreate  /dev/vdb1                #建立pv
vgcreate  westos /dev/vdb1    #建立vg命名为westos
lvcreate  -L 30M -n lv0 westos            #建立lv0 从vg中取出 大小为30M

磁盘 lvs命令详解 磁盘lvm是什么_磁盘 lvs命令详解_02

mkfs.xfs  /dev/westos/lv0        #格式化

磁盘 lvs命令详解 磁盘lvm是什么_寻址_03

mount /dev/westos/lv0  /mnt/        #挂载

磁盘 lvs命令详解 磁盘lvm是什么_寻址_04

挂载成功, /dev/mapper/westos-lv0  和 /dev/westos/lv0  是一个东西

磁盘 lvs命令详解 磁盘lvm是什么_逻辑卷_05

pvs  |  pvdisplay        #查看pv
vgs  |  vgdisplay        #查看vg
lvs   |  lvdisplay        #查看lv

三  lvm支持热拉伸

为了可以清楚的看到效果,将对其进行监控

watch -n 1  'pvs;vgs;lvs'   ##对物理卷(PV),卷组(VG),逻辑卷(LV)进行监控

磁盘 lvs命令详解 磁盘lvm是什么_逻辑卷_06

可以看到,有点乱,不是很清楚,因此对其命令稍加修改

watch -n 1 'echo "=== pvinfo ===";pvs;echo "=== vginfo ===";vgs;echo === lvinfo ===;lvs;df -h /mnt'  中间加些不生效的字符

磁盘 lvs命令详解 磁盘lvm是什么_逻辑卷_07

这样我们就可以看清了

1)  当vg中的剩余容量充足时

lvextend -L 60M /dev/westos/lv0     #扩展lvm的容量(直接从vg中取)拉伸到60M

磁盘 lvs命令详解 磁盘lvm是什么_逻辑卷_08

可以看到 lv0 拉伸到了60M
xfs_growfs  /dev/westos/lv0         #扩大文件系统

磁盘 lvs命令详解 磁盘lvm是什么_逻辑卷_09

可以看到文件系统也拉伸到了57M(两者为何还有一点差别,是因为一个采用的是10进制算法,一个采用的是2进制的算法)

2)  当vg中的容量不够时候

先建立一个LVM分区

磁盘 lvs命令详解 磁盘lvm是什么_文件系统_10

注意:在建立分区的时候遇到了这种情况时,只有同步分区表才可解决

partprobe   ##同步分区表

pvcreate  /dev/vdb2               #创建新的pv

vgextend  westos  /dev/vdb2        #把vdb2加到westos中

磁盘 lvs命令详解 磁盘lvm是什么_寻址_11

可以看到将 vdb2 加到了 pv 中

lvextend -L 200M /dev/westos/lv0    #将lv0扩展到200M

xfs_growfs  /dev/westos/lv0   #将系统文件拉伸至lv0 大小

磁盘 lvs命令详解 磁盘lvm是什么_磁盘 lvs命令详解_12

可以看到将 vdb1 占完了,而 vdb2 还有 92M 的空闲

xfs文件系统可以扩大,但是不可以缩减,那么将如何进行缩小呢,引入 ext4 格式

ext4文件系统可以扩大也可以缩减

四  针对ext文件系统的设备的拉伸和缩减

先将挂载在 /mnt下的卸载下来,再改为 ext4 格式

umount /mnt      ##卸载挂载

mkfs.ext4 /dev/westos/lv0   ##将格式改为ext4

磁盘 lvs命令详解 磁盘lvm是什么_磁盘 lvs命令详解_13

mount /dev/westos/lv0 /mnt    ##挂载

磁盘 lvs命令详解 磁盘lvm是什么_逻辑卷_14

挂载成功

1)拉伸

lvextend -L 250M /dev/westos/lv0    ##将lv拉伸到250M
resize2fs  /dev/westos/lv0           ##将/dev/westos/lv0拉伸至lv大小(注意这里的拉伸与xfs格式不一样)

磁盘 lvs命令详解 磁盘lvm是什么_磁盘 lvs命令详解_15

可以看到都拉伸到了250M

2) 缩减

先将挂载卸载下来,再查询 lv0 的大小

umount /mnt    ##卸载挂载
e2fsck -f /dev/westos/lv0   ##查询文件大小

磁盘 lvs命令详解 磁盘lvm是什么_逻辑卷_16

resize2fs  /dev/westos/lv0 80M  ##将为文件系统缩小至80M

磁盘 lvs命令详解 磁盘lvm是什么_逻辑卷_17

mount /dev/westos/lv0   /mnt  ##挂载

将 lv0 缩小至 80M ,再次挂载可以看到确实是

磁盘 lvs命令详解 磁盘lvm是什么_寻址_18

现在要将lv 缩小至100M

lvreduce -L 80M /dev/westos/lv0   ##将lv缩减至80M

磁盘 lvs命令详解 磁盘lvm是什么_逻辑卷_19

可以看到 vdb1 上是有数据的,而vdb2 是空闲的

3)缩小vg
移除空闲pv   vgreduce  westos  /dev/vdb2

磁盘 lvs命令详解 磁盘lvm是什么_文件系统_20

可以看到 vdb2 从 VG 上移除了,VG上的容量变小了,空闲容量也变小了

4)移除含有数据的设备

先要准备一个有空闲容量的PV,因此先将 vdb2 加到VG 上

磁盘 lvs命令详解 磁盘lvm是什么_文件系统_21

再进行数据的转移

pvmove  /dev/vdb1  /dev/vdb2   ##将vdb1的数据移动到vdb2中

磁盘 lvs命令详解 磁盘lvm是什么_寻址_22

可以看到 vdb1 中的数据都转移到了 vdb2 中,vdb1 没有一点占据

vgreduce westos /dev/vdb1    ##将vdb1从westos中移除

pvremove /dev/vdb1    ##彻底移除vdb1

磁盘 lvs命令详解 磁盘lvm是什么_磁盘 lvs命令详解_23

可以看到vdb1 彻底移除了VG

五  LVM的快照

lvcreate -L 40M -n lv0-backup -s /dev/westos/lv0   ##对/dev/westos/lv0建立快照名为lv0-backup

磁盘 lvs命令详解 磁盘lvm是什么_寻址_24

可以看到 westos的快照,大小为40M 的lv0-backup 建立成功

mount /dev/westos/lv0-backup /mnt  ##将快照挂载

磁盘 lvs命令详解 磁盘lvm是什么_寻址_25

lv0-backup 挂载到了 /mnt 下面

六  LVM的删除

umount /mnt     ##卸载挂载

lvremove /dev/westos/lv0-backup          ##移除快照

lvremove /dev/westos/lv0                       ##移除lv0

vgremove westos                                    ##移除westos

pvremove /dev/vdb2                               ##移除 /dev/vdb2