Linux逻辑卷管理LVM

Logical Volume Manager

    • LVM
      • LVM的特点
      • LVM:PV,PE,VG,LV
        • PV:Physical Volume 物理卷
        • VG:Volume Group 卷组
        • PE:Physical Extent 物理扩展
        • LV:Logical Volume 逻辑卷
        • 操作流程
      • 实操演示
          • 1. 首先通过fdisk或gdisk命令,来查看分区信息.
          • 2. 接下来将要创建为PV的分区的System ID(就是上面的`Id`列)修改为8e,这里我们先用/dev/sdb5和/dev/sdb6这两个分区来做演示.
          • 3. PV阶段:
          • 4. VG阶段
          • 5. LV阶段
          • 6.文件系统阶段
      • LVM容量的增加与缩小
        • 增加LV容量
        • 缩小LVM容量
      • 使用LVM thin volume让LVM自动调整磁盘使用率
      • LVM快照

LVM

实际生产中经常会碰到这样的问题,比如你最开始的时候用户比较少,只分配给/home目录100G的空间,但是随着用户的暴增,和一顿猛如虎的操作,发现100G的空间有点不够用了,这时候一般情况都是新加一块更大的硬盘,然后分区+格式化,然后将/home的内容完全复制到新的硬盘,之后挂载新的分区.
但是,如果发现这次硬盘比较大,有1TB那么大,但是实际上只有150G的需求,那就要再进行一次上面的操作,很麻烦的,那么有没有一个可以弹性的增大或缩小文件系统容量的方法呢?这就是接下来要接触的LVM(Logical Volume Manager)逻辑卷管理员了。

LVM的特点

LVM的重点在于,可弹性的调整文件系统的容量.而并非是效率与数据安全.
LVLM可以整合多个磁盘中的多个分区,让这些分区看起来就像一个磁盘一样,而且在后期还可以随时添加或者移除其中的磁盘或分区,来达到调整文件系统容量的目的.

LVM:PV,PE,VG,LV

PV:Physical Volume 物理卷

需先将分区的类型修改为8e(LVM标识符),然后才可以通过pvcreate命令来创建.
这里用fdisk为例说明.

使用 fdisk /dev/xxx命令,然后通过-l和-t来进行操作.

Linux逻辑卷管理LVM_第1张图片
Linux逻辑卷管理LVM_第2张图片
注:这里只是演示用,实际上此分区已经在使用,所以最后我以q退指出,

VG:Volume Group 卷组

LVM可以将多个PV组合成一个VG,这样一来,这个卷组的容量就会变得很大。

PE:Physical Extent 物理扩展

LVM默认使用的是4M的PE区块,而LVM在32位Linux操作系统上最多能使用65534个PE区块,因此默认的LVM的LV(下面介绍)最大容量为256G,而在64位操作系统上,已经没有这个限制.
PE为LVM的最小存储区块,可以想象成文件系统里的block.所以,调整PE就意味着调整LVM的最大容量.

LV:Logical Volume 逻辑卷

LV类似非LVM文件系统的分区,从VG中划分空间,VG被当成是一个大的磁盘,来创建LV(类比分区),然后就可以使用LV来创建文件系统.
LV的大小为PE的整数倍.LV的通常命名为/dev/vgname/lvname.
LV的扩容以及缩容其实就是通过增加或者移除PE,来达到目的,VG,LV,PE的关系有点像下图:
Linux逻辑卷管理LVM_第3张图片

操作流程

首先将分区改为8e模式,然后创建PV,再制作VG,划分LV,最后格式化LV并挂载.

Linux逻辑卷管理LVM_第4张图片

数据写入LV时,一般有两种方式:
	1.线性模式(linear):即依次写入,/dev/sdb5满时写入/dev/sdb6....
	2.交错模式(triped):即将数据分为多分(这里是3份),分别写入/dev/sdb5,/dev/sdb6,/dev/sdb7.
有一点类似raid0.
默认的LVM是线行的,因为LVM的初衷只是提供弹性的容量,而并非性能和数据安全,所以如果使用triped模式,那么很可能
其中任何一个分区损坏,整个LVM数据都完蛋.所以,如果要性能和数据安全那么请用RAID而不是LVM.

实操演示

1. 首先通过fdisk或gdisk命令,来查看分区信息.

Linux逻辑卷管理LVM_第5张图片

2. 接下来将要创建为PV的分区的System ID(就是上面的Id列)修改为8e,这里我们先用/dev/sdb5和/dev/sdb6这两个分区来做演示.

使用fdisk下的t命令,选择分区号码,修改分区类型:
Linux逻辑卷管理LVM_第6张图片
接下来相同的方式修改/dev/sdb6为8e.然后w保存并退出.
最后别忘了partprobe /dev/sdb 让系统重读分区表信息.
Linux逻辑卷管理LVM_第7张图片

