1. 为什么LVM值得单独整理一份命令手册
刚接手服务器运维那会儿,我最怕的就是磁盘空间告警。业务数据一天天涨,/data分区眼瞅着就要满,传统的分区方式要么停机加盘再重新分区,要么用软链接把新盘挂到某个子目录下凑合,时间一长目录结构乱得自己都记不清。后来被一位老运维点醒,说你怎么不用LVM。从那之后,磁盘扩容这件事从"提心吊胆的大手术"变成了"敲两行命令的日常操作"。
LVM全称Logical Volume Manager,逻辑卷管理。它做的事情说白了就是在物理磁盘和文件系统之间加了一层抽象。传统分区是物理磁盘直接切给文件系统用,分区大小定死了就改不了。LVM在中间插了三个概念:PV(Physical Volume,物理卷)、VG(Volume Group,卷组)、LV(Logical Volume,逻辑卷)。物理盘先做成PV,多个PV汇成一个VG,VG里再切出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。
| 层级 | 命令前缀 | 操作对象 | 典型命令 |
|---|---|---|---|
| PV | pv | 物理磁盘/分区 | pvcreate、pvdisplay、pvremove |
| VG | vg | 卷组 | vgcreate、vgdisplay、vgextend |
| LV | lv | 逻辑卷 | lvcreate、lvdisplay、lvextend |
有个细节新手容易忽略:做PV的可以是整块磁盘,也可以是磁盘分区。用整盘做PV(比如/dev/sdb)操作简单,但盘上就不能再有其他用途。用分区做PV(比如/dev/sdb1)更灵活,但分区时要把分区类型标记成8e(Linux LVM)。我个人的习惯是数据盘直接用整盘做PV,系统盘相关才用分区,省得记分区类型。
提示:做PV之前务必确认磁盘上没有重要数据,
pvcreate会覆盖磁盘头部的元数据,虽然不一定抹掉全部数据,但风险极高,生产环境操作前一定要有备份。
3. PV层操作:把裸盘变成LVM能认的"地皮"
3.1 创建PV与查看PV信息
创建PV的命令是pvcreate,后面跟设备路径。假设我们新加了两块盘/dev/sdb和/dev/sdc,都打算做PV:
pvcreate /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指定PE(Physical Extent)大小。PE是LVM分配空间的最小单位,默认4MB。LV扩容时必须是PE的整数倍,所以PE大小决定了扩容的粒度。默认4MB对绝大多数场景够用,不用改。但如果你的LV动辄几十TB,PE太小会导致元数据里PE数量过多,管理开销大,这时候可以设大一点,比如-s 16M。
注意:PE大小在VG创建时定死,之后不能改。所以建VG前想清楚,别建完才发现要调。我一般默认不指定,用4MB,除非有明确的超大卷需求。
4.2 往VG里加盘:vgextend
VG空间不够了,加新盘进去用vgextend。假设新加了/dev/sdd,先做成PV,再加进VG:
pvcreate /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是2560,PE 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 扩容LV:lvextend加resize2fs或xfs_growfs
扩容是LVM最高频的操作,分两步:先扩LV,再扩文件系统。很多人只做了第一步,df -h没变化,就是因为文件系统没扩。
扩LV用lvextend:
lvextend -L +20G /dev/datavg/datalv lvextend -l +100%FREE /dev/datavg/datalv-L +20G是在原基础上加20G,注意前面的+号,没有+是扩到指定大小。-l +100%FREE是把VG剩余空间全加给这个LV。
扩完LV,文件系统要跟着扩。这里分文件系统类型:
- ext4用
resize2fs:
resize2fs /dev/datavg/datalv- xfs用
xfs_growfs,注意xfs_growfs跟的是挂载点,不是设备:
xfs_growfs /dataxfs只能扩不能缩,这是它和ext4的一个重要区别。我现在的习惯是数据盘统一用xfs,因为扩容方便且性能稳定,但前提是规划时别把LV建太大,xfs缩容很麻烦。
有个省事的参数:lvextend加-r(resize的缩写),会自动调用对应的文件系统扩容命令,一步到位:
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把文件系统缩到30G,lvreduce再把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 场景一:根分区快满了,在线扩容
这是最常见的场景。假设根分区是LV,VG里还有空闲空间。流程:
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层 |
|---|---|---|---|
| 创建 | pvcreate | vgcreate | lvcreate |
| 查看详情 | pvdisplay | vgdisplay | lvdisplay |
| 查看概览 | pvs | vgs | lvs |
| 扩容 | pvresize | vgextend | lvextend |
| 缩容 | - | vgreduce | lvreduce |
| 删除 | pvremove | vgremove | lvremove |
| 迁移数据 | pvmove | - | - |
这张表我建议截图存手机里,现场操作时对着敲,比翻文档快。
7. 我这些年攒下的LVM操作心得
LVM这套东西,命令本身不难,难的是理解它的空间分配逻辑和操作顺序。我总结几条自己踩坑换来的经验。
第一条,扩容永远比缩容安全。规划存储时按最小需求建LV,后续不够了在线扩,这是最稳的路子。反过来建大了想缩,ext4要卸载要fsck,xfs干脆不支持,代价太大。
第二条,操作前先看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不是银弹,但它把磁盘管理这件事从"停机大修"变成了"日常维护",这个价值对运维来说太大了。希望这份整理能帮你少走点弯路。