LVM:Logical Volume Manager,逻辑卷管理器。
重点:可以弹性的调整文件系统的容量,而不在于性能和数据安全上面,因此如果强调性能和备份,那么直接使用raid即可,不需要用到LVM。
LVM可以整合多个物理分区,让这些分区看起来就像是一个磁盘一样;而且,未来还可以在这个LVM管理的磁盘当中新增或者删除其他的物理分区。因此它的重点在于“可以弹性地调整文件系统的容量”
LVM各组件
LVM各组件的实现流程如上图,详细的组件介绍如下。
物理卷(physical volume,PV,最底层的物理卷)
实际的分区需要调整系分区类型为8e00(使用gdisk分区工具,其实分区类型不设置成8e也没关系,不过某些LVM的检测命令可能会检测不到该分区),然后再经过pvcreate命令将它转化成LVM最底层的物理卷,之后才能使用这些pv。
卷组(volume group,VG)
LVM大磁盘就是将许多PV整合成VG,所以VG就是LVM组合起来的大磁盘。
物理扩展快(physical extent,PE)
PE是整个LVM最小的存储数据单位,即文件数据都是借由写入PE来完成的。简单的来说,这个PE有点像文件系统的block大小。因此调整PE会影响到LVM的最大容量。如果是32位的linux系统,LVM的逻辑卷LV最多65534个PE(lvm1的格式),因此默认的LVM,即使用4MB的PE数据块,最大的LV会有4MB*65534/(1024M/G)=256GB;但是在Centos 6.X之后,由于linux系统转为64位,并且PE使用了lvm2的各项格式功能,LV几乎没有啥容量限制了。
逻辑卷(logical volume,LV )
最终的卷组VG还会被切成逻辑卷LV,LV就是最后可以被格式化使用的东西了(类似分区)。逻辑卷LV的大小与LV内的物理扩展快PE数量有关,逻辑卷LV的设备文件名格式通常为【/dev/vgname/lvname】
如上图,VG内的PE会分给虚线部分的LV,如果未来这个卷组VG要扩充,加上其他的物理卷PV即可;如果逻辑卷LV要扩充的,加上卷组VG内没有使用的PE来扩充。在LV中,不再称为PE而是称为LE;PE是物理存储单元,LV是逻辑存储单元,即LV中的存储单元LE和PE的大小是一样的。
LVM可以弹性的调整文件系统的容量的实质:通过【交换PE】来进行数据转换,将原本LV内的PE转移到其他设备中来降低LV容量,或将其他设备的PE加入到此LV中以加大容量。
实践流程
根据上图流程爱进行实验如下
物理parition阶段
根据磁盘分区表类型使用gdisk/fdisk工具,对磁盘分区并且类型设置为【8e00】,
磁盘状态如下:
sdb为1G的磁盘,划分了sdb1-3分区,1-2分区是用到的分区,3先保留下来不使用;sdc为2G的磁盘,全部划分为分区sdc1,并且使用;sdd为3G的磁盘,暂不进行分区使用。
PV阶段
物理卷PV有关的命令
pvcreate:将物理分区建立成为PV
pvscan:查找目前系统里面任何具有PV的磁盘
pvdisplay:显示出目前系统上面的PV状态
pvremove:将PV属性删除,让该分区不具有PV属性
因为分区sdb1的大小为1MB,然而系统默认的PV最小值为2MB,因此不能创建,可以修改默认值(建议不修改)。目前从上面来看,我们已经创建了2个物理卷PV。
pvdisplay可以列出系统里面的所有PV磁盘,也可以pvdisplay /dev/sdb2只列出单个PV的详细信息。由于PE是在建立卷组VG时才设置的参数,因此看到新的PV详细信息里面的PE都会是0,且没有多余的PE可供分配。
VG阶段
建立卷组VG和VG相关的命令也不少,如下
vgcreate:主要建立VG的命令,VG名称自定义
"""
格式:vgcreate [-s N[UNIT]] VG名称 PV名称 其中-s选项后面接PE的大小N,单位UNIT可以为b|B是字节,s|S是512字节的扇区,k|K是KiB,m|M是MiB,g|G是GiB,t|T是TiB,P|p是PiB,e|E是EiB,默认设置的大小和系统的VG中PE大小一致,例如我的本机是4MB。
"""
vgscan:查找系统上面所有的VG
vgdisplay:显示系统上所有的VG详细状态
vgextend:在VG内增加额外的PV
vgreduce:在VG内删除PV
vgchange:设置VG是否启动(active)
vgremove:删除一个VG
建立时与物理卷PV不同的是,卷组VG的名称是自定义的。PV的名称就是分区设备的文件名,但是VG名称可以随便自己取。
LV阶段
创造出卷组VG大磁盘之后,就需要建立分区逻辑卷LV,LV相关的命令如下:
lvcreate:建立LV
"""
格式:
lvcreate [-L N[UNIT]] [-n LV名称] VG名称
lvcreate [-l N] [-n LV名称] VG名称
-L选项后接容量,单位是UNIT(同pvcreate中的UNIT),但是要注意的是最小的单位为PE,因此这个数量必须是PE的倍数,若不相符,系统会自动计算最相近的容量
-l(小写)选项后面接的是PE的【个数】
-n 后面接的就是LV的名称,默认名称以本人的为例lvol[0-128],建议自己取名字
"""
lvscan:查询系统上所有的LV
lvdisplay:显示系统上所有的LV详细信息,或者显示某一LV(全名)的详细信息
lvextend:在LV里面增加容量,即将所在VG的空闲PE加进去
lvreduce:在LV里面减少容量,即将LV空闲的PE放回VG中去
lvremove:删除一个LV
lvresize:对LV进行容量大小的调整,是lvextend和lvreduce的综合命令
lvrename:重命名LV
"""
格式:
lvresize [-L [+|-]Size[UNIT]] LV的全名
lvresize [-l [+|-]Number[PERCENT]] LV的全名
-L后面接增减符号和容量,单位是UNIT,例如k,m,g,t,p等和pvcreate里的单位一样
-l后面接增减符号和数字百分比,单位是%
LV的名字需要使用全名,但是PV的名字不要求使用全名也有效。
文件系统阶段
该部分可参考之前的文章linux文件系统
1.格式化分区mkfs命令或者mke2fs命令
mkfs.xfs /dev/jupyvg/jupylv # 注意是逻辑卷LV的全名
2.挂载,如果需要开机挂在之类的请参考上面提到的文章
mkdir /srv/jupy # 建立挂载点
mount /dev/jupyvg/jupylv /srv/jupy
放大文件系统容量的实践
如果要放大文件系统的容量,大致需要以下三步骤。
1.VG阶段需要有剩余的容量
因为要放大文件系统,所以需要放大LV,但是若没有多的VG容量,那么更上层的LV与文件系统就无法放大。一般来说,如果VG容量不满足,最简单的方法就是再加硬盘,然后pvcreate、vgextend来增大VG的容量。
2.LV阶段产生更多的可用容量
如果VG的剩余容量足够,就可以利用lvresize命令来将剩余容量加入到所需要的LV设备内。
3.文件系统阶段的放大
linux实际使用的其实不是LV,而是LV格式化后挂载的文件系统,即最终的一切要以文件系统为依存。目前在Linux系统下可以放大的文件系统有xfs和ext系列,但是缩小仅有ext系列。xfs文件系统放大通过xfs_growfs命令。
ext4文件系统扩容
1.如果需要更改文件系统为ext4格式,需要先卸载挂载点,然后更改,再挂载回去
2.如果VG阶段的剩余容量即Free的PE数量够
例如,我们需要扩容1GB,vgdisplay查看所在的卷组VG的剩余容量为1.42GB左右,那么我们直接扩容LV(使用lvextend或者lvresize都可以),扩容之后
收缩文件系统容量的实践
如果要缩小文件系统容量,步骤如下。