LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。

      如果用标准分区在硬盘上创建了文件系统,为已有文件系统添加额外的空间是一种痛苦的体验。你只能在同一个物理硬盘的可用空间范围内调整分区大小。如果硬盘上没有地方了,你就必须再加一个硬盘,然后可能还需要将已有的文件系统移动到新的硬盘上。

     逻辑卷管理的核心在于如何处理安装在系统上的硬盘分区。在逻辑卷管理的世界里,硬盘称为物理卷PV。多个物理卷集中在一起可以形成一个卷组VG。逻辑卷管理系统将卷组视为一个整体的物理硬盘。在卷组VG上面则是可以创建逻辑卷LV,而这正是文件系统的分区环境,作用类似于Linux中的物理硬盘分区。Linux系统将逻辑卷LV视为物理分区。

基本的LVM管理概念

PV(Physical Volume)- 物理卷

物理卷在LVM中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备。

VG(Volumne Group)- 卷组

VG卷组建立在PV卷之上,一个VG卷组中至少要包括一个PV卷,在VG卷组建立之后可动态添加PV卷到VG卷组中。一个LVM中可以只有一个VG卷组,也可以拥有多个VG卷组。PV卷是用固定大小的物理区域PE(Physical Extent)来定义的。也可以认为PE就是PV卷的单位。PE的大小是在VG卷指定的。

LV(Logical Volume)- 逻辑卷

LV卷建立在VG卷组之上,VG卷组中的未分配空间可以用于建立新的LV卷,LV卷建立后可以动态地扩展和缩小空间。系统中的多个LV卷可以属于同一个VG卷组,也可以属于不同的多个VG卷组。

下图简要的表明了相互的关系和一些常用的指令。

lvm应用示意图.jpg

版本

选项

语法

说明


vgcreate

vgcreate [选项] VG卷组名 物理卷

创建VG卷



-s

指定PE大小,单位有以下

[bBsSkKmMgGtTpPeE]


vgscan

扫描存在的VG卷



vgdisplay

显示详细的VG卷信息



vgrename

vgrename 旧VG卷组名 新VG卷组名

#vgrename vg0 VG0


vgchange

vgchange [选项] VG卷组名

VG卷组状态设置



-an  禁用

-ay  启用



vgextend

将PV卷添加到VG卷中


版本

选项

语法

说明


lvcreate

lvcreate [选项] VG卷组名

创建LV卷



-n

指定lV卷名字



-l

指定创建的LV卷 的PE 数量



-L

指定创建的LV卷 的空间大小



-s

创建快照



-m

创建镜像卷


lvscan

扫描存在的LV卷



lvdisplay

显示详细的LV卷信息



lvrename

lvrename 旧LV卷名 新LV卷名



lvchange

lvchange [选项] LV卷组名

LV卷状态设置



-an  禁用

-ay  启用



lvextend

增加LV卷大小

需要使用resize2fs手动修整文件系统来

处理大小上的变化



-r

扩展卷的同时,把文件系统一并扩展,

不需要额外的resize2fs命令


lvreduce

减少LV卷大小

需要使用resize2fs手动修整文件系统来

处理大小上的变化

命令太多,仅仅列出一部分。剩下的可以man.

实验系统环境

实验环境:VMware Workstation Pro 14(试用版)

系统平台:

CentOS release 6.9 (Final)       内核  2.6.32-696.el6.x86_64

CentOS Linux release 7.4.1708 (Core) 内核 3.10.0-693.el7.x86_64 (方法基本与6一致)

LVM 版本:

CentOS6:lvm2-2.02.143-12.el6.x86_64

CentOS7:lvm2-2.02.171-8.el7.x86_64

设备类型:

vmware虚拟物理硬盘、分区、raid 设备

硬盘准备:

每个虚拟机,1GB X 4 ,2GB X 4

1.png

磁盘规划如下:

磁盘编号

分区1

分区2

分区格式

69-1G-1

500M

未分区

ext4

69-1G-2

1GB


ext4

