什么是LVM
LVM是逻辑盘卷管理(LogicalVolumeManager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和 分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。通过LVM系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组 (volumegroup),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logicalvolumes),并进一步在逻辑卷组上创建文件系统。
管理员通过LVM可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配,例如按照使用用途进行定义:"development"和"sales",而不是使用物理磁盘名"sda"和"sdb"。而且当系统添加了新的磁盘,通过LVM管理员就不必将磁盘的 文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。
如何管理磁盘
如果使用逻辑卷管理磁盘,需要如下的步骤:
-
将磁盘设置成为物理卷,一个磁盘可以是物理卷,一个分区可以是物理卷,RAID也可以是物理卷
-
将物理卷组成卷组,这就相当于把底层的磁盘无论是分区还是RAID还是单个磁盘,进行组合,让我们看起来他就像是一块盘一样。
-
接下来,我们可以在卷组中分出一部分逻辑卷,格式化,挂载,使用。
实验操作
接下来我们通过实验来说明如何通过逻辑卷来管理我们的磁盘,实现在不关机的情况下,对磁盘的容量进行增加或减少。
我们先介绍命令,在实现各种操作:
物理卷PV管理
创建物理卷
命令:pvcreate
-y:自动yes
-u:通过UUID创建
一般我们可以直接创建,及pvcreate /dev/sdv
查看物理卷:
pvs :显示简略信息,可以跟设备,也可以不跟
pvdisplay:显示详细信息
卷组vg管理
创建卷组
命令:vgcreate
格式:vgcreate [option] volumeGroup physicalDevicePath [+]
参数:
-s:设置物理卷上PE的大小
-l:卷组上允许创建的最大逻辑卷数
-p:卷组中允许添加的最大物理卷数
查看卷组
vgs:查看卷组的大概信息
vgdisplay:查看卷组的详细信息
如:vgs /dev/vg0
管理卷组
vgextend:卷组扩展
vgreduce:卷组缩减
如:vgextend /dev/vg0 /dev/sdb /dev/sdc
vgreduce /dev/vg0 /dev/sdb /dev/sdd
删除卷组
先删除物理卷pvmove
再删除卷组vgmove ※
逻辑卷lv管理
创建逻辑卷
命令:lvcreate
格式:
lvcreate –L [MGT] –n lv_name VolumeGroup
lvcreate –l 60%VG –n lv_name VolumeGroup
lvcreate –l 100%FREE –n lv_name VolumeGroup
查看逻辑卷
lvs:查看lv大概信息
lvdisplay:查看lv详细信息
逻辑卷管理
lvextend:逻辑卷扩展
lvreduce:逻辑卷缩减
删除逻辑卷
lvremove:删除逻辑卷
例如:
lvremove /dev/vg0/lv0
上面的命令并不是我们需要的所有命令,还有一部分的明林我们在实验过程中在来介绍。接下来我们进行几个实验,包括基本的逻辑卷的创建挂载,扩展逻辑卷,减少逻辑卷,将某块硬盘从LVM中剥离,将LVM迁移。
实验一 基本逻辑卷的创建挂载
在创建可用的逻辑卷之前,我们需要几块硬盘,我的是实验硬盘是一个RAID5的一个分区(50G)一个独立硬盘(50G)
第一步:
创建物理卷,在我们创建物理卷之前,如果我们使用的是一个分区,我们需要将其转换成Linux LVM,方式如下:
接下来创建物理卷:
pvcreate /dev/md0p1
pvcreate /dev/sdg
物理卷创建完成后,我们可以看一个物理卷的详细信息:以/dev/sdg为例:
物理卷创建完成后我们将这两个物理卷合并成一个卷组:
命令:vgcreate -s 8M –n /dev/vg0 /dev/md0p1 /dev/sdg
接下来,我们查看一下卷组的详细信息:
命令:vgdisplay
接下来,我们从卷组里要创建一个逻辑卷,让后分区挂载,使用。
命令:lvcreate –L 60G –n /dev/vg0/lv0 /dev/vg0
mke2fs –t ext4 /dev/vg0/lv0
我们查看一下:
前面的步骤我们都完成了,接下来,我们将这个创建完文件系统的逻辑卷挂载到目录下看看:
这时候我们已经算是完成了,可以尽情的使用我们刚刚挂载的文件系统的(LVM创建)的。但是,我们发现了一个问题,我们创建的明明是/dev/vg0/lv0,
为啥挂载上之后变成了/dev/mapper/vg0-lv0呢?很奇怪,我们查看一下这个逻辑卷到底是咋回事:
我们发现,无论是/dev/vg0/lv0,还是/dev/mapper/vg0-lv0,都只是一个链接文件,最终连接的都是一个dm-0的设备,因为在实际中,LVM只是一个管理工具,最终都是在管理/dev/dm-X设备。
dm: device mapper: 将一个或多个底层块设备组织成一个逻辑设备的模块
实验二 扩展逻辑卷
有时候我们的分区会不够用,特别是作为一个数据盘的时候,如果是一个普通的硬盘直接分区,我们如果想扩展分区大小,我们必须先停掉业务,卸载分区,让后拷贝数据,新建分区大小,但是如果我们是在用LVM管理我们的硬盘的话,我们可以直接在不停机的状态下直接将我们使用的分区进行扩展,接下来,我们就来看一下如何操作的。
首先,我们看一下我们的卷组VG还有没有可用的空间:
我们可以看到,卷组还有40G的可用空间,所以我们可以使用卷组剩余的空间直接扩展:
命令:lvextend –l +100%FREE /dev/vg0/lv0
虽然我们已经将逻辑卷扩展了,但是我们可以发现分区的实际大小并没有变化,这是由于我们虽然已经扩容,但是扩容的这部分并没有文件系统,我们需要给剩余的空间进行格式化,创建文件系统,接下来我们讲一个命令:resize2fs
resize2fs命令被用来增大或者收缩未加载的"ext2/ext3"文件系统的大小。如果文件系统是处于mount状态下,那么它只能做到扩容,前提条件是内核支持在线resize。
所以,我们可以使用这个命令对我们的分区进行在线扩容,而不必卸载文件系统。
如:resize2fs /dev/vg0/lv0
扩容成功。
可是有时候,我们的卷组VG并没有多余的空间,此时我们在查看是否有多余的物理卷,如果没有多余的物理卷,我们就需要添加硬盘,创建物理卷,添加到卷组,在从卷组对我们的分区进行扩容,我演示一遍:
我先是添加一块硬盘/dev/sdf,创建物理卷:
添加到卷组VG:
命令:vgextend
扩展分区:
命令:
lvextend -L +20G -r /dev/vg0/lv0
可在lvextend 时加-r 直接一步到位,先扩展逻辑卷大小后直接增加文件系统大小
扩容成功
实验四 减小逻辑卷
逻辑卷的缩减,饿哦们值作为一个演示,因为在实际的生产环境中很少有人去缩减逻辑卷。只有我们的磁盘不够用的时候我们往上天磁盘,或者我们的磁盘坏了的话我们会跟换新磁盘,要么就是数据迁移。这几种情况除了更换就是增加,几乎没有需要减小容量的情况,并且,减小逻辑卷仅是ext文件系统支持,但是作为学习,我们进行演示。
首先第一步,我们需要卸载挂载,我们就以上一个实验所创建的分区来做实验。
然后我们对文件系统进行检测,防止有坏掉的分区信息,不然那,一会我们在减去一部分逻辑卷之后会造成无法使用。还有就是我们剪掉的大小必须小于分区剩余大小。
接下来我们使用resize2fs命令重新对分区进行调整:
保留90G
接下来我们再讲去格式化的逻辑卷空间从逻辑卷中移除:
此时我们将逻辑卷分区重新挂载在目录下,就可以继续使用了。
实验五 将某块硬盘从LVM中剥离
本次实验我使用的是两块50G的硬盘,在硬盘上会有数据,完成数据的移动并删除一块硬盘将硬盘取出。
我把此分区挂载在/bakup下并将/etc/下的数据全部拷到了此文件系统下,由于我们使用的是两块盘,如果我想剥离的是/dev/sdf这块盘的话,我们并不知道数据是否会在这个盘上存有一部分,此时我们需要将数据进行迁移到同逻辑卷的其他磁盘上去。
我们看到,我们想要剥离sdf,需要将sdf上面的PE数据块转移到sdg上去,我们才能剥离sdf,这样可以方式数据丢失。
命令:pvmove
如:pvmove /dev/sdf [/dev/sdg]
然后我们在看物理卷的情况:
此时我已经将数据块全部迁移到了sdg上面来,接下来,我们一步一步剥离sdf:
先是将物理卷从卷组中移出去:
vgreduce /dev/vg0 /dev/sdf
卷组大小已经变化,但是物理卷还在,接下来我们移除物理卷:
在我们移除物理卷之后已经相当于把硬盘给卸掉了,此时我们的硬盘sdf可以随时拔掉,接下来,我们将此文件系统重新挂载,看看数据是否损坏:
我们的数据都还在,没有丢失。完成。
LVM数据迁移
由于我在实验环境下安装的全部都是50G的硬盘(虚拟机中),为了防止无法找不到硬盘,所以我就重新在加一块80G的硬盘。
由于是在一个主机里,所以我们一定要注意我们放进去的这个30G硬盘创建LVM时,千万不能和目标系统的vg名一样,这样会导致错误发生,lv名一样不一样就无所谓了。
首先我们需要对目标磁盘进行创建LVM格式和要迁移数据的盘一样。
文件系统:
接下来,我在原文件系统中写入一个文件dudu.txt内容是/etc/passwd的内容,然后卸载文件系统,第一步转移PE数据块:
将数据移到目标磁盘对应的PV上。(该磁盘不要有其他与该PV无关的分区)
然后我们再移动除要移动的PV以外的其他PV
vgreduce vg名 /dev/pv(多余)
移除后,我们先挂载一下,看数据是否还在
数据还在,没问题
接下来,我们需要卸载,禁用卷组,设置导出标记禁止访问
vgchange命令用于修改卷组的属性,经常被用来设置卷组是处于活动状态或非活动状态。处于活动状态的卷组无法被删除,必须使用vgchange命令将卷组设置为非活动状态后才能删除。
vgexport / vgimport不需要将驱动器从一个系统移动到另一个系统。它是一个管理策略工具,以防止在移动卷时需要访问卷
禁用卷组:vgchange –an /dev/vg0
设置导出标记禁止访问:vgexport /dev/vg0
接下来我们需要做的是关闭此系统,将磁盘转移到其他机器上继续使用,由于我是用的虚拟机,需要将系统关机才能使用,如果是物理机,磁盘支持热插拔,可以不关闭系统,直接将数据转移。
接下来我们将其安装在centOS 7上,并执行以下操作
pvscan
pvscan
pvscan
vgimport /dev/vg0设置导出标记开启访问
vgchange –ay /dev/vg0 起用卷组
pvscan指令会扫描系统中连接的所有硬盘,列出找到的物理卷列表
pvscan指令会扫描系统中连接的所有硬盘,列出找到的卷组列表
pvscan指令会扫描系统中连接的所有硬盘,列出找到的逻辑卷列表
接下来我们把它挂载于/bakup下,看看文件是否还在
实验完成。
LVM快照
LVM对LV提供的快照功能,只对LVM有效。
当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta-data)。创建的时候,并不会有数据的物理拷贝,因此snapshot的创建几乎是实时的,当原始卷上有写操作执行时,snapshot跟踪原始卷块的改变,这个时候原始卷上将要改变的数据在改变之前被拷贝到snapshot预留的空间里,因此这个原理的实现叫做写时复制(copy-on-write)。
在写操作写入块之前,将原始数据移动到 snapshot空间里,这样就保证了所有的数据在snapshot创建时保持一致。而对于snapshot的读操作,如果是读取数据块是没有修改过的,那么会将读操作直接重定向到原始卷上,如果是要读取已经修改过的块,那么就读取拷贝到snapshot中的块。
创建snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效。
注意:采取CoW实现方式时,snapshot的大小并不需要和原始卷一样大,其大小仅仅只需要考虑两个方面:从shapshot创建到释放这段时间内,估计块的改变量有多大;数据更新的频率。一旦 snapshot的空间记录满了原始卷块变换的信息,那么这个snapshot立刻被释放,从而无法使用,从而导致这个snapshot无效。所以,非常重要的一点,一定要在snapshot的生命周期里,做完你需要做得事情。
我创建一个10G的逻辑卷,并在里面写入数据,创建一个快照
然后我在原始卷里写入数据:LiuDehua.mp4
让后我们可以看看快照的一些变化:
我们可以发现,快照的数据区发生了变化,比着之前有所增加,我们把快照挂载起来,看看里面的是否有Liudehua.mp4
我们发现快照区内依然保存的是原始数据,并没有发生变化,接下来我们将快照还原,我们在还原之前,必须卸载要恢复的文件系统和快照:
lvconvert --merge /dev/vg0/lv0-snap
我们可以知道,恢复快照以后,不仅是数据恢复了快照时的状态,快照也消失不见了。
除了恢复快照外,如果我们不想要快照了,我们也可以手动删除:
lvremove /dev/vg0/lv0-snap
补充(2108-3-1)
1)ext2/ext3/ext4文件系统的调整命令是resize2fs(增大和减小都支持)
lvextend -L 120G /dev/mapper/centos-home//增大至120G lvextend -L +20G /dev/mapper/centos-home//增加20G lvreduce -L 50G /dev/mapper/centos-home//减小至50G lvreduce -L -8G /dev/mapper/centos-home//减小8G resize2fs /dev/mapper/centos-home //执行调整
2)xfs文件系统的调整命令是xfs_growfs(只支持增大)
lvextend -L 120G /dev/mapper/centos-home //增大至120G lvextend -L +20G /dev/mapper/centos-home //增加20G xfs_growfs /dev/mapper/centos-home //执行调整 就是说:xfs文件系统只支持增大分区空间的情况,不支持减小的情况(切记!!!!!)。 硬要减小的话,只能在减小后将逻辑分区重新通过mkfs.xfs命令重新格式化才能挂载上,这样的话这个逻辑分区上原来的数据就丢失了。如果有重要文件,那就歇菜喽~~~