在硬盘分好区或者部署为 RAID 磁盘阵列之后,再想修改硬盘分区大小就不容易了。换句话说,当用户想要随着实际需求的变化调整硬盘分区的大小时,会受到硬盘“灵活性” 的限制。这时就需要用到另外一项非常普及的硬盘设备资源管理技术了—逻辑卷管理器(Logical Volume Manager,LVM)。LVM 允许用户对硬盘资源进行动态调整。
LVM 是 Linux 系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而 LVM 技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的底层架构和布局,就可以实现对硬盘分区的动态调整。
提示:以下是本篇文章正文内容,下面案例可供参考
在硬盘分好区或者部署为 RAID磁盘阵列之后,再想修改硬盘分区大小就不容易了。换句话说,当用户想要随着实际需求的变化调整硬盘分区的大小时,会受到硬盘“灵活性”的限制。
这时就需要用到另外一项非常普及的硬盘设备资源管理技术了—逻辑卷管理器(Logical Volume Manager,LVM)。
LVM允许用户对硬盘资源进行动态调整。
LVM 是 Linux系统用于对硬盘分区进行管理的一种机制,理论性较强,其创建初衷是为了解决硬盘设备在创建分区后不易修改分区大小的缺陷。尽管对传统的硬盘分区进行强制扩容或缩容从理论上来讲是可行的,但是却可能造成数据的丢失。而LVM技术是在硬盘分区和文件系统之间添加了一个逻辑层,它提供了一个抽象的卷组,可以把多块硬盘进行卷组合并。这样一来,用户不必关心物理硬盘设备的底层架构和布局,就可以实现对硬盘分区的动态调整。
物理卷处于 LVM 中的最底层,可以将其理解为物理硬盘、硬盘分区或者 RAID 磁盘阵列。卷组建立在物理卷之上,一个卷组能够包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是 LVM 的核心理念。
常用的LVM 部署命令
功能命令 物理卷 卷组 逻辑卷
扫描 pvscan vgscan lvscan
建立 pvcreate vgcreate lvcreate
显示 pvdisplay vgdisplay lvdisplay
删除 pvremove vgremove lvremove
扩展 vgextend lvextend
缩小 vgreduce lvreduce
虚拟机中添加两块硬盘
[root@linuxprobe ~]# lsblk #进入后可以看到我们创建了两个5Gnvme的硬盘
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 6.6G 0 rom /run/media/root/RHEL-8-0-0-BaseOS-x86_64
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
nvme0n2 259:3 0 5G 0 disk
nvme0n3 259:4 0 5G 0 disk
[root@linuxprobe ~]# pvcreate /dev/nvme0n[2-3] #写法与/dev/nvme0n2 /dev/nvme0n3 相同
Physical volume "/dev/nvme0n2" successfully created.
Physical volume "/dev/nvme0n3" successfully created.
[root@linuxprobe ~]# vgcreate storage /dev/nvme0n[2-3] #storage 是创建卷组的名称
Volume group "storage" successfully created
[root@linuxprobe ~]# vgdisplay #使用这个命令查看卷组状态,过长就不演示了
[root@linuxprobe ~]# lvcreate -n vo -l 100 storage
#切割出 -n 逻辑卷名称 -l pe数 -l 100 就是容量400M的逻辑卷(一个pe为4M) -L 150M就是容量为150M的逻辑卷 后面跟着名字
Logical volume "vo" created.
切割后可以用lvdisplay查看逻辑卷状态
Linux 系统会把 LVM 中的逻辑卷设备存放在/dev 设备目录中(实际上就是个快捷方式),同时会以卷组的名称来建立一个目录,其中保存了逻辑卷的设备映射文件(即/dev/卷组名称/ 逻辑卷名称)。
[root@linuxprobe dev]# mkfs.ext4 /dev/storage/vo #格式化为ext4格式
mke2fs 1.44.3 (10-July-2018)
Creating filesystem with 409600 1k blocks and 102400 inodes
Filesystem UUID: 3dbe9571-753c-4394-bc1a-9f03754ed0c9
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
如果使用了逻辑卷管理器,则不建议用 XFS 文件系统,因为 XFS 文件系统自身就可以使用 xfs_growfs
命令进行磁盘扩容。这虽然不比 LVM 灵活,但起码也够用。在实测阶段我们发现,在有一些服务器上,XFS 与 LVM 的兼容性并不好。
[root@linuxprobe dev]# mkdir /haha #创建要挂载的文件夹
[root@linuxprobe dev]# echo "/dev/storage/vo /haha ext4 defaults 0 0 " >> /etc/fstab
# 使用输出重定向到文件最后
[root@linuxprobe dev]# mount -a # 挂载
[root@linuxprobe dev]# df -h #查看挂载状态
Filesystem Size Used Avail Use% Mounted on
devtmpfs 889M 0 889M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 9.7M 894M 2% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 3.9G 14G 23% /
/dev/nvme0n1p1 1014M 169M 846M 17% /boot
tmpfs 181M 16K 181M 1% /run/user/42
tmpfs 181M 3.5M 178M 2% /run/user/0
/dev/sr0 6.7G 6.7G 0 100% /run/media/root/RHEL-8-0-0-BaseOS-x86_64
/dev/mapper/storage-vo 380M 2.3M 354M 1% /haha #这个时候我们创建容量是400 M
创建400M缩水到380M
1GB=1,000MB、1MB=1,000KB、1KB=1,000B
而计算机系统的算法是 1GB=1,024MB、1MB=1,024KB、1KB=1,024B, 因此有 3%左右的“缩水”是正常情况。
这里逻辑卷创建完成
要卷组中有足够的资源, 就可以一直为逻辑卷扩容。扩容前请一定要记得卸载设备和挂载点的关联。
[root@linuxprobe mapper]# umount /haha
[root@linuxprobe mapper]# lvextend -L 800M /dev/storage/vo
Size of logical volume storage/vo changed from 400.00 MiB (100 extents) to 800.00 MiB (200 extents).
Logical volume storage/vo successfully resized.
[root@linuxprobe mapper]# e2fsck -f /dev/storage/vo #检查文件系统有没有文件丢失
e2fsck 1.44.3 (10-July-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo: 11/102400 files (0.0% non-contiguous), 23456/409600 blocks
[root@linuxprobe mapper]# resize2fs /dev/storage/vo #通知文件系统发生变化同步
resize2fs 1.44.3 (10-July-2018)
Resizing the filesystem on /dev/storage/vo to 819200 (1k) blocks.
The filesystem on /dev/storage/vo is now 819200 (1k) blocks long.
[root@linuxprobe /]# mount -a
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 889M 0 889M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 9.7M 894M 2% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 3.9G 14G 23% /
/dev/nvme0n1p1 1014M 169M 846M 17% /boot
tmpfs 181M 16K 181M 1% /run/user/42
tmpfs 181M 3.5M 178M 2% /run/user/0
/dev/sr0 6.7G 6.7G 0 100% /run/media/root/RHEL-8-0-0-BaseOS-x86_64
/dev/mapper/storage-vo 767M 2.5M 721M 1% /haha
这里可以看到已经扩容到800M了
在对逻辑卷进行缩容操作时,数据丢失的风险更大。所以在生产环境中执行相应操作时,一定要提前备份好数据。另外,Linux 系统规定,在对 LVM 逻辑卷进行缩容操作之前,要先检查文件系统的完整性(当然这也是为了保证数据的安全)。在执行缩容操作前记得先把文件系统卸载掉。
[root@linuxprobe /]# umount /haha
[root@linuxprobe /]# e2fsck -f /dev/storage/vo
e2fsck 1.44.3 (10-July-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/storage/vo: 11/204800 files (0.0% non-contiguous), 36617/819200 blocks
[root@linuxprobe /]# resize2fs /dev/storage/vo 300M
resize2fs 1.44.3 (10-July-2018)
Resizing the filesystem on /dev/storage/vo to 307200 (1k) blocks.
The filesystem on /dev/storage/vo is now 307200 (1k) blocks long.
[root@linuxprobe /]# lvreduce -L 300M /dev/storage/vo
WARNING: Reducing active logical volume to 300.00 MiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce storage/vo? [y/n]: y #确定
Size of logical volume storage/vo changed from 800.00 MiB (200 extents) to 300.00 MiB (75 extents).
Logical volume storage/vo successfully resized.
[root@linuxprobe /]# mount -a
[root@linuxprobe /]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 889M 0 889M 0% /dev
tmpfs 904M 0 904M 0% /dev/shm
tmpfs 904M 9.7M 894M 2% /run
tmpfs 904M 0 904M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 3.9G 14G 23% /
/dev/nvme0n1p1 1014M 169M 846M 17% /boot
tmpfs 181M 16K 181M 1% /run/user/42
tmpfs 181M 3.5M 178M 2% /run/user/0
/dev/sr0 6.7G 6.7G 0 100% /run/media/root/RHEL-8-0-0-BaseOS-x86_64
/dev/mapper/storage-vo 283M 2.1M 262M 1% /haha
可以看到 逻辑卷已经缩小到300M
先通知系统内核自己想缩小逻辑卷,如果在执行 resize2fs 命令后系统没有报错,再正式操作。
LVM 还具备有“快照卷”功能,该功能类似于虚拟机软件的还原时间点功能。例如,对某一个逻辑卷设备做一次快照,如果日后发现数据被改错了,就可以利用之前做好的快照卷进行覆盖还原。
LVM 的快照卷功能有两个特点:
[root@linuxprobe /]# vgdisplay
--- Volume group ---
VG Name storage
System ID
Format lvm2
Metadata Areas 2
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 2
Act PV 2
VG Size 9.99 GiB
PE Size 4.00 MiB
Total PE 2558
Alloc PE / Size 75 / 300.00 MiB #已使用300M
Free PE / Size 2483 / <9.70 GiB #空闲9.7G
VG UUID YL0NDd-1bEH-ZDhU-HrZu-UW3b-X9TD-PIH2UR
我们又复制了一些文件到/haha
[root@linuxprobe haha]# cp -rf /etc/* ./
另外,还需要在命令后面写上是针对哪个逻辑卷执行的快照操作,稍后数据也会还原到这个相应的设备上。
[root@linuxprobe /]# lvcreate -L 300M -s -n SNAP /dev/storage/vo #之前是300M现在还是
Logical volume "SNAP" created.
[root@linuxprobe /]# lvdisplay #这里我只展示了快照SNAP的
--- Logical volume ---
LV Path /dev/storage/SNAP
LV Name SNAP
VG Name storage
LV UUID 7637Jv-VEpv-aWuM-KBFU-HbG1-ClEu-p59rRc
LV Write Access read/write
LV Creation host, time linuxprobe.com, 2023-02-22 10:03:51 +0800
LV snapshot status active destination for vo
LV Status available
# open 0
LV Size 300.00 MiB
Current LE 75
COW-table size 300.00 MiB
COW-table LE 75
Allocated to snapshot 0.01%
Snapshot chunk size 4.00 KiB
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:5
[root@linuxprobe haha]# rm -rf *
lvconvert 命令用于管理逻辑卷的快照,语法格式为“lvconvert [参数]快照卷名称”。
使用 lvconvert 命令能自动回复逻辑卷的快照,在早期的 RHEL/CentOS 5 版本中要写全格式:“–mergesnapshot”,而从 RHEL 6 到 RHEL 8,已经允许用户只输入–merge 参数进行操作了,系统会自动分辨设备的类型。
[root@linuxprobe /]# umount /haha #取消挂载
[root@linuxprobe /]# lvconvert --merge /dev/storage/SNAP #回复逻辑卷的快照
Merging of volume storage/SNAP started.
storage/vo: Merged: 100.00%
[root@linuxprobe /]# mount -a 挂载
[root@linuxprobe /]# cd /haha
[root@linuxprobe haha]# ls
adjtime cron.daily dr。。。。。。
当生产环境中想要重新部署 LVM 或者不再需要使用 LVM 时,则需要执行 LVM 的删除操作。为此,需要提前备份好重要的数据信息,然后依次删除逻辑卷、卷组、物理卷设备, 这个顺序不可颠倒。
我已经备份好数据啦
[root@linuxprobe /]# umount /haha
[root@linuxprobe /]# vim /etc/fstab 删除 /dev/storage/vo /haha ext4 defaults 0 0
[root@linuxprobe /]# lvremove /dev/storage/vo
Do you really want to remove active logical volume storage/vo? [y/n]: y
Logical volume "vo" successfully removed
[root@linuxprobe /]# vgremove storage
Volume group "storage" successfully removed
[root@linuxprobe /]# vgremove storage
Volume group "storage" successfully removed
在上述操作执行完毕之后,再执行 lvdisplay、vgdisplay、pvdisplay 命令来查看 LVM 的信息时就不会再看到相关信息了(前提是上述步骤的操作是正确的)。干净利落!
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了LVM的部署、扩容、缩小、快照、删除。物理卷处于 LVM 中的最底层,可以将其理解为物理硬盘、硬盘分区或者 RAID 磁盘阵列。卷组建立在物理卷之上,一个卷组能够包含多个物理卷,而且在卷组创建之后也可以继续向其中添加新的物理卷。逻辑卷是用卷组中空闲的资源建立的,并且逻辑卷在建立后可以动态地扩展或缩小空间。这就是 LVM 的核心理念。