CentOS 7 LVM 的基本用法


一、前言

LVM (Logical Volume Manager,逻辑卷管理器)是一个存储虚拟化工具,它可以在多个物理存储空间上建立一个虚拟的存储空间。

而使用虚拟存储空间最大的好处就是可以消除物理存储空间的变化对上层文件系统的影响,为上层文件系统提供灵活的伸缩性。

本文纯属个人学习经验分享,不保证完全正确。仅供参考!


二、LVM 结构简介

下面是我手画的结构图:

LVM 分为三个层,分别是:物理卷(PV)层、卷组(VG)层、逻辑卷(LV)层。

物理卷和物理分区建立一一映射的关系,负责物理层与虚拟层的对接。

卷组是由若干物理卷组成的虚拟存储空间。可通过调节它所包含的物理卷数目来改变它的大小。卷组可以看成是一块可以随意调整大小的虚拟磁盘。

和物理磁盘一样,卷组也有存储区块这个概念。卷组的存储区块称为物理扩展(PE)区块,默认大小为 4M。在早期的 LVM 版本中,一个卷组最多只能有 65534 个 PE 区块,但如今早已没有这个限制了。

而逻辑卷则可以看作是这块虚拟磁盘(卷组)上的分区,其大小同样也是可以灵活改变的,并且它也是无序的(物理磁盘要讲究分区顺序)。


三、实验环境

  • 虚拟机:VMware Fusion 10.1.1
  • 操作系统:CentOS 7.5.1804
  • 虚拟磁盘:sdasdbsdcsdd(大小均为 8T)
  • 挂载点:/mnt

四、创建 LVM 文件系统

4.1 初始化磁盘

在使用 LVM 之前,需要使用 parted 分区工具给磁盘创建一个 LVM 分区(这里使用 GPT 分区表)。

常用命令

parted -s <磁盘> mklabel gpt mkpart ext4 0% 100% set 1 lvm on
...

例如

初始化 sdasdbsdcsdd 四个磁盘。

parted -s /dev/sda mklabel gpt mkpart ext4 0% 100% set 1 lvm on
parted -s /dev/sdb mklabel gpt mkpart ext4 0% 100% set 1 lvm on
parted -s /dev/sdc mklabel gpt mkpart ext4 0% 100% set 1 lvm on
parted -s /dev/sdd mklabel gpt mkpart ext4 0% 100% set 1 lvm on

4.2 创建物理卷

常用命令

pvcreate <LVM 分区> [<LVM 分区> ...]

例如

将上面四个 LVM 分区设为物理卷。

pvcreate /dev/sd[abcd]1

运行结果:

Physical volume "/dev/sda1" successfully created.
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdd1" successfully created.

# 物理卷创建成功

4.3 创建卷组

常用命令

vgcreate <卷组名> <LVM 分区> [<LVM 分区> ...]

说明
⦁ 如果系统检测到该 LVM 分区还不是物理卷的话,它会自动将其设为物理卷。也就是说上一步可省略。

例如

创建一个名为 vg_demo 的卷组,包含上面四个物理卷。

vgcreate vg_demo /dev/sd[abcd]1

运行结果:

Volume group "vg_demo" successfully created

# 卷组创建成功

4.4 创建逻辑卷

常用命令

第一种用法:指定逻辑卷大小

lvcreate -L <大小> -n <逻辑卷名> <卷组名>

第二种用法:指定逻辑卷使用 PE 块的数量

lvcreate -l <PE 块数量> -n <逻辑卷名> <卷组名>

说明
<PE 块数量> 可以写为 <百分比>%FREE 这种形式,表示使用卷组中多少百分比的空闲 PE 块。

例如

在卷组 vg_demo 上创建一个名为 lv_demo 的逻辑卷,要求空间尽量大。

lvcreate -l 100%FREE -n lv_demo vg_demo

运行结果:

Logical volume "lv_demo" created.

# 逻辑卷创建成功

4.5 创建文件系统

常用命令

mkfs.<文件系统类型> /dev/<卷组名>/<逻辑卷名> 

例如

在逻辑卷 lv_demo 上创建一个 XFS 文件系统。

mkfs.xfs /dev/vg_demo/lv_demo 

运行结果:

meta-data=/dev/vg_demo/lv_demo   isize=512    agcount=32, agsize=268435455 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=8589930496, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=521728, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
# XFS 文件系统创建成功