69-1G-3

300M

700M

ext4

69-1G-4

未分区


初始状态

69-2G-5

RAID5


ext4

69-2G-6

RAID5


ext4

69-2G-7

RAID5


ext4

69-2G-8

RAID5

备用



由于基本分区是基础知识,我就不列出过程了,RAID分区可以参考我的另外一个贴子。Centos  软Raid创建与管理

创建好的LVM分别以2种命名方式,都是通过软链接指向真正的dm-X设备。

/dev/mapper/VG卷组名-LV卷名

/dev/VG卷组名/LV卷名

1.png

准备工作就绪,下面我们使用三种设备/dev/md0、/dev/sdb1、/dev/sdc1 来完成LVM实验。

1.png

创建PV卷

语法:   pvcreate /dev/设备名

#pvcreate /dev/md0 /dev/sdc1 /dev/sdb1

Physical volume "/dev/md0" successfully created

Physical volume "/dev/sdc1" successfully created

Physical volume "/dev/sdb1" successfully created

注意,创建PV卷的时候,有挂载的话请先umount原来的磁盘分区或设备,否则可能出现以下提示

Can't open /dev/md0 exclusively.  Mounted filesystem?

使用命令pvspvscan 查看简略信息

1.png

当然,也可以使用pvdisplay查看更详细的信息

1.png

创建VG卷

看到下图的PE相关的数字都是0了吗?因为,这些参数是在VG创建的时候指定的

1.png

一个物理PV卷只能同时分配给一个VG卷

#vgcreate -s 16M vg0 /dev/md0 /dev/sd{b1,c1}

Volume group "vg0" successfully created

命令解读:

-s 16M 指定PE的大小为16M。默认不指定是的4M

vg0 VG卷组名

/dev/md0 /dev/sd{b1,c1}  加入vg0卷组的PV卷名

此时就可以看到PE的相关信息了

1.png

使用vgdisplay查看详细信息

1.png

创建LV卷

#lvcreate -n LV0 -L 2G VG0

Logical volume "LV0" created.

命令解读:

-n LV0  指定LV卷名

-L 2G   指定LV0卷的容量为2GB

VG0    指定从VG0卷组中划分容量

使用lvs,lvscan,lvdisplay都可以查看LV卷相关的信息

1.png

从VG卷的信息里可以看到数值发生了变化

1.png

继续创建第二个LV卷,此时可以有多种方法指定大小了,

-L 指定剩下空间容量

-l 指定剩下的PE数量

-l +100%FREE 指定剩下的Free百分比

#lvcreate -n LV1 -l +100%FREE VG0

Logical volume "LV1" created.

1.png

查看存在LV数量

1.png

前面讲过创建LV卷后会有2种命令显示,其实都是通过软链接指向了真正的dm-X设备。因此,命名的时候,建议取有意义的名字。

1.png

创建LV卷上的文件系统

mkfs.ext4 /dev/VG0/LV0 -L "/mnt/LV0"

mkfs.ext4 /dev/VG0/LV1 -L "/mnt/LV1"

挂载使用

1.png

#mount -a

#df -h

Filesystem           Size  Used Avail Use% Mounted on

/dev/mapper/VG0-LV0  2.0G  3.0M  1.9G   1% /mnt/LV0

/dev/mapper/VG0-LV1  3.4G  6.9M  3.2G   1% /mnt/LV1

测试下性能(实际中会更可观),毕竟是VG卷的底层就是由多块磁盘构成的,与RAID 0相似

1.png

LVM的扩容操作

LVM最大的好处就是可以对磁盘进行动态管理,可以对LVM进行扩容或者缩小。扩容的时候基本不会对数据有影响,缩小的时候,如果存放的数据大于缩小后的空间,将需要提前将数据进行备份。

先扩展VG卷》再扩展LV卷

#vgs

VG   #PV #LV #SN Attr   VSize VFree

VG0    3   2   0 wz--n- 5.45g    0

