Linux操作系统-逻辑卷管理(LVM)
本文详细介绍了Linux环境下使用LVM(逻辑卷管理)进行磁盘扩容的完整流程。主要内容包括:1. LVM基本概念和组成部分(物理卷PV、卷组VG、逻辑卷LV);2. 扩容前是否分区的讨论,推荐先分区再使用LVM以提高兼容性和管理灵活性;3. LVM扩容的具体操作步骤,包括添加物理卷、扩展卷组和逻辑卷、刷新文件系统等;4. 三种扩容场景的实操演示:扩展已有挂载路径(加盘、扩盘)和新建挂载路径;5.
目录
7.挂载与使用(挂载到前面所创建的 /database_log目录下)
一、LVM的基本概念和组成部分
LVM的方式扩容:LVM(Logical Volume Manager,逻辑卷管理)是一种在Linux环境下对磁盘分区进行管理的管理机制。它通过在硬盘和分区之上创建一个逻辑层,提供了一种更为灵活和动态的磁盘管理方式。在虚拟机扩容中,新增一块硬盘和直接在原有硬盘基础上扩容是一样的(只不过在原有硬盘上扩容需要关机才可以执行);
LVM主要由以下几个部分组成:
- 物理卷(Physical Volume, PV):LVM的基本存储逻辑块,可以是硬盘分区或整个硬盘。
- 卷组(Volume Group, VG):由一个或多个物理卷组成的存储池,类似于非LVM系统中的物理硬盘。
- 逻辑卷(Logical Volume, LV):在卷组上创建的逻辑磁盘,类似于非LVM系统中的硬盘分区,但具有更高的灵活性。
- 物理扩展(PE):PE是LVM的最小存储单元,默认大小为4M。

二、关于在扩容前是否需要进行分区操作?
使用 LVM 之前是否需要先进行分区操作,取决于具体场景和需求。以下是详细解释:
1.核心结论
- LVM 可以直接使用整个磁盘(无需分区),但通常推荐先分区再使用 LVM,原因包括兼容性、管理习惯、安全隔离等。
- 关键区分:
-
物理卷(PV):LVM 直接管理的存储单元,可以是整个磁盘(如/dev/sdb)或分区(如/dev/sdb1)。
- 是否分区:由用户决定,但分区更常见。
-
2.为什么许多教程推荐先分区?
(1) 历史与兼容性
- 引导需求:早期系统无法从 LVM 启动,需单独分区存放 /boot(引导文件)。虽然现代系统支持 LVM 启动,但仍有场景需要独立分区。
- 工具兼容性:某些工具(如旧版fdisk)对未分区的磁盘处理不够友好,分区可避免潜在问题。
(2) 管理习惯与安全性
- 明确标记用途:分区类型设置为Linux LVM(文件系统类型代码 8e ),明确标识该分区专用于 LVM,避免误操作。
- 隔离风险:若磁盘有其他用途(如预留空间或与其他系统共享),分区可划分明确边界。
(3) 企业环境实践
- 灵活扩展:分区后,可通过 LVM 跨多个磁盘/分区合并空间(如将 /dev/sdb1 和 /dev/sdc1) 加入同一卷组)。
- 避免整盘占用:若磁盘未完全用于 LVM,分区可划分多用途区域(如部分给 LVM,部分给其他文件系统)。
3.直接使用整盘作为 PV 的场景
- 专用磁盘:若整块磁盘完全用于 LVM,可直接创建物理卷:
bash
pvcreate /dev/sdb # 直接使用整块磁盘 - 优势:
- 简化操作,无需分区。
- 避免分区表占用空间(但现代磁盘分区表开销可忽略)。
4.分区 vs 直接使用整盘的对比
| 场景 | 分区后再用 LVM | 直接使用整盘 LVM |
|---|---|---|
| 兼容性 | 高(兼容旧系统/工具) | 低(某些工具可能不识别未分区磁盘) |
| 用途标识 | 明确(分区类型标记为 Linux LVM) |
无明确标记 |
| 多用途磁盘 | 支持(可划分多个分区) | 不支持(整盘专用于 LVM) |
| 管理复杂度 | 稍高(需分区步骤) | 低(直接操作整盘) |
| 适用场景 | 通用场景、企业环境 | 专用磁盘、简单环境 |
5.操作示例(下面示例会进行演示)
(1) 使用分区创建 PV
[root@localhost ~]# fdisk /dev/sdc
p # 查看分区信息
n # 创建分区
p # 选择主分区
回车默认,默认会将所有剩余空间都划入该分区
t # 修改分区格式
L # 列出所有分区格式信息
8e # 创建分区并标记为 Linux LVM(类型 8e),8e为lvm类型的hex代码
p # 查看分区信息
w # 保存并退出
# 创建物理卷
sudo pvcreate /dev/sdb1
(2) 直接使用整盘创建 PV
# 直接操作整块磁盘(无需分区)
sudo pvcreate /dev/sdb
6.总结建议
- 推荐先分区:除非磁盘完全专用于 LVM,否则分区能提高兼容性和管理灵活性。
- 例外情况:若磁盘仅用于 LVM 且环境支持(如现代 Linux 系统),可直接使用整盘。
三、lvm方式下的扩容流程
1.逻辑卷扩容简要流程
- 建立物理卷 ---> pv ---> 类似于硬盘域的概念
- 建立卷组 ---> vg ---> 类似于存储池的概念
- 建立逻辑卷 ---> lv ---> 对标lun卷
- 格式化安装文件系统 ---> mkfs
- 挂载 ---> mount
2.LVM相关命令
| 功能 | 物理卷管理 | 卷组管理 | 逻辑卷管理 |
| Scan扫描 | pvscan | vgscan | Ivscan |
| Create建立 | pvcreate | vgcreate | lvcreate |
| Display显示 | pvdisplay | vgdisplay | Ivdisplay |
| Remove删除 | pvremove | vgremove | lvremove |
| Extend扩展 | - | vgextend | Ivextend |
| Reduce减少 | - | vgreduce | Ivreduce |
四、扩容实操(三个案例)
(一)卷组、逻辑卷扩容到已有的挂载路径
1.选择添加硬盘

