前言💡小白运维痛点直击
有没有小伙伴踩过这些存储大坑?
- 服务器硬盘分区空间满了,分区后面没有空余空间,根本没法扩容,业务被迫停机删文件🤦
- 多块 20G 硬盘,想合并成 40G 大容量存储,普通分区完全做不到
- 想备份某个时刻磁盘数据,又不想关机打虚拟机快照
- 单块硬盘损坏直接丢全部业务数据,无冗余方案
传统固定分区存在致命缺陷,而LVM 逻辑卷管理就是企业运维标准解决方案!
本篇全程小白友好,先讲运维实际用途、完整实验思路,所有命令逐行带详细注释、输出结果完整保留,搭配大量对比表格、警示文本框,零基础也能跟着实操落地。
一、为什么要用 LVM?传统分区 VS LVM 逻辑卷对比
🎯生产运维实际作用
- 弹性扩容:业务增长磁盘不够,随时新增硬盘扩充容量,无需重新分区重装系统
- 多盘合并:多块物理硬盘整合为一个大存储池,突破单盘容量限制
- 在线调整:XFS 文件系统支持不停机扩容,业务无中断
- 数据快照:瞬间备份卷内全部数据,故障快速回滚
- RAID 冗余:支持 raid1/raid5,单盘损坏数据不丢失
传统分区缺陷
⚠️固定分区致命短板
- 空间连续要求:扩容必须分区后方有空闲空间,磁盘规划错误就无法扩容
- 不能跨硬盘:一个文件系统只能在单块硬盘,多硬盘无法合并使用
- 无快照 / 冗余机制,硬盘故障数据直接丢失
LVM 逻辑卷优势
✅LVM 核心优势
- 存储池化:多块硬盘统一做成资源池,按需分配空间
- 弹性伸缩:随时加硬盘扩容,支持在线扩容
- 快照备份:秒级创建数据快照,用于数据备份、测试环境
- RAID 逻辑卷:硬件无 RAID 卡也能实现磁盘冗余
传统分区 vs LVM 对比表
| 对比维度 | 普通磁盘分区(/dev/sda1) | LVM 逻辑卷 |
|---|---|---|
| 扩容限制 | 分区后方必须有空余空间,无法跨硬盘 | 可新增硬盘加入存储池,无限扩容 |
| 多硬盘合并 | 不支持,单文件系统只能存一块盘 | 多 PV 合并 VG,统一分配空间 |
| 在线扩容 | 多数场景需要停机 | XFS 支持不停机在线扩容 |
| 数据快照 | 无原生快照功能 | 支持创建读写快照,快速回滚 |
| 磁盘冗余 | 不支持 | 内置 raid1/raid5 逻辑卷 |
| 运维灵活性 | 极差,前期规划失误后期无解 | 极高,业务扩容零停机 |
二、LVM 三大核心概念通俗拆解
三层结构逻辑(PV→VG→LV)
- PV(物理卷):底层物理硬盘 / 分区,给 LVM 做底层存储单元
- VG(卷组):多个 PV 合并成统一存储资源池
- LV(逻辑卷):从 VG 池中划分空间,格式化挂载给业务使用
三层概念通俗表格
| 名词 | 全称 | 通俗理解 | 对应设备示例 |
|---|---|---|---|
| PV | Physical Volume 物理卷 | 一块块单独硬盘原材料 | /dev/sdb /dev/sdc |
| VG | Volume Group 卷组 | 材料堆,把所有硬盘合并成大仓库 | vg 名称 webapp、dbapp |
| LV | Logical Volume 逻辑卷 | 从仓库划出独立分区,存放业务数据 | /dev/webapp/webapp01 |
LVM 完整操作总流程
- 准备空闲硬盘 → 2. pvcreate 创建 PV → 3. vgcreate 创建 VG 存储池 → 4. lvcreate 划分 LV → 5. mkfs 格式化 → 6. mount 挂载使用
- 扩容场景:新增硬盘→pvcreate→vgextend 扩容 VG→lvextend 扩容 LV→更新文件系统
- 备份场景: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.00gvgs 字段说明表
| 字段 | 含义 |
|---|---|
| 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-GOAWkG4.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 root76月1718:26 /dev/dbapp/data01 ->../dm-4 lrwxrwxrwx1root root76月1718:26 /dev/mapper/dbapp-data01 ->../dm-4- /dev/VG 名 / LV 名(最直观,推荐日常使用)
- /dev/mapper/VG-LV(系统底层映射文件)
- /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:4Segments=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剩余15Glsblk 树形查看跨盘结构
[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 extended5.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.00g6.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/html7.2 EXT4 文件系统(支持扩容 + 缩容)
扩容操作
[root@centos7 ~]# lvextend -L 25G /dev/webapp/webapp01# resize2fs 刷新ext4文件系统[root@centos7 ~]# resize2fs /dev/webapp/webapp01EXT4 缩容强制流程文本框
🚨EXT4 缩容四步硬性要求,顺序不能乱
- umount 卸载文件系统(不能在线缩容)
- e2fsck -f 强制检测磁盘错误
- resize2fs 缩减文件系统容量
- 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 全套命令汇总表
| 操作目标 | 命令 | 核心作用 |
|---|---|---|
| 初始化硬盘为 PV | pvcreate /dev/sdb | 裸硬盘转为 LVM 物理卷 |
| 查看 PV | pvs / pvdisplay | 查看物理卷信息 |
| 创建卷组 | vgcreate vg 名 /dev/sdb | 多 PV 合并存储池 |
| 扩容 VG | vgextend vg 名 /dev/sdc | 新增硬盘加入 VG |
| 缩减 VG | pvmove + vgreduce | 迁移数据后移除 PV |
| 创建逻辑卷 | lvcreate -n 名 -L 容量 VG | 划分业务存储卷 |
| 扩容 LV | lvextend +/- 容量 设备 | 扩大逻辑卷空间 |
| XFS 刷新扩容 | xfs_growfs 挂载点 | 在线生效扩容 |
| EXT4 刷新 | resize2fs 设备 | ext 文件系统调整 |
| 创建快照 | lvcreate -s -n 快照名 | 数据瞬时备份 |
| 创建 RAID1 | lvcreate --type raid1 | 双盘数据镜像 |
| 删除 LV/VG/PV | lvremove/vgremove/pvremove | 销毁 LVM 结构 |