Last Updated on

前言

LVM 逻辑卷管理,是对磁盘分区进行管理的一种机制,建立在硬盘和分区之上,文件系统之下的一个逻辑层,可以提高磁盘分区管理的灵活性,基于lvm可以实现分区的扩容

许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份、删除相关数据,甚至被迫重新规划分区并重装操作系统,以满足应用系统的需要。

LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上、文件系统之下的一个逻辑层,可提高磁盘分区管理的灵活性。centos7默认安装的分区格式就是LVM逻辑卷的格式。

下面就lvm的原理和使用做详细的记录介绍

正文

平时,如果是机房中的线下服务器,都推荐使用lvm进行磁盘管理,可以更加灵活,当然一般大的公司可能会有更好的存储设备,进行统一储存,但这也不影响,推荐是能用lvm就用lvm。另外如果是像阿里云这种云平台,ECS服务器的磁盘默认都是直接挂载的,并没有使用lvm,因为这些磁盘都是可以在阿里云上直接在线扩容或者新增磁盘,以此解决磁盘的灵活问题。

在使用操作lvm之前,我们首先要理解lvm的原理。

1. lvm原理

lvm是一个基于磁盘和分区之上,文件系统之下的中间逻辑层,lvm的层级结构如下图:

如图,首先是最下层的物理分区: 物理分区就是通过 fdisk -l 命令查看到的就是物理磁盘和物理分区,是实际的物理设备,lvm则是基于此之上,在物理磁盘上可以划分分区,为物理分区,物理分区必须设置为lvm分区格式,才可以将这些物理分区,提取出来创建成物理卷。


物理卷: 也就是图中第二层,是通过物理分区创建而来,与物理分区一一对应。创建为物理卷后,则可以将物理卷合并为一个大的卷组。通过命令pvdisplay 查看物理卷


卷组: 也就是图中第三层,卷组是不同的物理卷合并而成,可以将所有物理卷的大小整合成一个大的卷组,相当于一个大的整合的逻辑磁盘,然后在卷组中就可以根据需求划分逻辑卷。通过命令vgdisplay 查看卷组。


逻辑卷: 也就是图中最顶层,逻辑卷是从卷组中划分出来的,相当于逻辑分区,此逻辑卷就可以直接格式化挂载到目录,就可以直接使用了。通过命令lvdisplay 查看逻辑卷。


你可能会问,为什么要这么做,有几点:

  1. 因为一般的物理磁盘你进行的物理分区,一旦确定,就不能修改大小,不灵活。
  2. 因为一般的物理磁盘大小有限,而物理分区只能是小于等于物理磁盘的大小,而通过lvm则可以将多个磁盘组合成一个大的卷组,相当于一个大的磁盘,就可以增大单个文件系统的容量大小。
  3. 管理方便,底层的磁盘管理由lvm帮你做了,你只需要将物理分区创建出物理卷加入到卷组,所有的管理都直接对卷组操作即可,简单方便。

通过lvm管理磁盘,非常的方便,当然也有不好的地方,那就是物理磁盘通过lvm联系在了一起,如果需要退出物理磁盘则不能直接暴力的拔出磁盘,而需要在lvm中退出后,才能拔出磁盘,不然会导致lvm故障,这方便可能会比直接挂载更加复杂一点,但为了灵活方便,这点代价还是能接受的。

2. 通过lvm新增创建分区

上面说了lvm的结构原理,下面就记录介绍如何使用lvm创建物理卷,卷组,逻辑卷等来使用。下面假设你新增了一块磁盘,详细说明如果将此磁盘进行纳入到lvm管理下。

创建物理分区

首先,需要将磁盘进行物理分区:

# 查看物理磁盘和分区情况
$ fdisk -l
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xdb5c4c82

   Device Boot      Start         End      Blocks   Id  System


# 可以看到有一块/dev/sdb的磁盘,大小21.5G,还没有服务分区
# 操作此磁盘,创建物理分区
$ fdisk /dev/sdb
Command (m for help): n    # n创建物理分区
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p    # p指定创建主分区, e为扩展分区
Partition number (1-4, default 1): 
First sector (2048-41943039, default 2048): 
Using default value 2048    # 默认起始位
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): 
Using default value 41943039    # 默认结束位为最后一位
Partition 1 of type Linux and of size 20 GiB is set

Command (m for help): w    # 保存操作结果
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

PS: 这里说明一下,sector为磁盘扇区,通过指定扇区区间来确定分区区域和大小。


创建物理卷

# 指定物理分区,创建为物理卷
$ pvcreate /dev/sdb1

# 查看物理卷
$ pvdisplay
# 简单查看
$  pvs

创建卷组

# 若没有卷组,则指定物理卷,创建卷组,卷组名为:centos
# 格式为:vgcreate 卷组名称 物理卷名称
$ vgcreate centos /dev/sdb1