2.识别新增硬盘块
物理插入磁盘后,系统通常会自动识别,但仍需手动操作:
lsblk # 查看磁盘及分区结构,确认新磁盘是否加载成功(如 /dev/sdb)
注:lsblk用于列出系统中所有可用的块设备(如硬盘、分区、LVM、RAID、光驱等)。它以树状图的方式显示设备之间的关系,而不显示它们的文件系统详细信息,这使得lsblk在快速查看系统的存储层次结构时非常有用。

3.添加物理卷
注:物理卷只能从新增加的硬盘中进行挑选
语法:pvcreate 硬盘的位置

4.查看根分区的所在的卷组(类似于存储池的概念)
注:新安装的操作系统,如果使用lvm管理磁盘空间的话,默认会存在一个根目录卷组名(vg_centos6的卷组)。

5.将新增的物理卷扩展的默认的卷组中
格式: vgextend vg_centos6 物理卷名
将物理卷(/dev/sdb)扩展到卷组(centos【上一步提到的根目录卷组名】)

6.查看当前逻辑卷的空间状态

7.使用 lvcreate
格式:Ivcreate [选项] 逻辑卷名 卷组名
# 将卷组中的空闲空间扩展到根分区逻辑卷:
lvextend -l +100%FREEdev/vg_centos6/lv_root
# 若想指定大小分配,则可以使用:lvcreate -L 2GB -n LV_Name VG_NAME
常用参数:
-l指的是按照比例来进行配置,-L指定大小,-n的作用是指定新创建的逻辑卷(Logical Volume)的名称。

8.刷新根分区并查看状态
注:刷新分区之前需要查看分区类型格式,如:ext4、xfs。查看方式如下
方式一:使用 df -TH 来进行查看
方式二:使用 blkid 查看所有盘符信息
注:df命令用于显示文件系统的磁盘空间使用情况。常用选项-T表示以易读的格式显示,-h表示使用人类可读的格式。
# 若磁盘格式是xfs,则执行如下命令:xfs_growfs /dev/vg_centos6/lv_root
# 若磁盘格式是ext4,则执行如下命令:resize2fs /dev/vg_centos6/lv_root

(二)直接扩展待扩展磁盘进行lvm扩容
1.确认待扩容块设备
lsblk查看,发现sda块设备下的sda2分区空间不够

2.对对应的块设备加阔10G空间


3.借助parted工具,将sda2分区填满

4.调整物理卷大小
分区扩展完成之后,需完成其中最重要的一步就是进行:pvresize /dev/sda2;
这步操作主要是使用 pvresize 命令来调整物理卷的大小,以匹配新的分区大小。如果不执行将会出现如下现象:

执行:pvresize /dev/sda2

5.扩展逻辑卷

6.扩展文件系统

