磁盘满了没法扩容?Linux LVM 逻辑卷全套实操,在线扩容不宕机

📅 2026/8/3 13:21:29 👁️ 阅读次数 📝 编程学习
磁盘满了没法扩容?Linux LVM 逻辑卷全套实操,在线扩容不宕机

前言💡小白运维痛点直击

有没有小伙伴踩过这些存储大坑?

  1. 服务器硬盘分区空间满了,分区后面没有空余空间,根本没法扩容,业务被迫停机删文件🤦‍
  2. 多块 20G 硬盘,想合并成 40G 大容量存储,普通分区完全做不到
  3. 想备份某个时刻磁盘数据,又不想关机打虚拟机快照
  4. 单块硬盘损坏直接丢全部业务数据,无冗余方案

传统固定分区存在致命缺陷,而LVM 逻辑卷管理就是企业运维标准解决方案!

本篇全程小白友好,先讲运维实际用途、完整实验思路,所有命令逐行带详细注释、输出结果完整保留,搭配大量对比表格、警示文本框,零基础也能跟着实操落地。

一、为什么要用 LVM?传统分区 VS LVM 逻辑卷对比

🎯生产运维实际作用

  1. 弹性扩容:业务增长磁盘不够,随时新增硬盘扩充容量,无需重新分区重装系统
  2. 多盘合并:多块物理硬盘整合为一个大存储池,突破单盘容量限制
  3. 在线调整:XFS 文件系统支持不停机扩容,业务无中断
  4. 数据快照:瞬间备份卷内全部数据,故障快速回滚
  5. RAID 冗余:支持 raid1/raid5,单盘损坏数据不丢失

传统分区缺陷

⚠️固定分区致命短板

  1. 空间连续要求:扩容必须分区后方有空闲空间,磁盘规划错误就无法扩容
  2. 不能跨硬盘:一个文件系统只能在单块硬盘,多硬盘无法合并使用
  3. 无快照 / 冗余机制,硬盘故障数据直接丢失

LVM 逻辑卷优势

✅LVM 核心优势

  1. 存储池化:多块硬盘统一做成资源池,按需分配空间
  2. 弹性伸缩:随时加硬盘扩容,支持在线扩容
  3. 快照备份:秒级创建数据快照,用于数据备份、测试环境
  4. RAID 逻辑卷:硬件无 RAID 卡也能实现磁盘冗余

传统分区 vs LVM 对比表

对比维度普通磁盘分区(/dev/sda1)LVM 逻辑卷
扩容限制分区后方必须有空余空间,无法跨硬盘可新增硬盘加入存储池,无限扩容
多硬盘合并不支持,单文件系统只能存一块盘多 PV 合并 VG,统一分配空间
在线扩容多数场景需要停机XFS 支持不停机在线扩容
数据快照无原生快照功能支持创建读写快照,快速回滚
磁盘冗余不支持内置 raid1/raid5 逻辑卷
运维灵活性极差,前期规划失误后期无解极高,业务扩容零停机

二、LVM 三大核心概念通俗拆解

三层结构逻辑(PV→VG→LV)

  1. PV(物理卷):底层物理硬盘 / 分区,给 LVM 做底层存储单元
  2. VG(卷组):多个 PV 合并成统一存储资源池
  3. LV(逻辑卷):从 VG 池中划分空间,格式化挂载给业务使用

三层概念通俗表格

名词全称通俗理解对应设备示例
PVPhysical Volume 物理卷一块块单独硬盘原材料/dev/sdb /dev/sdc
VGVolume Group 卷组材料堆,把所有硬盘合并成大仓库vg 名称 webapp、dbapp
LVLogical Volume 逻辑卷从仓库划出独立分区,存放业务数据/dev/webapp/webapp01

LVM 完整操作总流程

  1. 准备空闲硬盘 → 2. pvcreate 创建 PV → 3. vgcreate 创建 VG 存储池 → 4. lvcreate 划分 LV → 5. mkfs 格式化 → 6. mount 挂载使用
  2. 扩容场景:新增硬盘→pvcreate→vgextend 扩容 VG→lvextend 扩容 LV→更新文件系统
  3. 备份场景:lvcreate -s 创建快照卷

三、实验环境准备

实验环境说明

虚拟机新增 3 块 20G 空闲硬盘,设备名称:/dev/sdb/dev/sdc/dev/sdd