# 若已有卷组,可将物理卷,加入到卷组,卷组名为:centos
$ 格式为: vgextend 卷组名称 物理卷名称
$ vgextend centos /dev/sdb1

# 查看卷组
$ vgdisplay
# 简单查看卷组
$ vgs

创建逻辑卷

# 指定卷组,创建逻辑卷,名称为:test-lv
$ 命令格式为: lvcreate -L 逻辑卷大小 -n 逻辑卷名称 卷组名称
$ lvcreate -L 5G -n test-lv centos

# 查看逻辑卷,注意:逻辑卷的LV Path会被用于格式化和挂载
$ lvdisplay
--- Logical volume ---
  LV Path                /dev/centos/test-lv
  LV Name                test-lv
  VG Name                centos
  LV UUID                sbGZQI-xVKe-QFJF-MV3Y-WpoW-Hucl-pqwQEg
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2019-08-07 23:05:44 -0700
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

# 简单查看逻辑卷
$ lvs

格式化并挂载

# 格式化逻辑卷,格式化为centos7默认的xfs格式,通过逻辑卷的LV Path指定逻辑卷
# centos7 的文件系统格式默认为xfs,centos6为ext4。
$ mkfs.xfs /dev/centos/test-lv

# 挂载到本地目录前,需要本地目录先存在,所以我们先创建目录,如/data
$ mkdir /data

# 挂载,使用逻辑卷的LV Path
$ mount /dev/centos/test-lv /data

# 挂载完成后,通过df -h 就能看到相应的文件系统
# 然后将挂载信息写入到/etc/fstab中,使其开机挂载
$ echo "/dev/centos/test-lv  /data  xfs  defaults  0  0" >> /etc/fstab

ok,到此就完成了将通过磁盘创建物理卷,创建卷组,加入卷组,创建逻辑卷并格式化挂载使用。

3. 调整逻辑分区大小

上面我们讲了如何通过lvm创建逻辑分区并使用,学会了使用lvm的开始,然后当我们使用了一段时间后,逻辑分区已经差不多占满时,就需要进行逻辑分区的扩容,或者一些不用的逻辑分区进行缩容。

特别注意的是:
resize2fs命令            针对的是ext2、ext3、ext4文件系统
xfs_growfs命令         针对的是xfs文件系统

# 首先通过df -hT 查看文件系统类型
$ df -hT
Filesystem                  Type      Size  Used Avail Use% Mounted on
/dev/sda3                   xfs        18G  4.7G   14G  27% /
devtmpfs                    devtmpfs  475M     0  475M   0% /dev
tmpfs                       tmpfs     489M  144K  489M   1% /dev/shm
tmpfs                       tmpfs     489M   14M  476M   3% /run
tmpfs                       tmpfs     489M     0  489M   0% /sys/fs/cgroup
/dev/sda1                   xfs       297M  144M  154M  49% /boot
tmpfs                       tmpfs      98M   20K   98M   1% /run/user/0
/dev/mapper/centos-test--lv xfs       5.0G   33M  5.0G   1% /data


# 先看看卷组,还有多少剩余空间,调整大小时,原本逻辑分区是从哪个卷组中划分的,那么调整大小默认也会使用此卷组中的空间。
$ vgdisplay
# 或者
$ vgs

PS:通过df -hT查出的文件系统路径跟逻辑分区路径不同,扩容时使用此文件系统路径,或者逻辑分区路径,都可以,一样的。

不同文件系统类型所对应的创建、检查、调整命令不同,下面就针对xfs和ext2/3/4文件系统的lvm分区空间的扩容和缩容的操作做详细记录:

1)ext2/ext3/ext4文件系统的调整命令是resize2fs(增大和减小都支持)

# 调整逻辑分区大小
# 增大至20G
$ lvextend -L 20G /dev/mapper/centos-test--lv
# 增加5G
$ lvextend -L +5G /dev/mapper/centos-test--lv
# 减小至10G
$ lvreduce -L 10G /dev/mapper/centos-test--lv
# 减小3G
$ lvreduce -L -3G /dev/mapper/centos-test--lv
# 执行调整
$ resize2fs /dev/mapper/centos-test--lv

2)xfs文件系统的调整命令是xfs_growfs(只支持增大)

# 调整逻辑分区大小
# 增大至20G
$ lvextend -L 20G /dev/mapper/centos-test--lv
# 增加5G
$ lvextend -L +5G /dev/mapper/centos-test--lv
# 执行调整
$ xfs_growfs /dev/mapper/centos-test--lv

这里我上面格式化的文件系统类型为xfs,所以我增大逻辑分区5G,执行上面命令,完整调整后,再次通过df -hT命令查看就会发现已经扩容到了10G。

此种方法进行的扩缩容,是不会影响到原有数据的,非常的方便好用。

