关于Linux逻辑卷管理LVM详解
前言
每个 Linux 使用者在安装 Linux 时都会遇到这样的困境:在为系统分区时,如何精确评估和分配各个硬盘分区的容量,因为系统管理员不但要考虑到当前某个分区需要的容量,还要预见该分区以后可能需要的容量的最大值。因为如果估计不准确,当遇到某个分区不够用时管理员可能甚至要备份整个系统、清除硬盘、重新对硬盘分区,然后恢复数据到新分区。
虽然现在有很多动态调整磁盘的工具可以使用,例如 Partation Magic 等等,但是它并不能完全解决问题,因为某个分区可能会再次被耗尽;另外一个方面这需要重新引导系统才能实现,对于很多关键的服务器,停机是不可接受的,而且对于添加新硬盘,希望一个能跨越多个硬盘驱动器的文件系统时,分区调整程序就不能解决问题。
因此完美的解决方法应该是在零停机前提下可以自如对文件系统的大小进行调整,可以方便实现文件系统跨越不同磁盘和分区。幸运的是 Linux 提供的逻辑卷管理(LVM,Logical Volume Manager)机制就是一个很好的解决方案
什么是LVM
LVM 是逻辑卷管理(Logical Volume Manager)的简称,它是 Linux 环境下对磁盘分区进行管理的一种机制,LVM 是建立在硬盘和分区之上,文件系统之下的一个逻辑层,来提高磁盘分区管理的灵活性。通过 LVM 系统管理员可以轻松管理磁盘分区,如:将若干个磁盘分区连接为一个整块的卷组(volume group),形成一个存储池。管理员可以在卷组上随意创建逻辑卷组(logical volumes),并进一步在逻辑卷组上创建文件系统。管理员通过 LVM 可以方便的调整存储卷组的大小,并且可以对磁盘存储按照组的方式进行命名、管理和分配,例如按照使用用途进行定义: “ development ” 和 “ sales ”,而不是使用物理磁盘名“ sda ”和“sdb”。而且当系统添加了新的磁盘,通过 LVM 管理员就不必将磁盘的文件移动到新的磁盘上以充分利用新的存储空间,而是直接扩展文件系统跨越磁盘即可。
LVM基本术语
LVM 是在磁盘分区和文件系统之间添加的一个逻辑层,来为文件系统屏蔽下层磁盘分区布局,提供一个抽象的盘卷,在盘卷上建立文件系统。首先我们讨论以下几个 LVM 术语:
1、物理存储介质(The physical media)
这里指系统的存储设备:硬盘,如:/dev/hda1、/dev/sda1 等,是存储系统最低层的存储单元。
2、PV 物理卷(physical volume)
物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如 RAID),是 LVM 的基本存储逻辑块,但和基本的物理存储介质(如分区、磁盘等)比较,却包含有与 LVM 相关的管理参数。
3、VG 卷组(Volume Group)
由一个或多个物理卷组成一个整体,即称为卷组,在卷组中可以动态的添加或移除物理卷,许多个物理卷可以分别组成不同的卷组,卷组名称由用户自行定义。
4、LV 逻辑卷(logical volume)
逻辑卷是建立在卷组之上的,与物理卷无直接关系,对于逻辑卷来说,每一个卷组就是一个整体,从这个整体中切出一小块空间,作为用户创建文件系统的基础,这一小块空间就称为逻辑卷,使用 mkfs等工具在逻辑卷之上建立文件系统以后,即可挂载到 Linux 系统中的目录下使用。
5、PE(physical extent)
每一个物理卷被划分为称为 PE(Physical Extents)的基本单元,具有唯一编号的 PE 是可以被 LVM寻址的最小单元。PE 的大小是可配置的,默认为 4MB。

6、LE(logical extent)
逻辑卷也被划分为被称为 LE(Logical Extents) 的可被寻址的基本单位。在同一个卷组中,LE 的大小和 PE 是相同的,并且一一对应。