3. PV阶段:

PV相关命令:

命令 意义
pvcreate 将分区创建为PV
pvscan 查找当前系统中的PV
pvdisplay 显示系统中PV的状态
pvremove 将PV属性移除,让分区不再具有PV属性(换句话说就是将PV还原成分区)

接下来我们来将/dev/sdb5和/dev/sdb6创建成PV

# 扫描系统内所有PV信息
pvscan
# 将/dev/sdb5,/dev/sdb6创建为PV
pvcreate /dev/sdb{5,6}
# 再次扫描系统内所有PV信息,看看PV是否创建成功
pvscan

Linux逻辑卷管理LVM_第8张图片

# pvdisplay命令可以查看组成PV的每个分区的详细信息.
pvdisplay /dev/sdb5

Linux逻辑卷管理LVM_第9张图片

4. VG阶段

VG相关命令:

命令 意义
vgcreate 创建VG
vgscan 查找当前系统中的VG
vgdisplay 显示系统中VG的状态
vgextend 向VG中添加PV
vgreduce 从VG中移除PV
vgchange 修改VG属性
vgremove 将VG属性移除

与PV不同,VG的名称是需要自定义的.

# vgcreate 语法
vgcreate [-s N[mgt]] VG名称 PV名称
-s :后面接PE的大小(N),单位可以是m,g,t(大小写均可)

下面我们将/dev/sdb5,/dev/sdb6创建为PE为16M大小的VG,并且命名为sdbvg

vgcreate -s 16M sdbvg /dev/sdb{5,6}

Linux逻辑卷管理LVM_第10张图片
我们还可以将/dev/sdb7的类型也修改为8e并添加到sdbvg这个VG中.

# CMD vgname pvname
vgextend sdbvg /dev/sdb7

Linux逻辑卷管理LVM_第11张图片
Cur PV:Current PV 当前有多少个PV
Act PV:Active PV 当前有多少个处于激活状态

5. LV阶段

LV相关命令:

命令 意义
lvcreate 创建LV
lvscan 查找当前系统中的LV
lvdisplay 显示系统中LV的状态
lvextend 增加LV的容量
lvreduce 减少LV的容量
lvremove 删除一个LV
lvresize 调整LV的容量,相当于lvextend和lvreduce

在这里插入图片描述

# 使用方法
lvcreate [-L N[mgt]] [-n LV名称] VG名称

下面我们将1G空间分给sdblv

lvcreate -L 1G -n sdblv sdbvg

Linux逻辑卷管理LVM_第12张图片
当LV被创建后,需要使用/dev/sdbvg/sdblv 这样指定设备路径的方式来操作LV

6.文件系统阶段

这个阶段就是格式化+挂载,这里不做过多解释,先格式化成xfs文件系统,再将LV挂载到/srv/lvm.

# 格式化
mkfs.xfs /dev/sdbvg/sdblv
# 创建/srv/lvm目录
mkdir /srv/lvm
# 挂载
mount /dev/sdbvg/sdblv /srv/lvm

Linux逻辑卷管理LVM_第13张图片

LVM容量的增加与缩小

增加LV容量

扩容过程需要一下几个流程:
1.VG需要有生于的容量:因为要扩大文件系统的容量,而文件系统是在LV上进行的格式化,所以扩容即扩大LV的容量.但是LV是基于VG的,所以如果VG没有足够的空间,是无法进行LV扩容的.如果VG空间不够,可以新建分区,然后创建PV在使用vgextend命令添加到VG.
2.使用lvresize或lvextend命令来为LV扩容
3.虽然现在扩容了LV,但是实际上文件系统的容量并没有发生变化,所以要将文件系统的容量也变大.
改变文件系统的容量有resize2fs和xfs_growfs这两个命令
resize2fs:对应ext家族的文件系统.CentOS6.X位为止都是EXT家族
xfs_growfs:对应xfs文件系统CentOS7.X开始默认XFS
首先查看VG的剩余容量,发现还有1.95G
Linux逻辑卷管理LVM_第14张图片
接下来就让我们为LV扩容500M

lvextend -L +500M /dev/sdbvg/sdblv

成功增加LV容量后我们来看一下文件系统,发现并没有变化
在这里插入图片描述

# 查看文件系统信息
xfs_info /srv/lvm
# 扩容文件系统到与LV相同大小
xfs_grwofs /srv/lvm

Linux逻辑卷管理LVM_第15张图片
发现扩容后agcount的值和blocks数量变化了,这是由于,文件系统在最开始格式化时,inode,block,superblock信息就已经固定了,不过由于格式化时会建立多个block group,而这些信息都是存在block group中的,因此,lvm的扩容实际上时通过增加block group,来实现的.

