Linux LVM 详解
1. 简介
参考链接:
https://blog.csdn.net/qq_35745940/article/details/119054949
https://blog.csdn.net/FP202530/article/details/125140176
👉 LVM(Logical Volume Manager)逻辑卷管理
是在硬盘分区和文件系统之间添加的一个逻辑层,为文件系统屏蔽下层硬盘分区布局,并提供一个抽象的盘卷,在盘卷上建立文件系统。管理员利用LVM可以在硬盘不用重新分区的情况下动态调整文件系统的大小,并且利用LVM管理的文件系统可以跨越物理硬盘。当服务器添加了新的硬盘后,管理员不必将原有的文件移动到新的硬盘上,而是通过LVM直接扩展文件系统来跨越物理硬盘。
LVM就是通过将底层的物理硬盘封装,然后以逻辑卷的方式呈现给上层应用。当我们对底层的物理硬盘进行操作时,不再是针对分区进行操作,而是通过逻辑卷对底层硬盘进行管理操作。
👉 物理存储介质(The physical media):
LVM存储介质,可以是硬盘分区、整个硬盘、raid阵列或SAN硬盘。设备必须初始化为LVM物理卷,才能与LVM结合使用。
👉 物理卷PV(physical volume):
物理卷就是LVM的基本存储逻辑块,但和基本的物理存储介质比较却包含与LVM相关的管理参数,创建物理卷可以用硬盘分区,也可以用硬盘本身。
👉 卷组VG(Volume Group):
PV的集合,LVM卷组类似于非LVM系统中的物理硬盘,一个卷组VG由一个或多个物理卷PV组成。可以在卷组VG上建立逻辑卷LV。
👉 逻辑卷LV(logical volume):
VG中画出来的一块逻辑磁盘,类似于非LVM系统中的硬盘分区,逻辑卷LV建立在卷组VG之上。在逻辑卷LV之上建立文件系统。
👉 物理块PE(physical Extent):
物理卷PV中可以分配的最小存储单元,PE的大小可以指定,默认为4MB
👉 逻辑块LE(Logical Extent):
逻辑卷LV中可以分配的最小存储单元,在同一卷组VG中LE的大小和PE是相同的,并且一一相对。
❓ 为什么需要使用逻辑卷的方式来管理磁盘
- 业务上使用大容量的磁盘。举个例子,我们需要在/data下挂载30TB的存储,对于单个磁盘,是无法满足要求的,因为市面上没有那么大的单块磁盘。但是如果我们使用逻辑卷,将多个小容量的磁盘聚合为一个大的逻辑磁盘,就能满足需求。
- 扩展和收缩磁盘。在业务初期规划磁盘时,我们并不能完全知道需要分配多少磁盘空间是合理的,如果使用物理卷,后期无法扩展和收缩,如果使用逻辑卷,可以根据后期的需求量,手动扩展或收缩。
2. 新增磁盘验证
1️⃣ 添加一块新磁盘
2️⃣ 查看新增磁盘信息
[root@node2 ~]# ll /sys/class/scsi_host
总用量 0
lrwxrwxrwx 1 root root 0 7月 16 14:31 host0 -> ../../devices/pci0000:00/0000:00:10.0/host0/scsi_host/host0
lrwxrwxrwx 1 root root 0 7月 16 14:31 host1 -> ../../devices/pci0000:00/0000:00:07.1/ata1/host1/scsi_host/host1
lrwxrwxrwx 1 root root 0 7月 16 14:31 host2 -> ../../devices/pci0000:00/0000:00:07.1/ata2/host2/scsi_host/host2
# 重新扫描SCSI总线添加设备,不重启检测新增磁盘
for i in {0..2}; do echo "- - -" > /sys/class/scsi_host/host$i/scan; done
# 查看磁盘信息
[root@node2 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 10G 0 disk
sr0 11:0 1 4.2G 0 rom
3️⃣ 创建PV
在创建 PV 之前可以对磁盘进行分区,也可以不分区,本次验证不进行分区。
使用
fdisk /dev/sdb
进行分区
# 新建 PV
[root@node2 ~]# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
# 查看 PV 信息
[root@node2 ~]# pvdisplay /dev/sdb
--- Physical volume ---
"/dev/sdb" is a new physical volume of "10.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 10.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 7muupY-s6xl-hkcg-fmfP-Gf7q-U4eh-SdrK70
4️⃣ 创建卷组 VG
使用vgcreate创建卷组VG,并且此处可以-s选项指定PE(LE)的大小,(默认PE大小4M)。PE大,读取速度快,但浪费空间。反之,读取速度慢,但节省空间。
[root@node2 ~]# vgcreate vg_data /dev/sdb
Volume group "vg_data" successfully created
[root@node2 ~]# vgdisplay vg_data
--- Volume group ---
VG Name vg_data
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <10.00 GiB
PE Size 4.00 MiB
Total PE 2559
Alloc PE / Size 0 / 0
Free PE / Size 2559 / <10.00 GiB
VG UUID doqU2V-DWnZ-knwI-e7rT-GU1w-TGq8-Sc6RPs
5️⃣ 创建逻辑卷 LV
参数 | 说明 |
---|---|
-n | 指定逻辑卷名称,示例:-n lv_data |
-L | 指定逻辑卷的大小,如 -L 1G |
-l | 使用LE个数来指定逻辑卷的大小,如 -l 200,表示使用200个LE来创建逻辑卷,一般的我们最常用的是-L 来直接指定逻辑卷大小即可。 说明: PE是在卷组中的叫法,而LE是在逻辑卷中的叫法,两者是一一对应的。 -l参数还有一种直接使用剩余空间的百分比的形式来给定大小,如 -l +100%FREE 示例: 将 vg 总大小 Total PE 全部分配给 LV lvcreate -n lv_data -l 2559 vg_data |
# 新建 LV 并指定大小
[root@node2 ~]# lvcreate -n lv_data -L 1G vg_data
Logical volume "lv_data" created.
# 查看 LV 信息
[root@node2 ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- <17.00g
swap centos -wi-ao---- 2.00g
lv_data vg_data -wi-a----- 1.00g
# 可以使用 -l 将所有的空余 PE 全部分给 LV
lvcreate -l 100%FREE -n lv_data vg_data
# 新建完成之后,使用 vgdisplay 查看剩余大小
[root@node2 ~]# vgdisplay vg_data
--- Volume group ---
VG Name vg_data
System ID
Format lvm2
Metadata Areas 1
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 1
Act PV 1
VG Size <10.00 GiB
PE Size 4.00 MiB
Total PE 2559
Alloc PE / Size 256 / 1.00 GiB
Free PE / Size 2303 / <9.00 GiB
VG UUID doqU2V-DWnZ-knwI-e7rT-GU1w-TGq8-Sc6RPs
6️⃣ 磁盘格式化与挂载
- 格式化
xfs文件系统只支持增大,不支持减小。ext2、ext3、ext4增大减小都支持。
# 或者使用 mkfs -t ext4 /dev/vg_data/lv_data 命令
[root@node2 ~]# mkfs.ext4 /dev/vg_data/lv_data
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: 完成
正在写入inode表: 完成
Creating journal (8192 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
- 挂载
# 新建挂载目录
mkdir /demo
# 挂载
mount /dev/vg_data/lv_data /demo
- 自动挂载
# 编辑 /etc/fstab 配置文件,每次启动时会自动挂载
vim /etc/fstab
# 在文件中新增配置信息,格式参照默认配置格式
/dev/mapper/vg_data-lv_data /demo ext4 defaults 0 0
3. 磁盘扩容
1️⃣ 逻辑卷 LV 扩容
首先需要确认是否有可用的扩容空间,逻辑卷LV是从卷组VG中创建的,所有在逻辑卷LV扩容前需要查看卷组VG的空间使用情况。
VG 有多余空间的情况下,使用
lvextend
命令的 -L 选项扩展逻辑卷 LV 的大小注:建议先取消磁盘挂载之后在进行扩容操作
# 注:这里少了一个 + 号,是错误的,并没有添加成功。
[root@node2 ~]# lvextend -L 1G /dev/vg_data/lv_data
New size (256 extents) matches existing size (256 extents).
# 成功如下
[root@node2 ~]# lvextend -L +500M /dev/vg_data/lv_data
Size of logical volume vg_data/lv_data changed from 1.00 GiB (256 extents) to <1.49 GiB (381 extents).
Logical volume vg_data/lv_data successfully resized.
# 可以使用 -l 将剩余所有的 VG 大小分配给 LV
lvextend -l +100%FREE /dev/vg_data/lv_data
调整逻辑卷文件系统大小,查看调整后大小
[root@node2 ~]# resize2fs /dev/vg_data/lv_data
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/vg_data/lv_data is mounted on /demo; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/vg_data/lv_data is now 390144 blocks long.
# 参数说明
resize2fs命令 针对的是ext2、ext3、ext4文件系统
xfs_growfs命令 针对的是xfs文件系统
2️⃣ 卷组 VG 扩容
上述在扩容 LV 时,如果 VG 没有足够的大小时,则需要对 VG 进行扩容
vgextend
:用于扩展卷组的磁盘空间。当创建了新的物理卷,并需要将其添加到已有卷组中时,可以使用该命令。命令格式:
vgextend
[需要扩展的卷组名称] [新添加的物理卷(PV)]示例:
vgextend vg_data /dev/sdc
- 新增一块新磁盘
- 扩容 VG
# 扩容 VG
[root@node2 ~]# vgextend vg_data /dev/sdc
Physical volume "/dev/sdc" successfully created.
Volume group "vg_data" successfully extended
# 查看扩容后 VG 大小
[root@node2 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg_data 2 1 0 wz--n- 12.99g 11.50g
# 查看扩容后 PV 情况
[root@node2 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb vg_data lvm2 a-- <10.00g <8.51g
/dev/sdc vg_data lvm2 a-- <3.00g <3.00g
4. 磁盘缩容
逻辑卷 LV 缩容
注:一般情况下不会进行磁盘的缩容操作,此次试验是做验证使用
# 这里没有 -(减号) 则说明是缩容至指定大小
lvreduce -L 1G -r /dev/vg_data/lv_data
# 这里带有 -(减号) 则说明是缩容指定大小
lvreduce -L -200M -r /dev/vg_data/lv_data
如果不使用 -r 选项,则需要卸载挂载点再使用
resize2fs
调整
# 正确操作
#卸载挂载
umount /dev/vg_data/lv_data
#运行e2fsck 检测文件系统
# 注意:应该先缩小文件系统后再缩小逻辑卷,否则在进行lv逻辑卷缩小时产生文件系统大小与物理分区不匹配的错误
e2fsck -f /dev/vg_data/lv_data
resize2fs /dev/vg_data/lv_data 500M
lvreduce -L 500M /dev/vg_data/lv_data
mount /dev/vg_data/lv_data /demo
5. 磁盘删除
1️⃣ 删除逻辑卷 LV
需要卸载挂载的磁盘
[root@node2 ~]# lvremove /dev/vg_data/lv_data
Do you really want to remove active logical volume vg_data/lv_data? [y/n]: y
Logical volume "lv_data" successfully removed
2️⃣ 删除卷组 VG
# 查看现有 VG 信息
[root@node2 ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <19.00g 0
vg_data 2 0 0 wz--n- 12.99g 12.99g
# 删除指定 VG
vgremove vg_data
# 移除 VG 中指定的 PV
vgreduce vg_data /dev/sdc
3️⃣ 删除 PV
# 查看现有 PV 信息
[root@node2 ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <19.00g 0
/dev/sdb vg_data lvm2 a-- <10.00g <10.00g
/dev/sdc vg_data lvm2 a-- <3.00g <3.00g
# 删除指定 PV
pvremove /dev/sdc
6. 利用工具进行磁盘检测
SSM工具:检查关于可用硬盘和LVM卷的信息。显示关于现有磁盘存储设备、存储池、LVM卷和存储快照的信息。
1️⃣ 安装
yum -y install system-storage-manager
2️⃣ 列出设备信息
ssm list dev
3️⃣ 列出存储池信息
ssm list pool
4️⃣ 列出卷信息
ssm list vol
5️⃣ SSM创建LVM
ssm create -s [lv大小] -n [lv名称] --fstype [lv文件系统类型] -p [卷组名] [设备] [挂载点]
自动把设备变成pv,创建pv、lv,格式化文件系统,挂载目录自动创建,自动挂载
# 示例
ssm create -s 1G -n lv_demo --fstype ext4 -p vg_demo /dev/sd[c-d] /demo