4.6 挂载逻辑卷

常用命令

mount /dev/<卷组名>/<逻辑卷名> <挂载点>

例如

把逻辑卷 lv_demo 挂载到 /mnt 上。

mkfs.xfs /dev/vg_demo/lv_demo 

五、检查 LVM 文件系统

5.1 显示所有物理卷的状态

命令用法

pvdisplay

运行结果(基于上面的环境):

  --- Physical volume ---
  PV Name               /dev/sda1                                   ← 物理卷路径
  VG Name               vg_demo                                     ← 所属的卷组
  PV Size               <8.00 TiB / not usable 2.00 MiB             ← 物理卷大小
  Allocatable           yes (but full)                              ← 是否可分配 
  PE Size               4.00 MiB                                    ← PE 块大小
  Total PE              2097151                                     ← PE 块总数
  Free PE               0                                           ← 空闲的 PE 块
  Allocated PE          2097151                                     ← 已分配的 PE 块
  PV UUID               B7kqXu-0b28-EcxY-nWoE-bqIc-22nS-eNNmcC      ← UUID

  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               vg_demo
  PV Size               <8.00 TiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              2097151
  Free PE               0
  Allocated PE          2097151
  PV UUID               uMOB8J-nRYm-SntZ-lh3L-u8W2-CpRg-VCEHZ7

  --- Physical volume ---
  PV Name               /dev/sdc1
  VG Name               vg_demo
  PV Size               <8.00 TiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              2097151
  Free PE               0
  Allocated PE          2097151
  PV UUID               QWtdhE-uGz1-n3F8-J72z-yWsz-eSP5-6a4kFF

  --- Physical volume ---
  PV Name               /dev/sdd1
  VG Name               vg_demo
  PV Size               <8.00 TiB / not usable 2.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              2097151
  Free PE               0
  Allocated PE          2097151
  PV UUID               wNqcL9-I0gh-nHn3-KDxT-swd6-iixO-CEGqc8

5.2 显示所有卷组的状态

命令用法

vgdisplay

运行结果(基于上面的环境):

  --- Volume group ---
  VG Name               vg_demo                                     ← 卷组名
  System ID       
  Format                lvm2                                        ← 格式
  Metadata Areas        4 
  Metadata Sequence No  4
  VG Access             read/write                                  ← 卷组权限
  VG Status             resizable
  MAX LV                0
  Cur LV                1                                           ← 当前逻辑卷数目
  Open LV               1
  Max PV                0
  Cur PV                4                                           ← 当前包含物理卷数目
  Act PV                4
  VG Size               <32.00 TiB                                  ← 卷组大小
  PE Size               4.00 MiB                                    ← PE 块大小
  Total PE              8388604                                     ← PE 块总数
  Alloc PE / Size       8388604 / <32.00 TiB                        ← 已分配的 PE 块/大小
  Free  PE / Size       0 / 0                                       ← 空闲的的 PE 块/大小
  VG UUID               A29ga2-mbT8-HxPm-cYgF-JHhv-jE3V-hicWwd      ← UUID

5.3 显示所有逻辑卷的状态

命令用法

lvdisplay

运行结果(基于上面的环境):

  --- Logical volume ---
  LV Path                /dev/vg_demo/lv_demo                       ← 逻辑卷路径
  LV Name                lv_demo                                    ← 逻辑卷名                                                       
  VG Name                vg_demo                                    ← 所属卷组名
  LV UUID                ukP2Bq-lTwd-XVlX-JrAv-FleH-ktii-i0SVNf     ← UUID
  LV Write Access        read/write                                 ← 逻辑卷权限
  LV Creation host, time centos-mac, 2018-05-15 21:43:21 +0800
  LV Status              available
  # open                 1
  LV Size                <32.00 TiB                                 ← 逻辑卷大小
  Current LE             8388604
  Segments               4
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

5.4 检查文件系统大小

命令用法

df -h <挂载点>

例如

df -h /mnt/

运行结果:

文件系统                     容量  已用  可用 已用% 挂载点
/dev/mapper/vg_demo-lv_demo   32T   34M   32T    1% /mnt

# 文件系统的容量是四块磁盘的总容量

六、扩展 LVM 文件系统

6.1 初始化新磁盘

(常用命令同 4.1)

例如

初始化 sde 这块新的磁盘(大小为 8T)。