想要扩容必须VG卷有空空余容量,既然现在没有空余,那我们就继续从其他设备或分区添加。这里有一个分区/dev/sdb2是空闲的,直接添加会发生什么情况呢?

#pvcreate /dev/sdb2

Device /dev/sdb2 not found (or ignored by filtering).

因此,如果想对磁盘分区进行LVM操作,必须使用分区工具(如fdisk)将此分区的分区类型变为8e  Linux LVM

Device Boot      Start         End      Blocks   Id  System

/dev/sdb2              66         130      522112+  8e  Linux LVM

记录通知内核更新分区信息

#partx -a /dev/sdb

#pvcreate /dev/sdb2

Physical volume "/dev/sdb2" successfully created

变成PV卷了,但是目前此PV卷并没有明确归属给哪个VG卷组使用

1.png

扩展VG卷

#vgextend VG0 /dev/sdb2

Volume group "VG0" successfully extended

命令解读:

VG0 指定扩容的VG卷组名

/dev/sdb2  指定添加哪个设备添加到扩容VG卷组

1.png

刚好多出了496M的容量,也就是刚才添加的/dev/sdb2

1.png

扩展LV卷

扩展前的LV卷

1.png

扩展的时候,就要注意了

直接指定数值,就是扩展到XX容量

+数值,就是在原有数值上增加多少容量

比如:

#lvextend -L 5G  /dev/VG0/LV0  将  LV0的容量扩展到5G

#lvextend -L +5G  /dev/VG0/LV0  将  LV0的容量增加5G

本例中将刚添加的空间全部划分到LV0

#lvextend -l +100%FREE /dev/VG0/LV0

Size of logical volume VG0/LV0 changed from 2.00 GiB (128 extents) to 2.48 GiB (159 extents).

Logical volume LV0 successfully resized.

1.png

上面的图确实LV空间增长了,但是使用df -h 命令时,却发现使用的容量并没有增长呢,怎么回事呢?

1.png

那是因为空间增加了,文件系统并没有扩展,因此需要使用

#resize2fs /dev/VG0/LV0

resize2fs 1.41.12 (17-May-2010)

Filesystem at /dev/VG0/LV0 is mounted on /mnt/LV0; on-line resizing required

old desc_blocks = 1, new_desc_blocks = 1

Performing an on-line resize of /dev/VG0/LV0 to 651264 (4k) blocks.

The filesystem on /dev/VG0/LV0 is now 651264 blocks long.

看到了吧,扩容是在线添加的,用户是不受影响的哦。

下图就确认了容量确实可以使用上增加的了。

1.png

LVM的缩减操作

缩减操作需要离线处理,缩减有风险,请注意备份数据。

缩减LV卷

本示例以缩减LV1为场景,目标是缩小到 2GB

1.png

A. umount 文件系统

#umount /mnt/LV1

B. 缩减文件系统

#resize2fs /dev/VG0/LV1 2G   注意,这里的2G是缩小到最终的容量

Please run 'e2fsck -f /dev/VG0/LV1' first.

C. 检查磁盘

#e2fsck -f /dev/VG0/LV1

D. 再次执行缩减文件系统操作

#resize2fs /dev/VG0/LV1 2G

E. 缩减LV

既然是缩小到2GB,那么就有2种方法来处理了。

1.指定目标最终的容量大小

使用命令:#lvreduce /dev/VG0/LV1 -L 2G

1.png

2.指定缩小多少到目标容量

使用命令:#lvreduce /dev/VG0/LV1 -L  -1.45G

1.png

Step E 和Step D 缩减的大小必须保持一致,2种不同的命令产生的最终空间不一致,这些算法上面的小差异,请注意。

1.png

看到了吧,lvs的减少,刚好是vgs的VFree增加。

1.png

F. 挂载查看

#mount -a

#df -h /dev/VG0/LV1

Filesystem                Size  Used Avail Use% Mounted on

/dev/mapper/VG0-LV1  2.0G  5.2M  1.9G   1% /mnt/LV1

至此,LV卷的缩减完成。

缩减VG卷

