前言
Hello,各位码友,大家好。经过我昨天的装*,不,讲解,你是否对Linux的存储管理有一定的认知了呢?今天我们将一起学习LVM,也就是Logical Volume Manager(逻辑卷管理),一起来学习一下吧。
希望有所帮助。
LVM逻辑卷概述
学习开始之前然爱过我们一起先做个梦,梦见有一天随着公司的业务的增加,文件系统负载就会越来越大,最后,遇到了空间不足的情况。
好,现在可以梦中惊醒然后继续听我瞎白话了。
倘若真的有一天我们遇到了空间不足的这种情况,而我们还在使用传统的分区方式进行磁盘管理,就不得不将现有的所有分区全部删除,并且重新规划新的存储解决方案。其实从一开始我们就需要一种管理机制,他能帮助我们动态的管理存储,而LVM就提供了这种功能。
LVM(Logical Volume Manager 逻辑卷管理)是基于内核的一种逻辑卷管理器,LVM适合于管理大存储设备,并允许用户动态调整文件系统的大小。此外,LVM的快照后功能可以帮助我们快速备份数据。LVM为我们提供了逻辑概念上的磁盘,使文件系统不再关心底层物理磁盘的概念。
使用LVM创建逻辑卷前,我们需要先了解几个概念:
- 物理卷(Physical Volume,PV):物理卷是LVM的最底层概念,是LVM逻辑存储块,物理卷与磁盘分区是逻辑的对应关系。多个LVM物理卷可以合并或拆分,从而实现容量的扩容和缩减。LVM提供了命令工具可以将分区转换为物理卷,通过组合物理卷可以生成卷组。
- 卷组(Volume Group,VG):卷组是LVM逻辑概念上的磁盘设备,通过将单个或者多个物理卷组合后生成卷组。卷组的大小取决于物理卷的容量以及个数。在CentOS 7系统中,对容量和个数没有限制。
- 物理长度(Physical Extent,PE):物理长度是将物理卷组合为卷组后,所划分的最小存储单位,即逻辑意义上磁盘的最小存储单元。LVM默认PE大小为4MB。
- 逻辑卷(Logical Volume,LV):逻辑卷就是LVM逻辑意义上的分区,我们可以指定从卷组中提取多少容量来创建逻辑卷,最后对逻辑卷格式化并挂载使用。
了解了上面的概念之后接下来饿哦们要学习具体使用的命令。将普通分区转化为物理卷的命令是pvcreate
,将物理卷组合为卷组的命令式vgcreate
,从卷组中提取容量创建逻辑卷的命令是lvcreate
。创建完成后可以分别使用pvdisplay
、vgdisplay
、lvdisplay
查看效果。
1.pvcreate
描述:使用LVM对磁盘或分区进行初始化
用法:`pvcreate [选项] 物理卷 [物理卷…]
举个栗子:
[root@localhost ~]# pvcreate /dev/sdc4 /dev/sde
[root@localhost ~]# pvcreate /dev/sdb{1,2,3}
2.vgcreate
描述:创建卷组
用法:vgcreate [选项] 卷组名称 物理设备路径 [物理设备路径...]
举个栗子:
[root@localhost ~]# vgcreate test_vg1 /dev/sdb5 /dev/sdb6
[root@localhost ~]# vgcreate test_vg2 -s 16M /dev/sdc5 /devsdc6 #-s参数用来指定PE大小为16MB
3.lvcreate
描述:从卷中提取存储空间,创建逻辑卷
用法:lvcreate [选项] 卷组名称或路径 [物理卷或路径]
选项:
-l
:指定使用多少个卷组中的PE创建逻辑卷。PE的容量在创建卷组时已经指定。
-L
:直接指定逻辑卷的容量大小,单位可以是b(B)、s(S)、k(K)、m(M)、g(G)、t(T)、(P)、或e(E)。
-n
:指定逻辑卷名称
举个栗子:
[root@localhost ~]# lvcreate -L 2G test_lv1 test_vg1 #从test_vg1卷组中提取2GB容量,创建名称为test_lv1的逻辑卷
[root@localhost ~]# lvcreate -l 200 -n test_lv2 test_vg2 #使用200个PE创建逻辑卷
[root@localhost ~]# lvcreate -L 2G -n test_lv1 test_vg1 /dev/sdb6 #指定使用test_vg1卷组中的/dev/sdb6这个物理卷的空间,创建名称为test_lv1的逻辑卷
创建LVM分区实例
这里我们使用sdb这块20G的硬盘创建4个10G的分区,并使用者四个分区创建一个 名称为test_vg的卷组,最后从该卷组中创建出两个大小为12G的逻辑卷,名称为test_web、test_data。
1.使用fdisk创建分区
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xed17ef3b 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
分区号 (1-4,默认 1):1
起始 扇区 (2048-167772159,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-167772159,默认为 167772159):+10G
分区 1 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
分区号 (2-4,默认 2):2
起始 扇区 (20973568-167772159,默认为 20973568):
将使用默认值 20973568
Last 扇区, +扇区 or +size{K,M,G} (20973568-167772159,默认为 167772159):+10G
分区 2 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p): p
分区号 (3,4,默认 3):3
起始 扇区 (41945088-167772159,默认为 41945088):
将使用默认值 41945088
Last 扇区, +扇区 or +size{K,M,G} (41945088-167772159,默认为 167772159):+10G
分区 3 已设置为 Linux 类型,大小设为 10 GiB
命令(输入 m 获取帮助):n
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e): e
已选择分区 4
起始 扇区 (62916608-167772159,默认为 62916608):
将使用默认值 62916608
Last 扇区, +扇区 or +size{K,M,G} (62916608-167772159,默认为 167772159):
将使用默认值 167772159
分区 4 已设置为 Extended 类型,大小设为 50 GiB
命令(输入 m 获取帮助):t
分区号 (1-5,默认 5):1 #指定分区编号
Hex 代码(输入 L 列出所有代码):8e #修改分区标签为LVM
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):t
分区号 (1-5,默认 5):2
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):t
分区号 (1-5,默认 5):3
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):t
分区号 (1-5,默认 5):4
Hex 代码(输入 L 列出所有代码):8e
You cannot change a partition into an extended one or vice versa.
Delete it first.
分区 4 的类型未更改:Extended
命令(输入 m 获取帮助):t
分区号 (1-5,默认 5):5
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:85.9 GB, 85899345920 字节,167772160 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xd3d742b7
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 20973567 10485760 8e Linux LVM
/dev/sdb2 20973568 41945087 10485760 8e Linux LVM
/dev/sdb3 41945088 62916607 10485760 8e Linux LVM
/dev/sdb4 62916608 167772159 52427776 5 Extended
/dev/sdb5 62918656 83890175 10485760 8e Linux LVM
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@localhost ~]# partprobe /dev/sdb
2.使用pvcreate创建物理卷并使用pvdisplay查看结果
[root@localhost ~]# pvcreate /dev/sdv{1,2,3,5}
[root@localhost ~]# pvdisplay
--- NEW Physical volume ---
PV Name /dev/sdc
VG Name
PV Size 20.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID qov2Ie-tBfU-g0bm-e2fE-xEUb-SO5X-N4WSYF
3.使用vgcreate创建卷组并使用vgdisplay查看结果
[root@localhost ~]# vgcreate test_vg /dev/sdb{1,2,3,5}
[root@localhost ~]# vgdisplay
--- Volume group ---
VG Name test_vg
System ID
Format lvm2
Metadata Areas 4
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 4
Act PV 4
VG Size 39.98 GiB
PE Size 4.00 MiB
Total PE 10236
Alloc PE / Size 3072 / 12.00 GiB
Free PE / Size 7164 / 27.98 GiB
VG UUID Uqz4de-BOnt-ud44-I0FX-27wV-5ivj-AiBnTl
4.使用lvcreate创建逻辑卷并使用lvdisplay查看结果
[root@localhost ~]# lvcreate -n test_web -L 12G test_vg
[root@localhost ~]# lvcreate -n test_data -l 3072 test_vg
[root@localhost ~]# lvdisplay
--- Logical volume ---
LV Path /dev/test_vg/test_web
LV Name test_web
VG Name test_vg
LV UUID Tsg84q-GqJD-Qjq2-KxT4-2nF9-mQhX-KPTgqe
LV Write Access read/write
LV Creation host, time localhost.localdomain, 2021-04-09 09:57:08 +0800
LV Status available
# open 0
LV Size 12.00 GiB
Current LE 3072
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:2
5.格式化并挂载
[root@localhost ~]# mkfs.xfs /dev/test_vg/test_web
[root@localhost ~]# mkfs.xfs /dev/test_vg/test_data
[root@localhost ~]# mkdir -p /test/{web,data}
[root@localhost ~]# cat >> /etc/fstab <<EOF
> /dev/test_vg/test_data /test/data xfs defaults 0 0
> /dev/test_vg/test_web /test/web xfs defaults 0 0
> EOF
[root@localhost ~]# mount -a
[root@localhost ~]# df -h #查看文件系统挂载状态
修改LVM分区容量
随着时间的推移,又出现了新的问题。逻辑卷test_data现有的存储空间已经不能满足企业大业务的需要,我们需要将存储容量增大至24GB时,LVM随时可以帮助我们动态调整文件系统的大小。由于test_vg这个卷组还有足够的剩余空间可以划分给逻辑卷,所以我们可以直接使用lvextend
命令调整逻辑卷大小。但这个命令仅调整逻辑卷大小,使用该命令调整完逻辑卷大小后,还需要使用xfs_growfs
命令更新文件系统的大小,具体方法如下:
[root@localhost ~]# lvextend -L +12G /dev/test_vg/test_data #扩容逻辑卷
[root@localhost ~]# lvs #查看逻辑卷已经扩容完成
[root@localhost ~]# df -h #查看文件系统没有变化
[root@localhost ~]# xfs_growfs /dev/test_vg/test_data #调整文件系统大小
[root@localhost ~]# df -h #调整后查看文件系统大小,有变化
此外,当我们的卷组没有足够的空间划分给逻辑卷时,LVM的卷组也是可以动态调整容量大小的,这时需要使用fdisk
创建一个新的分区,并使用pvcreate
命令转换为物理卷格式,接着通过vgextend
将新的物理卷追加至现有的卷组空间中,最后使用lvextend
调整逻辑卷的容量。接下来我们再次扩展逻辑卷test_data的存储空间至36GB。
[root@localhost ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
命令(输入 m 获取帮助):n
All primary partitions are in use
添加逻辑分区 6
起始 扇区 (83892224-167772159,默认为 83892224):
将使用默认值 83892224
Last 扇区, +扇区 or +size{K,M,G} (83892224-167772159,默认为 167772159):
将使用默认值 167772159
分区 6 已设置为 Linux 类型,大小设为 40 GiB
命令(输入 m 获取帮助):t
分区号 (1-6,默认 6):6
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
正在同步磁盘。
[root@localhost ~]# partprobe /dev/sdb
[root@localhost ~]# pvcreate /dev/sdb6
[root@localhost ~]# vgextend test_vg /dev/sdb6
[root@localhost ~]# vgdisplay test_vg
--- Volume group ---
VG Name test_vg
System ID
Format lvm2
Metadata Areas 5
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 5
Act PV 5
VG Size 79.98 GiB
PE Size 4.00 MiB
Total PE 20475
Alloc PE / Size 9216 / 36.00 GiB
Free PE / Size 11259 / 43.98 GiB
VG UUID Uqz4de-BOnt-ud44-I0FX-27wV-5ivj-AiBnTl
[root@localhost ~]# lvextend -L 36G /dev/test_vg/test_data #将逻辑卷扩展至36GB
[root@localhost ~]# xfs_growfs /dev/test_vg/test_data
[root@localhost ~]# df -h
注意:
在企业级实际生产环境中,为文件系统调整大小前一定要做好数据备份的工作。切记切记。
删除LVM分区
当我们不再需要逻辑卷分区的时候,可以使用LVM命令轻松删除掉之前创建的物理卷、卷组和逻辑卷。删除的顺序应该与创建时的顺序相反,也就是卸载文件系统、删除逻辑卷、删除卷组、删除物理卷这样的顺序。卸载文件系统的时候需要注意,如果有必要,应该更新/etc/fstab文件。
[root@localhost ~]# umount /dev/test_vg/test_data
[root@localhost ~]# umount /dev/test_vg/test_web
[root@localhost ~]# lvremove /dev/test_vg/test_data
Do you really want to remove active logical volume test_vg/test_data? [y/n]: y
Logical volume "test_data" successfully removed
[root@localhost ~]# lvremove /dev/test_vg/test_web
Do you really want to remove active logical volume test_vg/test_web? [y/n]: y
Logical volume "test_web" successfully removed
[root@localhost ~]# vgremove test_vg
Volume group "test_vg" successfully removed
[root@localhost ~]# pvremove /dev/sdb{1,2,3,5,6}
Labels on physical volume "/dev/sdb1" successfully wiped.
Labels on physical volume "/dev/sdb2" successfully wiped.
Labels on physical volume "/dev/sdb3" successfully wiped.
Labels on physical volume "/dev/sdb5" successfully wiped.
Labels on physical volume "/dev/sdb6" successfully wiped.
(哈哈,原来在博文中用表情包这么爽!!!)
本次分享就到这里,你学废了吗?动动你那技术大佬的小手,点个【一键三连】支持一下呗,感激不尽。
希望有所帮助。