parted -s /dev/sde mklabel gpt mkpart ext4 0% 100% set 1 lvm on

6.2 创建新物理卷

(常用命令同 4.1)

例如

在新创建的 LVM 分区上创建物理卷。

pvcreate /dev/sde1

运行结果:

Physical volume "/dev/sde1" successfully created.

# 物理卷创建成功

6.3 将新物理卷添加到现有卷组中

命令用法

vgextend <卷组名> <LVM 分区> [<LVM 分区> ...]

例如

将刚才新创建的物理卷添加到 vg_demo 卷组中。

vgextend vg_demo /dev/sde1

运行结果:

Volume group "vg_demo" successfully extended

# 卷组扩展成功

6.4 扩展现有逻辑卷

常用命令

第一种用法:指定逻辑卷扩展的大小

lvextend -L +<大小> <卷组名>/<逻辑卷名>

第二种用法:指定逻辑卷增加的 PE 块的数量

lvextend -l +<PE 块数量> <卷组名>/<逻辑卷名>

说明
<PE 块数量> 可以写为 <百分比>%FREE 这种形式,表示增加卷组中多少百分比的空闲 PE 块。

例如

扩展 lv_demo 逻辑卷到最大。

lvextend -l +100%FREE vg_demo/lv_demo

运行结果:

Size of logical volume vg_demo/lv_demo changed from <32.00 TiB (8388604 extents) to <40.00 TiB (10485755 extents).
Logical volume vg_demo/lv_demo successfully resized.

# 逻辑卷扩展成功

6.5 扩展文件系统并检查结果

说明
⦁ 由于不同文件系统扩展的方法各不相同,所以下面就直接举例子了。

例如

lv_demo 上面的 XFS 文件系统扩展到最大,并检查结果。

说明
⦁ XFS 文件系统只支持在线(处于挂载状态)扩展。

xfs_growfs /dev/vg_demo/lv_demo && df -h /mnt

运行结果:

meta-data=/dev/mapper/vg_demo-lv_demo isize=512    agcount=32, agsize=268435455 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=8589930496, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=521728, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 8589930496 to 10737413120
文件系统                     容量  已用  可用 已用% 挂载点
/dev/mapper/vg_demo-lv_demo   40T   34M   40T    1% /mnt
# 文件系统的容量是五块磁盘的总容量,文件系统扩展成功

七、缩小 LVM 文件系统

说明
⦁ 由于缩小 LVM 文件系统在现实中用得比较少,所以这部分就不举例子了。

7.1 缩小文件系统

⚠️ 注意
1. 在缩小逻辑卷之前,一定要先缩减上层文件系统的大小至不超过逻辑卷缩小后的大小,否则整个文件系统将会损坏!
2. 部分上层文件系统不支持缩小(例如 XFS)。
3. 大部分文件系统不支持在线(处于挂载状态)缩小。

说明
⦁ 由于不同文件系统缩小的方法各不相同,所以这里就不写具体命令了。

7.2 缩小或删除逻辑卷

常用命令

缩小逻辑卷:

lvreduce -L -<减少的大小> <卷组名>/<逻辑卷名> 

删除逻辑卷:

lvremove <卷组名>/<逻辑卷名>

7.3 缩小或删除卷组

常用命令

删除卷组中的物理卷:

(必须先把卷组中要删除的物理卷上的所有数据移到卷组中的其他物理卷中去)

pvmove <LVM 分区> && vgreduce <卷组名> <LVM 分区>

删除卷组:

vgremove <卷组名>

7.4 删除物理卷

常用命令

pvremove <LVM 分区> [<LVM 分区> ...]

⚠️ 八、注意事项

  1. 由于 LVM 本身并不提供冗余性?(不确定,因为看到 LVM 相关命令有 RAID 的选项,但找不到资料)所以建议在底层做好冗余备份工作(例如用 mdadm 做软 RAID)。
  2. 请做好 /etc/lvm/ 这个目录的备份工作,特别是 /etc/lvm/backup/。因为 /etc/lvm/ 这个目录存储了整个系统 LVM 的配置信息,一旦丢失将会非常麻烦。最起码也要备份好 /etc/lvm/backup/

九、参考文献

  1. 逻辑卷轴管理员 (Logical Volume Manager) – 鸟哥的 Linux 私房菜
  2. LVM (简体中文) – ArchWiki

发表评论

电子邮件地址不会被公开。