xfs文件系统不支持缩减操作。

查看哪个PV卷的PFree是完整的,也就是完全没有PE被使用。这样可以不用umount,直接缩减掉

1.png

#vgreduce VG0 /dev/sdb1

Removed "/dev/sdb1" from volume group "VG0"

此时/dev/sdb1已经不属于任何VG卷了

1.png

#vgs  (缩减前)

VG   #PV #LV #SN Attr   VSize VFree

VG0    4   2   0 wz--n- 5.94g      1.45g

#vgs (缩减后)

VG   #PV #LV #SN Attr   VSize VFree

VG0    3   2   0 wz--n- 5.45g     992.00m

如果没有一个完整的磁盘的PFree,则会提示在使用

#vgreduce VG0 /dev/sdb1

Physical volume "/dev/sdb1" still in use

如果发生以下的提示错误,那就是缩减过度,原来的文件系统属性中的block count数值大于缩减后的值,将会无法mount使用。只有lvextend回到合理值才会正常。

#dmesg|tail

EXT4-fs (dm-1): bad geometry: block count 905216 exceeds size of device (131072 blocks)

EXT4-fs (dm-1): bad geometry: block count 905216 exceeds size of device (131072 blocks)

[root@a69 LV1]#du -ah

16K ./lost+found

1001M ./lv1

1001M ./lv3

224M ./lv2

2.2G .

LVM的PV卷替换操作

为什么需要替换PV卷呢?因为LVM卷不像RAID设备,有容错功能,它只是一堆磁盘的集合,因此磁盘的健康度需要随时关注,以防止某块磁盘的损坏而导致数据的丢失。当硬件监控到某块磁盘设备提示异常时,一般可能会报警或亮黄灯。那么这个时候就需要将某个硬盘替换下来,那么这个上面关联的数据就要移走了。

关键要点:

A. 重要数据备份

这个是基本,用你喜欢的方式吧

B. 查看需要替换的磁盘上面的PV卷上的PE数量

本例中以替换/dev/sdb2为例子,一共需要31个PE

#pvdisplay

1.png

C.查看需要替换PV卷所属的VG卷是否有大于替换PV卷PE数量的容量

剩余空闲PE 63 > 31个,满足基本条件

1.png

#pvmove /dev/sdb1

/dev/sdb1: Moved: 0.0%

/dev/sdb1: Moved: 100.0%

/devsdb1的Free PE数量等于Total PE了,也就是完全腾空了数据。

1.png

把/dev/sdb1移出VG0卷组

#vgreduce VG0 /dev/sdb1

Removed "/dev/sdb1" from volume group "VG0"

把PV卷变为普通磁盘

#pvremove /dev/sdb1

Labels on physical volume "/dev/sdb1" successfully wiped

LVM的迁移至新主机操作

可能实际中,原来的LVM卷上的主机由于服役年限长了性能也不如新买的主机好,可靠性也没有新主机高,此时迁移操作就派上用场了。

提前准备好以下措施

1.提前考虑到新主机是否有同名的VG卷或LV卷,建议先在原主机把VG卷和LV卷使用先改名称。

2.备份好重要资料

开始迁移:

A.卸载迁移的LV卷

#umount /dev/VG-NEW/LV-NEW

B.禁用将要迁移的VG卷

#vgchange -an VG-NEW

0 logical volume(s) in volume group "VG-NEW" now active

C.将要迁移的VG卷变为导出状态

#vgexport VG-NEW

Volume group "VG-NEW" successfully exported

#lvdisplay

Volume group VG-NEW is exported

#lvs

Volume group VG-NEW is exported

1.png

1.png

D.将要迁移的VG卷对应的物理硬盘找到,拆卸并安装至新主机(不支持热拔插的就安心的关机吧)

这里以Centos 7为新主机,新主机增加了一块sdj磁盘

sdk    8:160  0    4G  0 disk

使用pvscan等命令将会发现主机上面的LVM卷信息

1.png

E.将迁移的VG导入