缩小LVM容量

目前所看的为《鸟哥的Linux私房菜》第4版,书中说目前的XFS系统尚无办法缩小文件系统容量,因此,如果有缩小的需求,还是使用EXT4文件系统.(可以参考我之前写过的另一篇博客)
基于EXT4文件系统的LVM操作

使用LVM thin volume让LVM自动调整磁盘使用率

thin volume的原理是,先创建一个用多少分配多少的thin pool,比如说这个thin pool有10G,但此时你只有10M的数据,那么它之分配10M给你,而不是一次性给你10G的磁盘空间,这么做的好处是节约磁盘空间,比如我们常用的VMware就有类似的选项:
Linux逻辑卷管理LVM_第16张图片
好了,下面我们上例子.

  1. 创建thin pool
# 创建thinpool,其中-T = --thin 后接VG/thinpool名称
lvcreate -L 1G -T sdbvg/sdbtpool

Linux逻辑卷管理LVM_第17张图片

  1. 创建10G的LV
# 接下来创建一个10G的LV
# -V 表示Virtual size,虚拟空间大小
lvcreate -V 10G -T sdbvg/sdbtpool -n sdbtp1

Linux逻辑卷管理LVM_第18张图片

  1. 格式化+挂载
# 格式化为XFS
mkfs_xfs /dev/sdbvg/sdbtp1
# 创建文件夹并挂载
mkdir /srv/thin
mount /dev/sdbvg/sdbtp1 /srv/thin
# 查看文件系统使用情况
df -Th /srv/thin

Linux逻辑卷管理LVM_第19张图片
这里虽然显示有10G大小,但是实际上,该数值时通过-V选项虚拟出来的,所以只是用来吓唬人的哈哈,真是情况中,该文件系统并不能使用超过thin pool容量的空间.(也就是我们之前定义的1G)

LVM快照

LVM快照,采用写时复制(Copy on Write)的机制,比传统的复制机制效率高很多,什么是写时复制?
说简单点就是,当你要修改文件系统中的数据时,LVM快照会先将要修改的那部分数据做一个备份,放到快照区,然后再进行数据修改.也就是说,备份在先修改在后.
虽然一般建议快照和LV有相同的空间,但是实际上,快照比LV需要的空间小的多,因为快照创建初期,只是将LV的源信息(metadata)进行记录,而不是将整个文件系统进行备份.
以往的备份是将整个文件系统都备份,即占用空间,恢复起来时间又长。LVM快照的好处是,它只记录要发生变化的文件,这样备份数据量小,恢复时也比较快速.(下面借鸟哥的图)
Linux逻辑卷管理LVM_第20张图片
解析:
快照和LV需要在同一个VG中,这是因为快照需要和LV共享很多的PE.快照创建初期,只是将LV的源信息(metadata)进行记录所以快照初期和LV看起来是一模一样的.
但是当其中一个操作要修改A这个PE区块时,快照会先将修改前的A区块内容备份到快照区,然后再进行修改.修改后的NewA区块此时不与快照区共享.
等到通过快照恢复时,也只是将快照区中的A区块内容覆盖到NewA中.这样备份和恢复速度都会很快.
首先我们看一下VG的剩余容量:还有0.99G,那么我们接下来创建500M的快照sdbsnap
Linux逻辑卷管理LVM_第21张图片
再此之间我们先输出"Hellow LVM SNAP"到/srv/lvm/Hello.txt文件.
在这里插入图片描述

# 其实快照也是LV,只是需要使用-s参数,告诉系统该LV创建为snap
lvcreate -s -L 500M -n sdbsnap /dev/sdbvg/sdblv

Linux逻辑卷管理LVM_第22张图片
挂载快照
Linux逻辑卷管理LVM_第23张图片
发现两边内容一样.
Linux逻辑卷管理LVM_第24张图片
下面我们来演示通过快照还原LV(下面使用lvconvert命令,但是其实还可以通过备份格式化,恢复的方法,感兴趣的朋友可自行百度或留言,这里不做过多演示)
我们将Hello.txt删除.并创建test1.txt~test5.txt这5个空文件.

# 利用touch创建空文件
touch /srv/lvm/test{1,2,3,4,5}.txt

Linux逻辑卷管理LVM_第25张图片
接下来利用lvconvert命令来还原
注意事项:还原时,请确保快照和LV都umount

# 卸载LV和SNAP
umount /srv/lvm /srv/snapshot_sdb
# 还原LV
lvconvert --merge /dev/sdbvg/sdbsnap

注:还原后快照即被删除.
在这里插入图片描述
最后我们来挂载LV检验一下是否恢复成功
在这里插入图片描述

你可能感兴趣的:(Linux)