# lsblk列出三块硬盘,{b..d}批量匹配sdb sdc sdd# lsblk:查看块设备树形工具# /dev/sd{b..d} shell批量简写,一次性查看三块硬盘[root@centos7 ~]# lsblk /dev/sd{b..d}NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb8:16020G0disk sdc8:32020G0disk sdd8:48020G0disk

输出解读:三块硬盘均为 20G 本地磁盘,无分区、无挂载,可全部用于 LVM 实验

四、LVM 基础创建全套实操(PV/VG/LV 创建、格式化挂载)

4.1 创建物理卷 PV

pvcreate:将裸硬盘 / 分区初始化为 LVM 物理卷,写入 LVM 标识,才能加入卷组

# 单块硬盘创建PV# pvcreate:初始化物理卷;/dev/sdb 目标裸硬盘[root@centos7 ~]# pvcreate /dev/sdbPhysical volume"/dev/sdb"successfully created.# 批量多块硬盘创建PV,{c,d}匹配sdc、sdd两块硬盘[root@centos7 ~]# pvcreate /dev/sd{c,d}Physical volume"/dev/sdc"successfully created. Physical volume"/dev/sdd"successfully created.

查看所有物理卷 pvs

pvs:精简输出 PV 列表,快速查看 PV 归属 VG、剩余空闲空间

[root@centos7 ~]# pvsPV VG Fmt Attr PSize PFree /dev/sdb lvm2 ---20.00g20.00g /dev/sdc lvm2 ---20.00g20.00g /dev/sdd lvm2 ---20.00g20.00g

输出字段解释表格

字段含义
PV物理卷设备名
VG所属卷组,空白代表未加入任何 VG
Fmt格式 lvm2(CentOS7 默认 LVM 格式)
Attr属性,— 代表未加入卷组
PSize硬盘总容量
PFree硬盘剩余空闲空间

查看单块 PV 详细信息 pvdisplay

pvdisplay:打印 PV 完整底层参数、UUID、PE 块信息

# pvdisplay:查看详细PV信息;/dev/sdb 指定设备[root@centos7 ~]# pvdisplay /dev/sdb"/dev/sdb"is a new physical volume of"20.00 GiB"--- NEW Physical volume --- PV Name /dev/sdb VG Name PV Size20.00GiB Allocatable NO PE Size0Total PE0Free PE0Allocated PE0PV UUID MBHW0w-OkJL-CasO-PYRR-sduS-U2m5-zdkQ5d

关键字段解释:

PE:物理最小存储单元,创建 VG 时指定,默认 4M;未加入 VG 则 PE Size 为 0

4.2 创建卷组 VG

vgcreate:将 1 个或多个 PV 合并为统一存储池(卷组)

示例 1:单硬盘创建 VG webapp(业务网站存储池)

# vgcreate 卷组名 物理卷设备# webapp:自定义卷组名称;/dev/sdb 作为底层PV[root@centos7 ~]# vgcreate webapp /dev/sdbVolume group"webapp"successfully created

示例 2:两块硬盘合并创建 dbapp 数据库存储池

# /dev/sd{c,d} 两块20G硬盘合并成40G存储池dbapp[root@centos7 ~]# vgcreate dbapp /dev/sd{c,d}Volume group"dbapp"successfully created

查看 VG 列表 vgs

vgs:精简展示所有卷组 PV 数量、LV 数量、总容量、空闲容量

[root@centos7 ~]# pvsPV VG Fmt Attr PSize PFree /dev/sdb webapp lvm2 a--<20.00g<20.00g /dev/sdc dbapp lvm2 a--<20.00g<20.00g /dev/sdd dbapp lvm2 a--<20.00g<20.00g[root@centos7 ~]# vgsVG#PV #LV #SN Attr VSize VFreedbapp200wz--n-39.99g39.99g webapp100wz--n-<20.00g<20.00g

vgs 字段说明表

字段含义
VG卷组名称
#PV该卷组包含几块物理硬盘
#LV已创建逻辑卷数量
VSize卷组总容量
VFree卷组剩余空闲空间

查看 VG 详细信息 vgdisplay

# vgdisplay 卷组名,输出PE大小、总PE、空闲PE[root@centos7 ~]# vgdisplay dbapp--- Volume group --- VG Name dbapp System ID Format lvm2 Metadata Areas2Metadata Sequence No1VG Access read/write VG Status resizable MAX LV0Cur LV0Open LV0Max PV0Cur PV2Act PV2VG Size39.99GiB PE Size4.00MiB# PE最小存储块,默认4MTotal PE10238Alloc PE / Size0/0Free PE / Size10238/39.99GiB VG UUID kjY26m-D0ax-WmMq-fMJv-1Tnb-imqh-GOAWkG

