目录
一、前言
LVM (Logical Volume Manager,逻辑卷管理器)是一个存储虚拟化工具,它可以在多个物理存储空间上建立一个虚拟的存储空间。
而使用虚拟存储空间最大的好处就是可以消除物理存储空间的变化对上层文件系统的影响,为上层文件系统提供灵活的伸缩性。
本文纯属个人学习经验分享,不保证完全正确。仅供参考!
二、LVM 结构简介
下面是我手画的结构图:
LVM 分为三个层,分别是:物理卷(PV)层、卷组(VG)层、逻辑卷(LV)层。
物理卷和物理分区建立一一映射的关系,负责物理层与虚拟层的对接。
卷组是由若干物理卷组成的虚拟存储空间。可通过调节它所包含的物理卷数目来改变它的大小。卷组可以看成是一块可以随意调整大小的虚拟磁盘。
和物理磁盘一样,卷组也有存储区块这个概念。卷组的存储区块称为物理扩展(PE)区块,默认大小为 4M。在早期的 LVM 版本中,一个卷组最多只能有 65534 个 PE 区块,但如今早已没有这个限制了。
而逻辑卷则可以看作是这块虚拟磁盘(卷组)上的分区,其大小同样也是可以灵活改变的,并且它也是无序的(物理磁盘要讲究分区顺序)。
三、实验环境
- 虚拟机:VMware Fusion 10.1.1
- 操作系统:CentOS 7.5.1804
- 虚拟磁盘:
sda
、sdb
、sdc
、sdd
(大小均为 8T) - 挂载点:
/mnt
四、创建 LVM 文件系统
4.1 初始化磁盘
在使用 LVM 之前,需要使用 parted 分区工具给磁盘创建一个 LVM 分区(这里使用 GPT 分区表)。
常用命令
parted -s <磁盘> mklabel gpt mkpart ext4 0% 100% set 1 lvm on
...
例如
初始化 sda
、sdb
、sdc
、sdd
四个磁盘。
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 分区> ...]
⚠️ 八、注意事项
- 由于 LVM 本身并不提供冗余性?(不确定,因为看到 LVM 相关命令有 RAID 的选项,但找不到资料)所以建议在底层做好冗余备份工作(例如用 mdadm 做软 RAID)。
- 请做好
/etc/lvm/
这个目录的备份工作,特别是/etc/lvm/backup/
。因为/etc/lvm/
这个目录存储了整个系统 LVM 的配置信息,一旦丢失将会非常麻烦。最起码也要备份好/etc/lvm/backup/
。