创建和管理LVM
1、准备一块硬盘做分区
进行磁盘分区(w保存)
重新探测/dev/sdb 磁盘中分区情况的变化:
partprobe /dev/sdb
2、开始创建PV
# 将整个磁盘创建为物理卷的命令为: pvcreate /dev/sdb # 将单个或多个分区创建为物理卷的命令为: pvcreate /dev/sdb1 pvcreate /dev/sdb1 /dev/sdb2
查看执行pvscan
pvscan
PV /dev/sda2 VG centos lvm2 [19.80 GiB / 0 free] PV /dev/sdb1 lvm2 [10.00 GiB] PV /dev/sdb2 lvm2 [5.00 GiB] Total: 3 [34.80 GiB] / in use: 1 [19.80 GiB] / in no VG: 2 [15.00 GiB]
3、创建卷组
创建卷组的命令为 vgcreate,将使用 pvcreate 建立的物理卷创建为一个完整的卷组:
[root@master ~]# vgcreate my_data /dev/sdb1 /dev/sdb2 Volume group "my_data" successfully created
扫描当前系统中建立的 LVM 卷组,并显示信息。
[root@master ~]# vgscan Reading volume groups from cache. Found volume group "centos" using metadata type lvm2 Found volume group "my_data" using metadata type lvm2
注:vgcreate 命令第一个参数是指定该卷组的逻辑名:my_data。后面参数是指定希望添加到该卷组的所有分区和磁盘。vgcreate 在创建卷组 my_data 以外,还设置使用大小为 4 MB 的 PE(默认为 4MB),这表示卷组上创建的所有逻辑卷都以 4 MB 为增量单位来进行扩充或缩减。由于内核原因,PE 大小决定了逻辑卷的最大大小,4 MB 的 PE 决定了单个逻辑卷最大容量为 256 GB,若希望使用大于 256G 的逻辑卷则创建卷组时指定更大的 PE。PE 大小范围为 8 KB 到 512 MB,并且必须总是 2的倍数(使用-s 指定,具体请参考 man vgcreate)。
4、激活卷组
为了立即使用卷组而不是重新启动系统
[root@master ~]# vgchange -a y my_data
5、添加新的物理卷到卷组中
当系统安装了新的磁盘并创建了新的物理卷,而要将其添加到已有卷组时,就需要使用 vgextend 命令:
[root@master ~]# vgextend my_data /dev/sdb3 Physical volume "/dev/sdb3" successfully created. Volume group "my_data" successfully extended
注:这里的/dev/sdb3是新的物理卷(没有就fdisk创建)
结果如下所示:
[root@master ~]# pvscan PV /dev/sda2 VG centos lvm2 [19.80 GiB / 0 free] PV /dev/sdb1 VG my_data lvm2 [<10.00 GiB / <10.00 GiB free] PV /dev/sdb2 VG my_data lvm2 [<5.00 GiB / <5.00 GiB free] PV /dev/sdb3 VG my_data lvm2 [<3.00 GiB / <3.00 GiB free] Total: 4 [<37.79 GiB] / in use: 4 [<37.79 GiB] / in no VG: 0 [0 ]
6、从卷组中删除一个物理卷
要从一个卷组中删除一个物理卷,首先要确认要删除的物理卷没有被任何逻辑卷正在使用,就要使用pvdisplay 命令察看一个该物理卷信息:
[root@master ~]# pvdisplay /dev/sdb3 --- Physical volume --- PV Name /dev/sdb3 VG Name my_data PV Size 3.00 GiB / not usable 4.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 767 Free PE 767 Allocated PE 0 PV UUID CHsXpZ-11dl-p74D-cLV7-prsD-YfIB-DcCz9C
如果某个物理卷正在被逻辑卷所使用,就需要将该物理卷的数据备份到其他地方,然后再删除。删除物理卷的命令为 vgreduce:
[root@master ~]# vgreduce my_data /dev/sdb3 Removed "/dev/sdb3" from volume group "my_data"
[root@master ~]# pvscan PV /dev/sda2 VG centos lvm2 [19.80 GiB / 0 free] PV /dev/sdb1 VG my_data lvm2 [<10.00 GiB / <10.00 GiB free] PV /dev/sdb2 VG my_data lvm2 [<5.00 GiB / <5.00 GiB free] PV /dev/sdb3 lvm2 [3.00 GiB]
7、创建逻辑卷
创建逻辑卷的命令为 lvcreate:
[root@master ~]# lvcreate -L 8G -n data my_data Logical volume "data" created.
该命令就在卷组 my_data 上创建名字为 data,大小为 8G 的逻辑卷,并且设备入口为
/dev/my_data/data(my_data 为卷组名,data为逻辑卷名)。
如果希望创建一个使用全部卷组的逻辑卷,则需要首先察看该卷组的 PE 数,然后在创建逻辑卷时指定:
[root@master ~]# vgdisplay my_data|grep "Total PE" Total PE 3838
[root@master ~]# lvcreate -L 3838 my_data -n data1 Rounding up size to full physical extent 3.75 GiB Logical volume "data1" created.
显示逻辑卷(data)的详细信息:可以看到逻辑卷大小为8G等信息
[root@master ~]# lvdisplay /dev/my_data/data --- Logical volume --- LV Path /dev/my_data/data LV Name data VG Name my_data LV UUID xD81NS-w6Et-pzD4-k8Sd-tMVy-9Qjg-ZdQMPR LV Write Access read/write LV Creation host, time master, 2021-03-02 17:55:22 +0800 LV Status available # open 0 LV Size 8.00 GiB Current LE 2048 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:2
8、创建文件系统
使用 mkfs 命令在“data”逻辑卷中创建 EXT3 文件系统,并挂载到“tmp”目录下。
[root@master ~]# mkfs.ext4 /dev/my_data/data mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 524288 inodes, 2097152 blocks 104857 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2147483648 64 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
查看
[root@master ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 898M 0 898M 0% /dev tmpfs 910M 0 910M 0% /dev/shm tmpfs 910M 9.5M 901M 2% /run tmpfs 910M 0 910M 0% /sys/fs/cgroup /dev/mapper/centos-root 19G 1.8G 18G 10% / /dev/sda1 197M 116M 82M 59% /boot tmpfs 182M 0 182M 0% /run/user/0 /dev/mapper/my_data-data 7.8G 36M 7.3G 1% /tmp
[root@master ~]# df -Th /tmp/ Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/my_data-data ext4 7.8G 36M 7.3G 1% /tmp
如果希望系统启动时自动加载文件系统,则还需要在/etc/fstab 中添加内容:
[root@master ~]# tail -1 /etc/fstab /dev/my_data/data /tmp ext4 defaults 1 2
9、删除一个逻辑卷
删除逻辑卷以前首先需要将其卸载,然后删除:
[root@master ~]# lvremove /dev/my_data/data Do you really want to remove active logical volume my_data/data? [y/n]: y Logical volume "data" successfully removed
10、扩展逻辑卷大小
LVM 提供了方便调整逻辑卷大小的能力,扩展逻辑卷大小的命令是 lvextend:
[root@master ~]# lvextend -L 9G /dev/my_data/data1 Size of logical volume my_data/data1 changed from 3.75 GiB (960 extents) to 9.00 GiB (2304 extents). Logical volume my_data/data1 successfully resized.
上面的命令就实现将逻辑卷 data1 的大小扩招为 9G。
[root@master ~]# lvextend -L +1G /dev/my_data/data1 Size of logical volume my_data/data1 changed from 9.00 GiB (2304 extents) to 10.00 GiB (2560 extents). Logical volume my_data/data1 successfully resized.
上面的命令就实现将逻辑卷 data1 的大小增加 1G。
总结
根据上面的讨论可以看到,LVM 具有很好的可伸缩性,使用起来非常方便。可以方便地对卷组、逻辑卷的大小进行调整,更进一步调整文件系统的大小。
问题:怎样减小逻辑卷的大小?
[root@master ~]# lvreduce -L 10G /dev/my_data/data1 WARNING: Reducing active logical volume to 10.00 GiB. THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce my_data/data1? [y/n]: y Size of logical volume my_data/data1 changed from 12.00 GiB (3072 extents) to 10.00 GiB (2560 extents). Logical volume my_data/data1 successfully resized.
[root@master ~]# lvdisplay /dev/my_data/data1 --- Logical volume --- LV Path /dev/my_data/data1 LV Name data1 VG Name my_data LV UUID f6GUYP-F6Au-3E64-Mzfl-Xthp-Er04-mhf2FH LV Write Access read/write LV Creation host, time master, 2021-03-02 18:00:25 +0800 LV Status available # open 0 LV Size 10.00 GiB Current LE 2560 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现