4.3 创建逻辑卷 LV

lvcreate:从 VG 空闲空间划分逻辑卷

参数说明文本框

lvcreate 核心参数

-n:指定逻辑卷名称

-L:指定逻辑卷总容量(支持 G/M)

末尾参数:卷组名称

示例 1:webapp 卷组创建 5G 网站逻辑卷 webapp01

# -n webapp01 逻辑卷名称;-L 5G 分配5G空间;webapp 来源卷组[root@centos7 ~]# lvcreate -n webapp01 -L 5G webappLogical volume"webapp01"created.

示例 2:dbapp 双硬盘卷组创建 25G 跨盘数据库卷 data01

# 两块20G硬盘合并池,划出25G逻辑卷,自动跨两块硬盘存储[root@centos7 ~]# lvcreate -n data01 -L 25G dbappLogical volume"data01"created.

查看逻辑卷 lvs

[root@centos7 ~]# lvsLV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert data01 dbapp -wi-a-----25.00g webapp01 webapp -wi-a-----5.00g

逻辑卷三种访问路径说明

# 三种等价设备路径,全部指向同一个逻辑卷[root@centos7 ~]# ls -l /dev/dbapp/data01 /dev/mapper/dbapp-data01lrwxrwxrwx1root root761718:26 /dev/dbapp/data01 ->../dm-4 lrwxrwxrwx1root root761718:26 /dev/mapper/dbapp-data01 ->../dm-4
  1. /dev/VG 名 / LV 名(最直观,推荐日常使用)
  2. /dev/mapper/VG-LV(系统底层映射文件)
  3. /dev/dm-N(内核原始设备号,运维极少使用)

lvdisplay 查看 LV 完整信息

[root@centos7 ~]# lvdisplay /dev/dbapp/data01--- Logical volume --- LV Path /dev/dbapp/data01 LV Name data01 VG Name dbapp LV UUID W8UafB-A7RJ-dBjM-bsA2-8Obc-p8gE-bMZgmm LV Write Access read/write LV Creation host,timecentos7.linux.com,2022-12-2611:42:40 +0800 LV Status available# open 0LV Size25.00GiB Current LE6400Segments2# 2个物理段,代表跨两块硬盘存储Allocation inherit Read ahead sectors auto - currentlysetto8192Block device253:4

Segments=2:代表该 25G 逻辑卷同时占用 sdc、sdd 两块硬盘,完美实现跨盘存储

验证 PV 空间占用

[root@centos7 ~]# pvsPV VG Fmt Attr PSize PFree /dev/sdb webapp lvm2 a--<20.00g<15.00g /dev/sdc dbapp lvm2 a--<20.00g0# sdc全部用完/dev/sdd dbapp lvm2 a--<20.00g14.99g# sdd剩余15G

lsblk 树形查看跨盘结构

[root@centos7 ~]# lsblk /dev/sd{b..d}NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sdb8:16020G0disk └─webapp-webapp01253:305G0lvm sdc8:32020G0disk └─dbapp-data01253:4025G0lvm sdd8:48020G0disk └─dbapp-data01253:4025G0lvm

清晰看到 data01 横跨 sdc、sdd 两块物理磁盘

4.4 格式化逻辑卷并挂载

# mkfs.xfs:将逻辑卷格式化为XFS文件系统(CentOS7默认,仅支持扩容)[root@centos7 ~]# mkfs.xfs /dev/webapp/webapp01# mount:挂载逻辑卷到网站根目录# /usr/share/nginx/html Nginx网页存放目录[root@centos7 ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html

持久化开机自动挂载:修改 /etc/fstab 写入 LV 的 UUID,服务器重启自动挂载

4.5 LVM 全套清理(实验复原)

完整销毁流程:卸载 → 删除 LV → 删除 VG → 删除 PV