#vgimport VG-NEW

Volume group "VG-NEW" successfully imported

1.png

F.激活VG卷

#vgchange -ay VG-NEW

1 logical volume(s) in volume group "VG-NEW" now active

G.挂载使用

#mount /dev/VG-NEW/LV-NEW /mnt

数据同时也一起过来了,没有丢失

#cat old_lv_data

this old LV-NEW data

删除LVM

与创建的时候不一样,删除则是把顺序倒过来操作。

A.卸载挂载点

#umount /mnt

B.停止并删除LV卷

#lvchange -an /dev/VG-NEW/LV-NEW

#lvremove /dev/VG-NEW/LV-NEW

Logical volume "LV-NEW" successfully removed

C.停止并删除VG卷

#vgchange -an VG-NEW

0 logical volume(s) in volume group "VG-NEW" now active

#vgremove VG-NEW

Volume group "VG-NEW" successfully removed

D.删除PV卷

#pvremove /dev/sdk

Labels on physical volume "/dev/sdk" successfully wiped.

LVM快照snapshot

LVM允许你创建在线逻辑卷的可读写快照。有了快照,就可以删除原先的逻辑卷,然后将快照作为替代挂载上。这个功能对快速故障转移可涉及修改数据的程序试验(如果失败,需要恢复修改过的数据)非常有用。

快照就是将当时的系统信息记录下来,就好像照相一样,未来若有任何资料变动了,则原始资料会被移动到快照区,没有被改动的区域则由快照区与档案系统共享。

LVM 系统快照区域的备份示意图(虚线为档案系统,长虚线为快照区)

1.png

左图为最初建立系统快照区的状况,LVM 快照区域 (左图的左侧三个PE 区块) 作为数据存放处。此时快照区内并没有任何数据,而快照区与系统区共享所有的PE 数据, 因此你会看到快照区的内容与文件系统是一模一样的。等到系统运作一阵子后,假设A 区域的数据被更动了 (上面右图所示),则更动前系统会将该区域的数据移动到快照区,所以在右图的快照区被占用了一块PE 成为A,而其他B~I 的区块则还是与文件系统共享。

由于快照区与原本的LV共用很多PE的区块,因此快照与被快照的LV必须在同一个VG卷。创建快照的时候的文件数量不能高于快照区的实际容量

1.png

本次实例以操作VG0卷为例,此VG0卷一共2GB容量,以下约定名称以便清晰讲解

1.png

#lvcreate -n LV0-snapshot -l 100%FREE -s -p r /dev/VG0/LV0

命令解读:

-n LV0-snapshot   指定创建的快照的名称

-l 100%FREE     指定快照使用的容量,这里是使用VG卷组中剩余容量100%

-p r      指定权限为只读

/dev/VG0/LV0       指定为哪个LV卷生成快照

1.png

A区的数据如下:

#cat a b nmu

a  》aaa

b  》bbb

nmu 》123456

B区数据挂载到一个目录,看下。(xfs文件系统创建了快照后是无法挂载的)

[root@a69 LV0-Snapshot]#ll

total 12

-rw-r--r--. 1 root root 4 Dec 12 20:11 a

-rw-r--r--. 1 root root 4 Dec 12 20:11 b

-rw-r--r--. 1 root root 7 Dec 12 20:11 nmu

咦,不是说刚创建的时候是空的状态吗?怎么回事。快照区内并没有任何数据,而快照区与系统区共享所有的PE 数据, 因此你会看到快照区的内容与文件系统是一模一样的。现在可以深刻理解这段话的意思了吧。

测试开始了

A区的a文件修改一下

#echo 123 >> a

#cat a

aaa

123

#cat /mnt/LV0-Snapshot/a   B区的文件内空还是原来最旧的那个版本

aaa

A区的b文件删除了

#rm b