PS:不管什么文件系统类型,在进行缩容前,都需要先卸载挂载,然后再缩容,再重新挂载

特别注意:xfs格式不是不支持缩容,而是xfs格式缩容后需要重新格式化才能继续挂载使用,且缩容前需要先卸载挂载,然后在缩容,然后格式化,然后再挂载。这会导致原本的数据丢失,如果是在要缩容,可以提前将数据转移备份好,缩容后再将数据迁移回来。

具体的操作,这里就不演示了,大致用到的命令如下:

# 卸载挂载
$ umount /dev/mapper/centos-test--lv
# 缩容
$ lvreduce -L -5G /dev/mapper/centos-test--lv
# 重新格式化,添加-f参数,强制重写。
$ mkfs.xfs /dev/mapper/centos-test--lv -f
# 重新挂载
# mount /dev/mapper/centos-test--lv /data

4. 安全退出磁盘

在日常使用中,磁盘老旧,故障,需要更换等问题也经常有,那么使用lvm做磁盘管理后,如何将磁盘安全退出,取出正在使用中的磁盘呢。

首先,磁盘中的数据,如何需要转移到新的磁盘中,那么首先,先插入新的磁盘,然后创建物理卷,将物理卷加入到相同的卷组,然后移动逻辑分区和数据到新的磁盘,然后将就旧的磁盘的物理卷移除出卷组,删除物理卷,就可以移除此磁盘了。

# 查看系统磁盘挂载情况
$ lsblk
NAME                MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda                   8:0    0   20G  0 disk 
├─sda1                8:1    0  300M  0 part /boot
├─sda2                8:2    0    2G  0 part [SWAP]
└─sda3                8:3    0 17.7G  0 part /
sdb                   8:16   0   20G  0 disk 
└─sdb1                8:17   0   20G  0 part 
  └─centos-test--lv 253:0    0    7G  0 lvm  
sdc                   8:32   0   20G  0 disk 
sr0                  11:0    1 1024M  0 rom 

# 如上可以看到在sdb磁盘中有一个sdb1的分区,下面有一个lvm的逻辑分区。
# 若要安全的退出磁盘,就需要将此磁盘中的所有数据迁移到新的磁盘中,当然如果你不要数据了,那可以不迁移,直接删除逻辑分区,从卷组中删除物理卷即可。
# sdc磁盘为刚添加的新磁盘,我们要做的就是将sdb的数据导入到sdc中,然后退出sdb磁盘

# 首先,创建sdc磁盘的物理分区和物理卷
# 操作过程不赘述了,查看最开头第一步新增创建分区的内容。
# 创建完成后,查看物理卷
$ pvs
  PV         VG     Fmt  Attr PSize  PFree 
  /dev/sdb1  centos lvm2 a--  20.00g 13.00g
  /dev/sdc1         lvm2 ---  20.00g 20.00g

# 可以看到新的物理卷还没有加入卷组,空间为全剩余
# 将新磁盘的物理卷加入到相同的卷组
$ vgextend centos /dev/sdc1

# 再查看物理卷,如下
$ pvs
  PV         VG     Fmt  Attr PSize  PFree 
  /dev/sdb1  centos lvm2 a--  20.00g 13.00g
  /dev/sdc1  centos lvm2 a--  20.00g 20.00g

# 下面将/dev/sdb1中的数据移动到卷组中的/dev/sdc1上
$ pvmove /dev/sdb1 /dev/sdc1

# 等待一段时间即可,如果数据量过大,可以用下面命令,放到后台执行。
$ pvmove /dev/sdb1 /dev/sdc1 2>error.log >normal.log &

# 完成后,查看物理卷信息,会发现sdb1上的数据都迁移到了sdc1上。
$ pvs
  PV         VG     Fmt  Attr PSize  PFree 
  /dev/sdb1  centos lvm2 a--  20.00g 20.00g
  /dev/sdc1  centos lvm2 a--  20.00g 13.00g

# 然后将/dev/sdb1的物理卷从卷组中删除
$ vgreduce centos /dev/sdb1

# 删除后,再看pvs,会发现此物理卷已经没有所属卷组了
$ pvs
  PV         VG     Fmt  Attr PSize  PFree 
  /dev/sdb1         lvm2 ---  20.00g 20.00g
  /dev/sdc1  centos lvm2 a--  20.00g 13.00g

# 然后删除物理卷
$ pvremove /dev/sdb1

ok,重复上面的步骤,将磁盘中所有涉及到lvm的物理分区都迁移数据并移除,然后磁盘的物理分区已经不再跟lvm有任何关联了,就可以直接安全的退出磁盘了。

结束

ok,到此就大致记录介绍完了lvm相关的磁盘管理,通过lvm实现了对物理卷,卷组,逻辑分区的新增,调整,删除等管理操作。

有任何问题,欢迎留言