资讯动态

LVM命令手册:PV、VG、LV三层操作与在线扩容实战指南

发布时间:2026/10/15 11:56:33 来源:尧图企业网站定制
1. 为什么LVM值得单独整理一份命令手册刚接手服务器运维那会儿我最怕的就是磁盘空间告警。业务数据一天天涨/data分区眼瞅着就要满传统的分区方式要么停机加盘再重新分区要么用软链接把新盘挂到某个子目录下凑合时间一长目录结构乱得自己都记不清。后来被一位老运维点醒说你怎么不用LVM。从那之后磁盘扩容这件事从提心吊胆的大手术变成了敲两行命令的日常操作。LVM全称Logical Volume Manager逻辑卷管理。它做的事情说白了就是在物理磁盘和文件系统之间加了一层抽象。传统分区是物理磁盘直接切给文件系统用分区大小定死了就改不了。LVM在中间插了三个概念PVPhysical Volume物理卷、VGVolume Group卷组、LVLogical Volume逻辑卷。物理盘先做成PV多个PV汇成一个VGVG里再切出LV给文件系统用。这层抽象带来的最大好处就是——LV的大小可以随时调整只要VG里还有空闲空间扩容就是在线操作业务不用停。这份命令收集适合谁看如果你是刚接触Linux运维、被磁盘分区搞得头大的新手这份手册可以当字典用遇到场景直接查对应命令。如果你是有一定经验但LVM命令总是记不全的老手这里把PV、VG、LV三个层面的操作按场景串起来了比零散记命令更成体系。我下面会按先建后管再扩缩的逻辑把命令铺开每个命令都配上我实际用过的参数和踩过的坑尽量让你看完就能上手。2. 三个概念先理清楚PV、VG、LV到底谁管谁2.1 用盖楼类比理解三层结构很多人学LVM卡在概念上PV、VG、LV三个缩写绕来绕去。我用盖楼来类比一下你马上就通。PV就是一块块地皮。你手里有几块硬盘每块硬盘做成PV相当于把这块地圈起来登记在册说这块地以后归LVM管了。地皮本身不直接住人它只是资源。VG就是小区。你把一块或多块地皮PV划进同一个小区VG小区的地皮面积加起来就是小区的总占地面积。小区是资源池你在这个池子里规划盖楼。LV就是具体的楼栋。你在小区里划一块地盖一栋楼LV这栋楼有明确的面积容量楼里住人存数据。楼盖好了可以往旁边扩只要小区里还有空地VG有空闲空间。这个类比的关键在于扩容LV的前提是VG里有空闲空间。如果小区地皮全盖满了你想扩楼就得先买新地皮加PV进VG。很多人扩容失败就是因为没搞清这个前提直接对LV敲扩容命令结果报insufficient free space。2.2 命令的层级关系与操作顺序理解了概念命令的归属就清楚了。PV相关命令操作的是地皮VG相关命令操作的是小区LV相关命令操作的是楼栋。操作顺序永远是自下而上先有PV才能建VG先有VG才能建LV。层级命令前缀操作对象典型命令PVpv物理磁盘/分区pvcreate、pvdisplay、pvremoveVGvg卷组vgcreate、vgdisplay、vgextendLVlv逻辑卷lvcreate、lvdisplay、lvextend有个细节新手容易忽略做PV的可以是整块磁盘也可以是磁盘分区。用整盘做PV比如/dev/sdb操作简单但盘上就不能再有其他用途。用分区做PV比如/dev/sdb1更灵活但分区时要把分区类型标记成8eLinux LVM。我个人的习惯是数据盘直接用整盘做PV系统盘相关才用分区省得记分区类型。提示做PV之前务必确认磁盘上没有重要数据pvcreate会覆盖磁盘头部的元数据虽然不一定抹掉全部数据但风险极高生产环境操作前一定要有备份。3. PV层操作把裸盘变成LVM能认的地皮3.1 创建PV与查看PV信息创建PV的命令是pvcreate后面跟设备路径。假设我们新加了两块盘/dev/sdb和/dev/sdc都打算做PVpvcreate /dev/sdb /dev/sdc执行成功会输出Physical volume /dev/sdb successfully created。如果盘之前被用过、有残留的LVM或文件系统签名会提示是否覆盖加-ff强制覆盖但生产环境慎用先确认盘确实没用了。查看PV信息用pvdisplay不带参数显示所有PV的详情。信息量很大我一般关注几个字段PV Name是设备名PV Size是容量VG Name显示它属于哪个卷组还没加入VG时是空的Free PE是剩余可分配的物理扩展单元。如果只想快速看个概览用pvs更清爽pvs输出是一行一个PV列有PV名、所属VG、容量、剩余空间。排查这块盘到底加没加进LVM的时候pvs比pvdisplay快得多。3.2 移除PV的正确姿势移除PV用pvremove但有个硬性前提这个PV不能属于任何VG也不能有数据。如果PV还在VG里得先从VG里踢出去vgreduce再移除。pvremove /dev/sdc如果直接对还在VG里的PV敲pvremove会报错PV /dev/sdc is used by VG xxx。这时候别硬来先vgreduce 卷组名 /dev/sdc把它从卷组里摘出来再pvremove。摘之前还要确认这个PV上的数据已经迁移走了用pvmove把数据挪到同VG的其他PV上pvmove /dev/sdc vgreduce 卷组名 /dev/sdc pvremove /dev/sdcpvmove是个在线操作数据迁移过程中业务可以继续跑但会占用IO建议在业务低峰期做。我踩过一次坑盘快坏了想赶紧摘没做pvmove直接vgreduce结果报错说PV上有LV在用摘不掉。所以顺序一定是先迁数据、再摘PV、最后移除。3.3 PV扩容盘变大了怎么让LVM知道虚拟化环境里经常遇到这种情况虚拟机磁盘从控制台扩容了比如从100G调到200G但系统里pvs看到的还是100G。这是因为LVM的元数据还记着旧容量需要刷新。先确认系统识别到了新容量用lsblk看盘大小。如果lsblk显示的还是旧容量可能需要echo 1 /sys/class/block/sdb/device/rescan触发重扫SCSI盘适用。系统认到新容量后执行pvresize /dev/sdbpvresize会把PV的容量更新到磁盘实际大小多出来的空间自动变成VG的空闲空间之后就能用来扩LV了。这个命令我几乎每次虚拟机扩盘后都要用属于高频操作。4. VG层操作卷组的创建、扩容与空间盘点4.1 创建VG并规划PE大小创建VG用vgcreate基本语法是vgcreate 卷组名 PV列表。比如把/dev/sdb和/dev/sdc组成一个叫datavg的卷组vgcreate datavg /dev/sdb /dev/sdc这里有个参数值得说-s指定PEPhysical Extent大小。PE是LVM分配空间的最小单位默认4MB。LV扩容时必须是PE的整数倍所以PE大小决定了扩容的粒度。默认4MB对绝大多数场景够用不用改。但如果你的LV动辄几十TBPE太小会导致元数据里PE数量过多管理开销大这时候可以设大一点比如-s 16M。注意PE大小在VG创建时定死之后不能改。所以建VG前想清楚别建完才发现要调。我一般默认不指定用4MB除非有明确的超大卷需求。4.2 往VG里加盘vgextendVG空间不够了加新盘进去用vgextend。假设新加了/dev/sdd先做成PV再加进VGpvcreate /dev/sdd vgextend datavg /dev/sdd两步可以合并理解vgextend要求设备已经是PV所以pvcreate不能省。加完之后vgs就能看到datavg的容量变大了VFree空闲空间也相应增加。这里有个实操心得加盘进VG不会自动扩容任何LV。很多人以为加了盘空间就自动可用了其实只是VG的池子变大了具体哪个LV要扩、扩多少还得手动lvextend。我见过新手加完盘发现df -h没变化以为命令没生效其实就是这个原因。4.3 查看VG状态与空间分布查看VG用vgdisplay或vgs。vgs适合快速盘点vgdisplay看详情。我排查空间问题时习惯先vgs看全局重点关注VFree这一列它告诉你这个卷组还能切出多少空间给LV。如果VFree是0说明VG满了任何LV扩容都会失败得先加PV。如果VFree还有但某个LV扩不了那可能是PE碎片问题——空闲空间不连续。这种情况少见但真遇到可以用pvmove整理或者干脆加新盘。vgdisplay里还有几个字段值得留意PE Size是PE大小Total PE是总PE数Free PE是空闲PE数。Free PE乘以PE Size就是可用空间。比如Free PE是2560PE Size是4MB那可用空间就是10GB。4.4 从VG里移除PV与删除VG移除PV用vgreduce前提是PV上没有LV数据。有数据先pvmove迁走。删除整个VG用vgremove前提是VG里没有LV有LV先lvremove删掉。vgreduce datavg /dev/sdd vgremove datavg这两个命令都是破坏性操作执行前一定确认清楚。vgremove会连同VG的元数据一起删掉虽然PV上的数据理论上还在但重建VG后LV的映射关系没了数据基本等于丢了。生产环境删VG之前我至少会做两件事确认没有LV、确认有备份。5. LV层操作日常用得最多的扩容与缩容5.1 创建LV-L和-l的区别创建LV用lvcreate指定大小和名称。大小有两种指定方式-L按容量如-L 50G-l按PE个数或百分比如-l 100%FREE用光剩余空间。lvcreate -L 50G -n datalv datavg lvcreate -l 100%FREE -n loglv datavg-L 50G是切50GB出来-l 100%FREE是把VG剩余空间全给这个LV。后者在建独占一个VG的LV时特别方便不用算剩余多少。但要注意100%FREE会把空间用光之后这个VG就没法再建别的LV了除非加盘。创建完LV设备路径是/dev/卷组名/逻辑卷名比如/dev/datavg/datalv。之后就可以在上面做文件系统、挂载使用了。5.2 扩容LVlvextend加resize2fs或xfs_growfs扩容是LVM最高频的操作分两步先扩LV再扩文件系统。很多人只做了第一步df -h没变化就是因为文件系统没扩。扩LV用lvextendlvextend -L 20G /dev/datavg/datalv lvextend -l 100%FREE /dev/datavg/datalv-L 20G是在原基础上加20G注意前面的号没有是扩到指定大小。-l 100%FREE是把VG剩余空间全加给这个LV。扩完LV文件系统要跟着扩。这里分文件系统类型ext4用resize2fsresize2fs /dev/datavg/datalvxfs用xfs_growfs注意xfs_growfs跟的是挂载点不是设备xfs_growfs /dataxfs只能扩不能缩这是它和ext4的一个重要区别。我现在的习惯是数据盘统一用xfs因为扩容方便且性能稳定但前提是规划时别把LV建太大xfs缩容很麻烦。有个省事的参数lvextend加-rresize的缩写会自动调用对应的文件系统扩容命令一步到位lvextend -L 20G -r /dev/datavg/datalv这个-r我强烈推荐能省掉忘记扩文件系统导致的扩容了但没生效问题。不过要注意-r依赖系统里有对应的工具极老的系统可能不支持。5.3 缩容LV为什么我劝你尽量别做缩容比扩容危险得多因为要先缩文件系统、再缩LV顺序反了直接丢数据。而且ext4缩容要求先卸载文件系统意味着业务得停。ext4缩容流程umount /data e2fsck -f /dev/datavg/datalv resize2fs /dev/datavg/datalv 30G lvreduce -L 30G /dev/datavg/datalv mount /data每一步都不能省。e2fsck检查文件系统resize2fs把文件系统缩到30Glvreduce再把LV缩到30G。注意resize2fs的目标大小要略小于或等于lvreduce的目标否则文件系统比LV大直接损坏。xfs根本不支持缩容只能备份数据、删LV、重建、恢复。所以我的建议是规划LV时宁可建小一点后续按需扩也别建太大再想着缩。扩容是安全的在线操作缩容是高风险停机操作两者代价完全不对等。5.4 删除LV与快照的简单用法删除LV用lvremove前提是已卸载umount /data lvremove /dev/datavg/datalvLVM还有个实用功能是快照snapshot可以在线给LV做个时间点副本用于备份或测试。创建快照lvcreate -L 10G -s -n datalv_snap /dev/datavg/datalv-s表示快照-L 10G是给快照分配的空间。快照不是完整复制只记录原LV的变化量所以空间不用给太大但要够容纳变化的数据。如果快照空间被写满快照就失效了。快照常用于备份前打个快照然后从容备份备份完删快照避免备份过程中数据变化导致不一致。6. 几个真实场景下的命令组合与避坑记录6.1 场景一根分区快满了在线扩容这是最常见的场景。假设根分区是LVVG里还有空闲空间。流程vgs # 确认VFree有空间 lvextend -L 10G -r /dev/rootvg/rootlv df -h / # 确认生效如果根分区是xfs-r会自动调xfs_growfs在线完成不用重启不用卸载。如果是ext4-r调resize2fs同样在线。这个操作我做过很多次只要VG有空闲基本零风险。坑点如果vgs显示VFree是0那就得先加盘vgextend再扩LV。别跳过确认VFree这步直接扩会报错。6.2 场景二虚拟机磁盘扩容后LVM没认到虚拟化平台把盘从100G调到200G系统里lsblk可能显示200G但pvs还是100G。这时候pvresize /dev/sdb vgs # 确认VFree增加 lvextend -l 100%FREE -r /dev/datavg/datalvpvresize是关键它把PV容量同步到磁盘实际大小。如果lsblk都没显示新容量先重扫磁盘再pvresize。6.3 场景三误删LV后的应急思路lvremove删掉LV元数据就没了常规手段恢复不了。如果这个LV有快照可以从快照恢复。没有快照的话只能靠备份。所以我的经验是重要数据要么有快照要么有备份两者至少有一个。LVM本身不提供回收站功能删了就是删了。如果只是误删了LV但PV还在理论上可以用vgcfgrestore从VG的元数据备份恢复LV配置。LVM会自动在/etc/lvm/archive/下存VG配置的历史版本找到删除前的版本vgcfgrestore -f /etc/lvm/archive/datavg_00001-1234567890.vg datavg这个操作有风险恢复前最好先vgcfgbackup备份当前状态。而且恢复的是LV的配置LV里的数据能不能读出来还得看运气。我试过一次成功恢复了LV结构数据也在但那是运气好不能当常规手段。6.4 命令速查表把常用命令按层级整理成表方便查阅操作PV层VG层LV层创建pvcreatevgcreatelvcreate查看详情pvdisplayvgdisplaylvdisplay查看概览pvsvgslvs扩容pvresizevgextendlvextend缩容-vgreducelvreduce删除pvremovevgremovelvremove迁移数据pvmove--这张表我建议截图存手机里现场操作时对着敲比翻文档快。7. 我这些年攒下的LVM操作心得LVM这套东西命令本身不难难的是理解它的空间分配逻辑和操作顺序。我总结几条自己踩坑换来的经验。第一条扩容永远比缩容安全。规划存储时按最小需求建LV后续不够了在线扩这是最稳的路子。反过来建大了想缩ext4要卸载要fsckxfs干脆不支持代价太大。第二条操作前先看pvs、vgs、lvs三件套。这三个命令输出清爽一眼能看清当前PV、VG、LV的容量和剩余空间。很多人扩容失败就是因为没看VG剩余空间直接敲lvextend结果报空间不足。养成先看后操作的习惯能省很多事。第三条lvextend -r是个好东西但要确认系统支持。老系统上-r可能不生效那就老老实实两步走先lvextend再手动resize2fs或xfs_growfs。判断文件系统类型用df -T或lsblk -f。第四条PE大小建VG时定之后改不了。默认4MB够用别手贱去改。除非你有几十TB的单卷需求才考虑调大PE减少元数据开销。第五条快照不是备份但能配合备份用。快照空间写满就失效而且快照和原LV在同一VG里原LV所在盘坏了快照也一起坏。所以快照只能当临时一致性视图用真正的备份还得落到别的存储上。最后说个排查思路。LVM出问题先看dmesg有没有磁盘IO错误再看pvs/vgs/lvs确认LVM层状态最后看df -h确认文件系统层。三层逐级排查基本能定位问题在哪一层。LVM层的问题多半是空间不足或元数据损坏文件系统层的问题多半是没扩文件系统或文件系统损坏。分层排查比瞎敲命令高效得多。这套命令和思路我用了好几年从单机到集群从几块盘到几十块盘基本没出过大问题。LVM不是银弹但它把磁盘管理这件事从停机大修变成了日常维护这个价值对运维来说太大了。希望这份整理能帮你少走点弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