# umount 卸载挂载点,不卸载无法删除LV[root@centos7 ~]# umount /dev/webapp/webapp01# lvremove 删除逻辑卷,交互输入y确认删除[root@centos7 ~]# lvremove /dev/webapp/webapp01 /dev/dbapp/data01Do you really want to remove active logical volume webapp/webapp01?[y/n]: y Logical volume"webapp01"successfully removed Do you really want to remove active logical volume dbapp/data01?[y/n]: y Logical volume"data01"successfully removed# vgremove 删除卷组[root@centos7 ~]# vgremove webapp dbappVolume group"webapp"successfully removed Volume group"dbapp"successfully removed# pvremove 擦除硬盘LVM标识,恢复普通裸硬盘[root@centos7 ~]# pvremove /dev/sd{b..d}Labels on physical volume"/dev/sdb"successfully wiped. Labels on physical volume"/dev/sdc"successfully wiped. Labels on physical volume"/dev/sdd"successfully wiped.

五、卷组 VG 扩容与缩减实操

5.1 扩容卷组 vgextend

业务增长,VG 空间不足,新增硬盘加入存储池

# 先创建单盘VG webapp[root@centos7 ~]# pvcreate /dev/sdb[root@centos7 ~]# vgcreate webapp /dev/sdb[root@centos7 ~]# lvcreate -n webapp01 -L 10G webapp# vgextend:将sdc、sdd两块硬盘加入webapp卷组,扩容VG总容量[root@centos7 ~]# vgextend webapp /dev/sd{c,d}Physical volume"/dev/sdc"successfully created. Physical volume"/dev/sdd"successfully created. Volume group"webapp"successfully extended

5.2 缩减卷组 vgreduce

核心前置⚠️警示文本

⚠️缩减 VG 前提:要移除的 PV 上无任何数据占用,否则命令直接报错

若 PV 存有数据,必须先用 pvmove 把数据迁移到同 VG 其他硬盘,再剔除 PV

完整缩容流程

# 查看PV占用状态[root@centos7 ~]# pvsPV VG Fmt Attr PSize PFree /dev/sdb webapp lvm2 a--<20.00g<10.00g# 有数据占用,无法直接剔除/dev/sdc webapp lvm2 a--<20.00g<20.00g /dev/sdd webapp lvm2 a--<20.00g<20.00g# pvmove /dev/sdb:把sdb上全部数据迁移到VG内其他空闲硬盘[root@centos7 ~]# pvmove /dev/sdb# 指定目标硬盘迁移:pvmove /dev/sdb /dev/sdd[root@centos7 ~]# pvmove /dev/sdb /dev/sdd/dev/sdb: Moved:0.51% /dev/sdb: Moved:100.00%# 迁移完成,sdb无数据,执行vgreduce移除PV[root@centos7 ~]# vgreduce webapp /dev/sdbRemoved"/dev/sdb"from volume group"webapp"# 验证sdb已脱离卷组[root@centos7 ~]# pvsPV VG Fmt Attr PSize PFree /dev/sdb lvm2 ---20.00g20.00g /dev/sdc webapp lvm2 a--<20.00g<20.00g /dev/sdd webapp lvm2 a--<20.00g<10.00g

六、逻辑卷 LV 扩容、缩容

6.1 扩容逻辑卷 lvextend

方式 1:增加指定容量(+2G 代表扩容 2G)

# -L +2G 在原有基础上加2G空间[root@centos7 ~]# lvextend -L +2G /dev/webapp/webapp01Size of logical volume webapp/webapp01 changed from10.00GiB(2560extents)to12.00GiB(3072extents). Logical volume webapp/webapp01 successfully resized.[root@centos7 ~]# lvs /dev/webapp/webapp01LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert webapp01 webapp -wi-a-----12.00g

6.2 缩减逻辑 lvreduce

⚠️高危提示:缩容会删除超出空间内数据,生产严禁随意执行!

# -L -2G 减少2G容量,交互输入y确认[root@centos7 ~]# lvreduce -L -2G /dev/webapp/webapp01WARNING: Reducing active logical volume to10.00GiB. THIS MAY DESTROY YOUR DATA(filesystem etc.)Do you really want to reduce webapp/webapp01?[y/n]: y Size of logical volume webapp/webapp01 changed from12.00GiB(3072extents)to10.00GiB(2560extents). Logical volume webapp/webapp01 successfully resized.[root@centos7 ~]# lvs /dev/webapp/webapp01LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert webapp01 webapp -wi-a-----10.00g

七、文件系统扩容(XFS/EXT4 区分)

7.1 XFS 文件系统(CentOS7 默认,仅支持扩容,不可缩容)

两步扩容流程:lvextend 扩容 LV → xfs_growfs 刷新文件系统