rm: remove regular file `b'? y

#cat /mnt/LV0-Snapshot/b   B区的文件还在且内空还是原来最旧的那个版本

bbb

A区的创建一个新文件

#echo newfile > newfile

#cat newfile

ll /mnt/LV0-Snapshot  B区并没有新增加的文件

-rw-r--r--. 1 root root 4 Dec 12 20:11 a

-rw-r--r--. 1 root root 4 Dec 12 20:11 b

-rw-r--r--. 1 root root 7 Dec 12 20:11 nmu

由此可以明确的看出来,快照区的内容就是当时创建快照时命令一回车一下去的时候,当时状态数据的完整备份。

现在把A区的文件全部删除,并且再创建一个全新的文件。

#rm -rf *

#echo newfile2 > newfile2

用快照数据恢复,在恢复之前,得把A和B都umount。

#umount /mnt/LV0

#umount /mnt/LV0-Snapshot/

#lvconvert --merge /dev/VG0/LV0-snapshot

Merging of volume LV0-snapshot started.

LV0: Merged: 100.0%

Merge of snapshot into logical volume LV0 has finished.

Logical volume "LV0-snapshot" successfully removed

A区的数据回来了,可是最后创建的新文件却没了。覆盖性的恢复呢

#ls

a  b  nmu

#cat *

aaa

bbb

123456

另外,快照卷也没有了,到这里,明白了。快照是用自身的数据来顶替原来的LV卷的。

1.png


LVM镜像

通过LVM安装文件系统并不意味着不会再出问题。和物理分区一样,LVM逻辑卷也容易受到断电和磁盘故障影响。一旦文件系统损坏,就有可能再也无法恢复。

LVM快照功能提供了一些安慰,你可以随时的创建逻辑卷的备份副本,但对有些环境来说可能还不够。对于涉及大量数据变动的系统,比如你的数据库服务器,自上次快照之后可能要存储成百上千条记录。

这个问题的一个解决方法就是LVM镜像。镜像是一个实时更新的逻辑卷的完整副本。

一旦LVM镜像同步完成,LVM会为文件系统的每次写操作执行2次写入:1次写入到逻辑卷,1次写入镜像卷。这个过程会降低系统的写入性能。这是一种折中的方案,如果原始逻辑卷因为某些原因损坏了,手头上也已经有一个完整的最新的副本。

以下实验待续吧~~~

必要条件,创建镜像的时候,必须在同一个VG卷组里,且这个卷组至少有2块PV卷,被当作镜像盘的PV卷容量需要大于数据盘PV卷。

创建镜像卷的时候,会创建镜像盘,镜像日志盘

#pvs

PV         VG   Fmt  Attr PSize    PFree

 /dev/sdf   VG0  lvm2 a--u    2.00g 1020.00m      数据盘

/dev/sdg   VG0  lvm2 a--u    2.00g    2.00g          镜像盘

/dev/sdi   VG0  lvm2 a--u    2.00g    2.00g           镜像盘

/dev/sdj   VG0  lvm2 a--u    4.00g    4.00g           镜像日志盘

#lvcreate -m 1 -n mirror-VG0 -l 100%FREE VG0 /dev/sd{g,i,j}

Logical volume "mirror-VG0" created.

命令解读:

-m 1 创建镜像卷

-n mirror-VG0 指定镜像卷名字

-l 100%FREE  指定镜像卷容量

VG0 指定镜像哪个卷

/dev/sd{g,i,j}  镜像卷包含的PV卷

1.png

移除失效的VG卷

#vgreduce --removemissing --force VG0

Couldn't find device with uuid 525vmy-4JK7-dKEM-crOB-lFaZ-pbYA-iCdVyo.

Couldn't find device for segment belonging to VG0/LV0 while checking used and assumed devices.

Couldn't find device for segment belonging to VG0/LV0 while checking used and assumed devices.

Removing partial LV LV0.

Logical volume "LV0" successfully removed

Wrote out consistent volume group VG0

#lvs

LV         VG   Attr       LSize Pool Origin Data%  Meta%  Move Log               Cpy%Sync Convert

mirror-VG0 VG0  mwi-a-m--- 3.99g                                [mirror-VG0_mlog] 100.00