整体过程:
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 29G 0 part
├─centos-root 253:0 0 27G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
└─sdb1 8:17 0 1023M 0 part /history_data
sdc 8:32 0 25G 0 disk
└─sdc1 8:33 0 25G 0 part /dmdata2
sr0 11:0 1 4.4G 0 rom
[root@localhost ~]# parted /dev/sda
GNU Parted 3.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help
align-check TYPE N check partition N for TYPE(min|opt) alignment
help [COMMAND] print general help, or help on COMMAND
mklabel,mktable LABEL-TYPE create a new disklabel (partition table)
mkpart PART-TYPE [FS-TYPE] START END make a partition
name NUMBER NAME name partition NUMBER as NAME
print [devices|free|list,all|NUMBER] display the partition table, available devices, free space, all found partitions, or a particular partition
quit exit program
rescue START END rescue a lost partition near START and END
resizepart NUMBER END resize partition NUMBER
rm NUMBER delete partition NUMBER
select DEVICE choose the device to edit
disk_set FLAG STATE change the FLAG on selected device
disk_toggle [FLAG] toggle the state of FLAG on selected device
set NUMBER FLAG STATE change the FLAG on partition NUMBER
toggle [NUMBER [FLAG]] toggle the state of FLAG on partition NUMBER
unit UNIT set the default unit to UNIT
version display the version number and copyright information of GNU Parted
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 1075MB 1074MB primary xfs boot
2 1075MB 32.2GB 31.1GB primary lvm
(parted) resizepart 2 100%
(parted) print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 1075MB 1074MB primary xfs boot
2 1075MB 42.9GB 41.9GB primary lvm
(parted) quit
Information: You may need to update /etc/fstab.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─centos-root 253:0 0 27G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
└─sdb1 8:17 0 1023M 0 part /history_data
sdc 8:32 0 25G 0 disk
└─sdc1 8:33 0 25G 0 part /dmdata2
sr0 11:0 1 4.4G 0 rom
[root@localhost ~]#
[root@localhost ~]# pvresize /dev/sda2
Physical volume "/dev/sda2" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
[root@localhost ~]#
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <39.00g 10.00g
[root@localhost ~]#
[root@localhost ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 centos lvm2 a-- <39.00g 10.00g
[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
centos 1 2 0 wz--n- <39.00g 10.00g
[root@localhost ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root centos -wi-ao---- 26.99g
swap centos -wi-ao---- 2.00g
[root@localhost ~]# blkid
/dev/sda1: UUID="f5c128eb-513e-47c6-a725-564c557e05af" TYPE="xfs"
/dev/sda2: UUID="I3JO1t-Tqpj-3F5B-hlSt-lIgS-nY3p-cux7mc" TYPE="LVM2_member"
/dev/sdb1: UUID="a927f23c-f9bc-4b2e-8e2e-d369e8f9b176" TYPE="xfs"
/dev/sdc1: UUID="d176f4c4-c540-41f3-9ec3-3d079c323c7d" TYPE="ext4"
/dev/sr0: UUID="2020-11-04-11-36-43-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/mapper/centos-root: UUID="75b0fa64-e099-430f-a143-706f8fcc0209" TYPE="xfs"
/dev/mapper/centos-swap: UUID="a8d4df56-dad9-41ba-85e3-a7063645cc80" TYPE="swap"
[root@localhost ~]# lvextend -l +100%FREE /dev/centos/root
Size of logical volume centos/root changed from 26.99 GiB (6910 extents) to <37.00 GiB (9471 extents).
Logical volume centos/root successfully resized.
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─centos-root 253:0 0 37G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
└─sdb1 8:17 0 1023M 0 part /history_data
sdc 8:32 0 25G 0 disk
└─sdc1 8:33 0 25G 0 part /dmdata2
sr0 11:0 1 4.4G 0 rom
[root@localhost ~]# 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.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 27G 24G 3.1G 89% /
/dev/sdb1 1020M 33M 988M 4% /history_data
/dev/sdc1 25G 8.5G 15G 37% /dmdata2
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 182M 0 182M 0% /run/user/0
[root@localhost ~]#
[root@localhost ~]# blkid
/dev/sda1: UUID="f5c128eb-513e-47c6-a725-564c557e05af" TYPE="xfs"
/dev/sda2: UUID="I3JO1t-Tqpj-3F5B-hlSt-lIgS-nY3p-cux7mc" TYPE="LVM2_member"
/dev/sdb1: UUID="a927f23c-f9bc-4b2e-8e2e-d369e8f9b176" TYPE="xfs"
/dev/sdc1: UUID="d176f4c4-c540-41f3-9ec3-3d079c323c7d" TYPE="ext4"
/dev/sr0: UUID="2020-11-04-11-36-43-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos"
/dev/mapper/centos-root: UUID="75b0fa64-e099-430f-a143-706f8fcc0209" TYPE="xfs"
/dev/mapper/centos-swap: UUID="a8d4df56-dad9-41ba-85e3-a7063645cc80" TYPE="swap"
[root@localhost ~]# xfs_
xfs_admin xfs_copy xfs_estimate xfs_fsr xfs_info xfs_logprint xfs_metadump xfs_ncheck xfs_repair
xfs_bmap xfs_db xfs_freeze xfs_growfs xfs_io xfs_mdrestore xfs_mkfile xfs_quota xfs_rtcp
[root@localhost ~]# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=1768960 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=7075840, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=3455, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 7075840 to 9698304
[root@localhost ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 40G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 39G 0 part
├─centos-root 253:0 0 37G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 1G 0 disk
└─sdb1 8:17 0 1023M 0 part /history_data
sdc 8:32 0 25G 0 disk
└─sdc1 8:33 0 25G 0 part /dmdata2
sr0 11:0 1 4.4G 0 rom
[root@localhost ~]# 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.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 37G 24G 14G 65% /
/dev/sdb1 1020M 33M 988M 4% /history_data
/dev/sdc1 25G 8.5G 15G 37% /dmdata2
/dev/sda1 1014M 151M 864M 15% /boot
tmpfs 182M 0 182M 0% /run/user/0
[root@localhost ~]#
此过程中需要注意,文件系统格式,否则会报出如下错误:

完成上述操作,我们就成功针对空间不足的问题进行解决了!

(三)卷组、逻辑卷的操作(挂载到指定路径)
注:这里新创建一个database_log目录,用于测试

1.创建分区:fdisk /dev/硬盘名
注:依次执行即可
[root@localhost ~]# fdisk /dev/xvdb
p # 查看分区信息
n # 创建分区
p # 选择主分区
回车默认,默认会将所有剩余空间都划入该分区
t # 修改分区格式
L # 列出所有分区格式信息
8e # 创建分区并标记为 Linux LVM(类型 8e),8e为lvm类型的hex代码
p # 查看分区信息
w # 保存并退出pvcreate /dev/sdb1 # 使用分区名(如/dev/sdb1)

2.创建物理卷,同上。

3.创建卷组

4.创建逻辑卷

5.查看分区信息

6.格式化文件系统
注:格式化之前先确定逻辑卷的信息及文件系统是什么格式
方式一:使用 df -TH 来进行查看
方式二:使用 blkid 查看所有盘符信息
EXT4文件系统下的格式化:


XFS文件系统下的格式化:

7.挂载与使用(挂载到前面所创建的 /database_log目录下)

8.扩展逻辑卷操作
如果扩展的是一个挂载的文件系统,可以直接运行resize2fs命令。resize2fs命令来自于英文词组“resize to filesystem”的缩写,其功能是用于同步文件系统容量到内核。如对ext3、ext4、XFS等设备卷容量进行了调整,则需要使用resize2fs命令同步信息到系统内核;如果是非挂载文件系统,需要先挂载文件系统。
xfs_growfs与resize2fs之间的主要区别是为识别文件系统而传递的参数。xfs_growfs命令将挂载点作为参数,resize2fs命令则将LV名称作为参数。xfs_growfs命令仅支持联机调整大小,而resize2fs命令同时支持联机和脱机调整大小。您可以调大或调小ext4文件系统的大小,但只能调大XFS文件系统的大小。
1、对于Ext4文件系统,可以使用resize2fs命令。语法格式: resize2fs [参数] 设备。
eg:resize2fs /dev/mapper/vg_ storage_test/lv_storage_test。
2、对于XFS文件系统,xfs_growfs可以直接扩展已经挂载的文件系统。
语法格式:xfs_growfs [参数] 设备。
eg:xfs_growfs /dev/vg_data/lv_data。
3、注意事项:在操作卷组(VG)和逻辑卷(LV)时,通常不需要手动执行同步命令(如 sync 或 partprobe),因为 LVM(逻辑卷管理)的创建和挂载流程由内核自动处理。
| 操作步骤 | 是否需要同步命令 | 备注 |
|---|---|---|
| 创建 PV/VG/LV | 否 | 内核自动生效 |
| 格式化文件系统 | 否 | mkfs直接写入设备 |
| 挂载/卸载 | 否 | mount/umount 直接生效 |
| 扩展 LV 或文件系统 | 否 | 需文件系统工具(如 xfs_growfs) |

如上所说,所以这里使用同步命令之后,报出已经做过同步,不需要做其他操作。
9.设置开机自动挂载
注:名称格式不能写错,否则可能开不了机
# echo "/dev/mapper/vg_database_log-lv_database_log /database_log ext4 defaults 0 0" >> /etc/fstab
# cat /etc/fstab(etc/fstab一个系统配置文件,用于定义文件系统的静态挂载信息,确保系统启动时自动挂载指定的存储设备或分区)。

10.重启查看

五、关键注意事项
1.文件系统类型
XFS 仅支持扩容不支持缩容
ext4 可通过resize2fs调整大小
2.根分区是否选用lvm管理方式
在 CentOS 7 系统中,如果根分区未使用 LVM(逻辑卷管理),则无法直接通过卷组(VG)动态扩容。但若系统已使用 LVM(默认安装通常会创建名为 centos 的卷组),只需按标准 LVM 流程扩容即可。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)