# 1. 将LV扩容至15G[root@centos7 ~]# lvextend -L 15G /dev/webapp/webapp01[root@centos7 ~]# lvs /dev/webapp/webapp01LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert webapp01 webapp -wi-ao----15.00g# 2. xfs_growfs 在线刷新挂载点,无需卸载[root@centos7 ~]# xfs_growfs /usr/share/nginx/html[root@centos7 ~]# df -h /usr/share/nginx/html文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/webapp-webapp01 15G 140M 15G1% /usr/share/nginx/html

一键合并扩容(-r 自动同步文件系统)

# -r 参数:扩容LV同时自动刷新文件系统,简化操作[root@centos7 ~]# lvextend -rL 20G /dev/webapp/webapp01[root@centos7 ~]# df -h /usr/share/nginx/html文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/webapp-webapp01 20G 176M 20G1% /usr/share/nginx/html

7.2 EXT4 文件系统(支持扩容 + 缩容)

扩容操作

[root@centos7 ~]# lvextend -L 25G /dev/webapp/webapp01# resize2fs 刷新ext4文件系统[root@centos7 ~]# resize2fs /dev/webapp/webapp01

EXT4 缩容强制流程文本框

🚨EXT4 缩容四步硬性要求,顺序不能乱

  1. umount 卸载文件系统(不能在线缩容)
  2. e2fsck -f 强制检测磁盘错误
  3. resize2fs 缩减文件系统容量
  4. lvreduce 缩减逻辑卷容量
# 1 卸载[root@centos7 ~]# umount /usr/share/nginx/html# 2 强制磁盘检测[root@centos7 ~]# e2fsck -f /dev/webapp/webapp01# 3 文件系统缩至10G[root@centos7 ~]# resize2fs /dev/webapp/webapp01 10G# 4 LV缩容[root@centos7 ~]# lvreduce -L 10G /dev/webapp01# 5 重新挂载验证[root@centos7 ~]# mount /usr/share/nginx/html

八、LVM 快照(数据备份神器)

快照作用🎯

瞬间复制逻辑卷当前全部数据,用于升级、测试前备份,故障一键恢复;快照占用空间仅记录变更数据,节省存储。

创建快照命令参数

-s:snapshot 创建快照卷;-L 指定快照容量(不小于源 LV 使用空间)

# 创建webapp01快照webapp01-snap1,分配10G快照空间[root@centos7 ~]# lvcreate -s -n webapp01-snap1 -L 10G /dev/webapp/webapp01Logical volume"webapp01-snap1"created.# 挂载快照查看备份数据[root@centos7 ~]# mount /dev/webapp/webapp01-snap1 /webapp/webapp01/

九、LVM RAID1 冗余卷(单盘不坏数据)

运维场景

服务器无硬件 RAID 卡,使用 LVM 软 RAID1 实现双盘镜像,一块硬盘损坏数据不丢失

# --type raid1 创建镜像逻辑卷[root@centos7 ~]# lvcreate --type raid1 -n webapp01 -L 15G webapp[root@centos7 ~]# mkfs.xfs /dev/webapp/webapp01[root@centos7 ~]# mount /dev/webapp/webapp01 /usr/share/nginx/html/

硬盘故障修复流程

# 1 移除损坏硬盘[root@centos7 ~]# vgreduce --removemissing webapp --force# 2 新增硬盘加入VG[root@centos7 ~]# vgextend webapp /dev/sdd# 3 重建raid镜像[root@centos7 ~]# lvconvert --repair /dev/webapp/webapp01

十、全文运维速查表格

LVM 全套命令汇总表

操作目标命令核心作用
初始化硬盘为 PVpvcreate /dev/sdb裸硬盘转为 LVM 物理卷
查看 PVpvs / pvdisplay查看物理卷信息
创建卷组vgcreate vg 名 /dev/sdb多 PV 合并存储池
扩容 VGvgextend vg 名 /dev/sdc新增硬盘加入 VG
缩减 VGpvmove + vgreduce迁移数据后移除 PV
创建逻辑卷lvcreate -n 名 -L 容量 VG划分业务存储卷
扩容 LVlvextend +/- 容量 设备扩大逻辑卷空间
XFS 刷新扩容xfs_growfs 挂载点在线生效扩容
EXT4 刷新resize2fs 设备ext 文件系统调整
创建快照lvcreate -s -n 快照名数据瞬时备份
创建 RAID1lvcreate --type raid1双盘数据镜像
删除 LV/VG/PVlvremove/vgremove/pvremove销毁 LVM 结构