关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

控制台里磁盘已经加到 200G,df 却还是 100G:LVM 这一层还差三步

来源:一万网络  发布时间:2026-11-11

控制台里那块云盘已经从 100G 改成 200G,页面显示扩容成功,费用也跟着变了。你 ssh 回到机器上敲 df -h,那个挂载点后面还是 99G、还是 100G,一个数字都没动。这时候大多数人的第一反应是重启一下,或者安慰自己可能要等几分钟同步。等了半小时再看,还是 100G。

问题不在同步,也不在重启。你在控制台上动的是最底下那一层——那块云盘本身;而 df 读的是最上面那一层——文件系统。中间还隔着分区、物理卷、卷组、逻辑卷,这四层一层都没碰过。你把地基向外扩了两米,楼上房间的面积当然不会自己变大。

更难受的是这个过程不报错。扩完盘没有任何命令跳出来提醒你“还有三层没扩”,lsblk 里甚至已经能看到 200G 了,看上去一切正常。所以这个坑能坑人好几年,每次都以为是云平台的锅,其实是你动错了层。

先分清你动的是哪一层:云盘、分区、物理卷、逻辑卷、文件系统

从下往上数,一个挂载点背后至少隔着六层:云盘、分区、物理卷(PV)、卷组(VG)、逻辑卷(LV)、文件系统。这六层里,只有最上面那层是 df 关心的,只有最下面那层是控制台能改的。搞清楚每一层“你用什么命令能看见它”,比背命令重要得多——绝大多数扩容事故,都是有人以为自己动的是某一层,其实动的是另一层。

最底下是云盘。它是平台虚拟化出来的一块块设备,落到你的系统里就是 /dev/vdb、/dev/sdb 这类名字。你在控制台上把 100G 改成 200G,改的就是这一层。扩完回到机器里用 lsblk 看,那块盘的 SIZE 字段会立刻变成 200G——前提是内核已经重新读了设备容量,绝大多数云平台这一步是自动的,少数老内核需要重新扫描一下 SCSI 总线或者重启。这一层变大了,只是原料变多了,跟你能不能多写文件毫无关系。

往上是分区。一块盘可以整盘直接使用,也可以先划成 /dev/vdb1、/dev/vdb2 再用。很多云主机的系统盘是分区的,数据盘则有不少人直接整盘做 PV,这一层就跳过了。分区的麻烦在于它的边界写在分区表里,盘大了分区不会跟着大,得用 growpart 或者 parted 的 resizepart 把分区的结束位置往后推。这一步最容易出事的地方不是命令本身,是前提:必须先确认这个分区后面没有别的东西,推完之后还要让内核重新读一遍分区表。忘了的人会看到盘 200G、分区还是 100G 的诡异画面。

再往上是物理卷和卷组。物理卷(PV)是 LVM 对“一块可用的盘或分区”做的登记:在设备上打一个 LVM 的标记,记下它有多大、被切成多少个 PE(物理盘区,LVM 分配空间的最小单位)。卷组(VG)是登记簿,把若干个物理卷并成一个池子,池子里的空间按 PE 计数统一管理。这两层的关系是:卷组有多少空闲 PE,取决于它名下所有物理卷登记了多少 PE;而物理卷登记了多少,取决于你有没有让它重新认识自己的新容量。pvcreate 只在初始化时跑一次,扩容时跑的是 pvresize——这一步就是无数教程里漏掉的那一步。

逻辑卷(LV)是从卷组里切出来的一块,路径长成 /dev/mapper/vg0-lvdata 或者 /dev/vg0/lvdata,它才是你真正格式化、挂载的东西。它有多大,由卷组分配给它多少个 LE(逻辑盘区,和 PE 一一对应)决定。文件系统则写在逻辑卷之上,ext4 或者 xfs,它自己在超级块里记着“我管着多大地方”。df 读的就是这个数字。所以哪怕逻辑卷已经扩到 200G,只要文件系统还记着 100G,df 就永远显示 100G——它压根不看底下的块设备有多大。

这六层的对照关系,你只要记住下面这张表就够了。真正要装进脑子里的不是命令,是哪一层归谁管。

层级 用什么命令能看到它 只扩这一层会发生什么 最常见的误判
云盘 lsblk、fdisk -l 看设备总容量;控制台看订购容量 底层块设备变大,上面五层全都不知道,df 纹丝不动 以为控制台显示扩容成功,就等于机器里可用空间变大了
分区 lsblk 看分区大小、parted /dev/vdb print 分区没跟着推大时,物理卷仍按老边界计算,pvresize 也吃不到新空间 盘是 200G、分区还是 100G,却以为 pvresize 已经生效
物理卷 PV pvs、pvdisplay 看 PSize 和 PFree 卷组的空闲 PE 增加,但逻辑卷大小不变,df 依旧不变 看到 PFree 多出 100G 就以为扩容完成,其实 LV 一点没动
卷组 VG vgs、vgdisplay 看 VFree 卷组只是池子,它自己不挂载、不格式化,扩它没有任何可见效果 把“卷组有空闲”当成“目录能用”,其实中间还隔着一层 LV
逻辑卷 LV lvs、lvdisplay 看 LSize 块设备变大,但文件系统超级块仍记着旧大小,df 还是老数字 以为 lvextend 跑完就完事,忘了还要把文件系统也扩一遍
文件系统 df -h、tune2fs -l、xfs_info 看挂载点容量 这是唯一能让 df 变化的层,但它必须在下面几层都扩完之后才轮得到它动手 下面没扩的情况下硬扩文件系统,直接失败甚至造成不一致

定位断点其实只用两个命令:lsblk 从上到下把块设备的容量列出来,df -h 给出文件系统的容量。两个数字对不上,说明断点在中间;顺着 lsblk 的输出一层一层往下比,第一个出现“下面大了、上面没大”的交界处,就是你要动手的那一层。这个判断方法不需要记住任何命令,比翻文档快得多。

为什么 df 没变:挂载的是逻辑卷,扩容停在物理卷这一层就断了

把控制台那一步算进去,从 100G 扩到 200G 一共要做四到五步,每一层一步。断点可能出现在任何一处,但真实分布很不均匀:绝大多数人断在最靠上那一步(文件系统没扩),排在第二位的是物理卷没跑 pvresize,断在分区没推的反倒少见——因为很多云主机的数据盘本来就是整盘做 PV 的,压根没有分区这一层。

“扩完盘就好了”这个错觉是有来源的。不少云平台的标准镜像里带了 cloud-init,开机时会自己跑 growpart 把分区推到底,再跑一次 xfs_growfs 或 resize2fs。你之前用这类镜像,扩完盘重启一次确实就好了,于是形成了肌肉记忆。等你换了一个没带这套脚本的镜像、或者把数据盘改成整盘做 PV、或者文件系统从 ext4 换成了 xfs,这套自动化就散了——尤其是 xfs,它不认 resize2fs,得用 xfs_growfs,而且参数要给挂载点路径而不是设备名。这时候再重启一百次也没用。

说白了,df 读的是文件系统超级块里记录的数字,不是块设备的实际大小。你把逻辑卷扩到 200G,文件系统那头完全不知道发生了什么,它还按 100G 的布局去分配 inode 和块组。反过来也一样:如果你在没有下层空间支撑的情况下先把文件系统撑大,写进去的数据就会落在没有物理空间承接的位置。所以扩容必须自下而上,这个顺序不是讲究,是物理约束——下层没登记过的空间,上层根本用不了。

还有一种容易混淆的情况:动手之前得先确认挂载的到底是哪个设备。有些人把 /dev/vdb1 直接格式化挂载了,压根没走 LVM,这时候 pvs、vgs 全是空的,你按 LVM 那套命令敲半天当然没反应。也有人是两块盘各做一个 PV 放进同一个 VG,只扩了其中一块,vgs 里看到 VFree 有空间就以为齐了,其实那是另一块盘贡献的。动手之前先 mount 或者 findmnt 看一眼挂载点背后到底挂着什么,这一步省不得。

顺带说一个方向相反的坑:lsblk 显示 200G、df 显示 100G 是扩容没做完;如果反过来,df 比块设备还大,那通常说明有人动过文件系统但下面没跟上,或者用了某些会自动伸展的存储配置。这种状态比没扩更危险,因为看上去空间是够的,直到真写数据才发现落不下去。遇到这种情况先别往里写新数据,把层级对齐了再说。

三步走:扩物理卷、扩逻辑卷、扩文件系统,顺序不能反

假设你已经确认过了:控制台扩到 200G,机器里 lsblk 能看到 200G(没有分区层,或者分区已经推到底),并且挂载点背后确实是一个逻辑卷。下面三步,从下往上,一步都不能跳。

第一步,扩物理卷。命令是 pvresize,后面跟那个设备名——整盘做 PV 就给 /dev/vdb,分区做 PV 就给 /dev/vdb1。这一步做的事是让 LVM 重新读取设备的实际容量,把多出来的部分切成新的 PE 登记进物理卷。跑完之后用 pvs 看,PSize 应该变成 200G 上下,PFree 应该多出来 100G 上下。顺手用 vgs 看一眼 VFree,卷组的空闲 PE 也应该跟着涨。这一步不做,后面的 lvextend 会直接报空间不够——这反而是好事,它至少告诉你停在哪了。

第二步,扩逻辑卷。命令是 lvextend,两种写法要分清:写 -L +100G 是“在现在的基础上加 100G”,写 -L 200G 是“把总量设成 200G”,写 -l +100%FREE 是“把卷组里剩下的全给它”。第三种写法最省事,也最容易埋雷——你把卷组的空闲一次全给了一个逻辑卷,以后想建快照卷、想给另一个逻辑卷留点余地,就没了。除非你非常确定这个卷组里只有这一个逻辑卷、以后也不会打快照,否则建议留一点余量在池子里。

第三步,扩文件系统。这一步由文件系统类型决定命令:ext4 用 resize2fs,xfs 用 xfs_growfs。区别不只是名字,xfs_growfs 的参数是挂载点路径(比如 /data),不是设备路径,写错了它会直接拒绝;ext4 的 resize2fs 给的是设备路径,而且它同时支持离线和在线——在线扩 ext4 是安全的,这也是为什么很多人扩根分区不用停机。lvextend 还有一个 -r 参数,会自动调用 fsadm 把文件系统一起扩了,省一步敲命令,但你要知道它背后干的就是 resize2fs 或者 xfs_growfs,出问题时的排查路径完全一样。

顺序为什么不能反?每一层只认自己下面那一层登记过的空间。物理卷没登记,卷组就没有空闲 PE 可分;卷组没分给逻辑卷,逻辑卷的块设备就还是老的扇区范围;逻辑卷没变大,文件系统就算想扩也没有可用的块。有意思的是,这个顺序错了通常有报错兜底——你在没扩 PV 的情况下 lvextend,它报空间不足;你在没扩 LV 的情况下 resize2fs,它报设备太小。真正没有报错兜底的是反方向那件事,也就是缩容。

还有一种只在特定配置下出现的误判:如果你用的是精简配置(thin provisioning)的逻辑卷,逻辑卷自身大小和它背后精简池的容量是两码事。LV 显示 200G、文件系统也扩到 200G 了,但精简池只有 100G,写满的时候数据卷会直接掉线,而这时候 df 还是显示有空间。这种配置下要看的是 lvs 输出里精简池那一行的 data% 和 meta%,不看它,光盯 df 一定被骗。元数据池(meta)满了更麻烦,它会让整个池进入只读状态,业务当场就停。

做完三步,用 df -h 确认,再用 lsblk 对一遍,两个数字对上才算完。别急着关终端,顺手往挂载点里写个几百兆的临时文件再删掉,确认真的能写进去——这个动作比任何命令输出都可信。提醒一句:这一整套操作在线做是安全的,不需要停业务,也不需要重启;重启解决不了六层里的任何一层。

缩容为什么比扩容危险:顺序要倒过来,而且必须先做文件系统检查

扩容自下而上,缩容自上而下,一步都不能错:先缩文件系统,再缩逻辑卷,然后才是物理卷,收尾才动分区和云盘。方向要反过来的原因很直白——文件系统的数据块散布在整个逻辑卷范围内,尾部也可能有数据。你在文件系统不知情的情况下直接把逻辑卷砍小,等于把磁盘尾部的块直接拿走,而那些块上很可能正放着某个文件的后半截。扩容是往下加空间,加多少都不会碰到已有数据;缩容是从已有数据中间切一刀,切在哪全靠文件系统先自己挪好位置。

所以缩容的第一步必须是让文件系统自己瘦身,而且它得先把要释放区域里的数据搬到前面去。ext4 的 resize2fs 在缩小时干的就是这个搬迁工作。搬完了,尾部才是干净的,逻辑卷才敢砍。这就是“必须先做文件系统检查”的来历:resize2fs 之前要用 e2fsck -f 强制检查一遍。原因不是走流程——如果文件系统本身就带着错误,resize2fs 会在一张错误的布局图上重新计算搬迁路径,把一个本来可修复的小错变成大面积损坏。e2fsck 后面那个 -f 必须加,不加的话它会因为文件系统“看起来是干净的”而跳过检查,等于没做。

还有一类文件系统根本不给缩的机会:xfs 不支持缩容。这不是命令没实现,是格式设计上就只做了单向。你要把一个 xfs 的逻辑卷缩小,只有一条路——把数据备份出来(rsync、tar,或者平台侧整盘快照),重建一个更小的逻辑卷,重新格式化成 xfs,再把数据导回去。这个过程耗时取决于数据量,跟你要缩多少 G 没多大关系,所以别以为“就缩 20G”是小事,200G 的数据照样要搬一遍。

ext4 缩容还有一个硬约束:必须卸载。resize2fs 缩小时要求文件系统处于离线状态,在线缩不被支持。这意味着你要缩的那个挂载点,业务得先停。对于根分区这种没法卸载的,得进救援环境或者挂别的盘启动再操作。这一条就把“顺手缩一下”的想法彻底堵死了——缩容天然是一个计划内的停机动作,不是随手能干的事。

尺寸计算也要留余量。业内的稳妥做法是分两步走:先把文件系统缩得比目标再小一点(比如目标 100G,先缩到 98G),然后把逻辑卷缩到 100G,然后再让文件系统自己长回去填满 100G。这么做是为了避开 PE 取整、单位换算(按 1000 算还是按 1024 算)带来的那点误差——误差只有几十兆,但方向错了就会砍掉尾部有数据的块。省这一步省不了几分钟,翻车的代价是整个文件系统。

还有一个纯粹是手滑的坑:lvreduce 的 -L 参数,写 -L 100G 是“把总量设成 100G”,写 -L -100G 是“减去 100G”。少一个减号,意思完全相反。在 200G 的卷上碰巧“减去 100G”和“设成 100G”结果一样,所以很多人用惯了没出事,换个数字就出大事。同样的道理,-r 参数在缩容时要慎用,自动调 fsadm 省事,但也意味着你没有机会在中间停下来核对尺寸。缩容这种事,手动一步、核对一步,比省那几秒钟重要得多。

缩完逻辑卷之后,如果你还想把物理卷也缩回去(比如要把多出来的容量挪给别的卷组),用的是 pvresize 加 --setphysicalvolumesize。这一步同样有对齐要求:新大小必须能容纳已分配的 PE,而且会按 PE 粒度向下取整,所以实际结果可能比你指定的略小。更关键的是,很多云平台根本不支持云盘缩容——盘只能往大买,不能往小退。所以动手之前先想清楚一件事:你缩完物理卷,多出来的那部分要给谁?如果无处可去,那就别缩,留在卷组里当余量,比什么都强。

收尾一句硬话:缩容之前必须有备份,而且这个备份不能是同一个卷组里的 LVM 快照。逻辑卷被砍的时候,同一 VG 上的快照卷跟着一起完蛋,它跟原始卷共用同一批物理盘区。真正的备份得在平台侧,或者至少是另一台机器上的一份拷贝。没有备份的缩容,就是在赌运气,而运维这行赌运气通常没有好结果。

LVM 快照和云平台快照不是一回事:别把两者当同一个保险

这两个东西都叫“快照”,但它们是两种完全不同的机制。放在同一个故障面前,一个能救你,一个救不了你。混淆它们的代价,通常在你最需要回滚的那一刻才显现出来。

LVM 快照是在同一个卷组里划出一块空间,用写时复制(COW)的方式记录原始逻辑卷从创建快照那一刻之后的变化。原始卷上某个块第一次被改写时,LVM 先把旧内容读出来写进快照空间,再让新数据落盘。你去读快照卷,读到的就是“那一刻”的画面。它快,创建几乎瞬间完成;也便宜,用的是自己卷组里的空间。但它有三个致命属性:它和原始逻辑卷在同一个卷组、同一块或同一组物理盘上;它有固定大小,写满就失效,快照卷会被标记为 invalid,之后完全不可用;它依赖原始逻辑卷存在,原始 LV 被删了或者卷组损坏了,快照跟着一起没。说白了,它是同一个篮子里的另一个格子,篮子掉地上,格子里的东西照样摔碎。

它还有一个经常被忽略的性能代价。写时复制意味着每一次对原始卷的写入,都多了一次“读旧块加写进 COW 区”的动作,随机写场景下的写放大很明显。业务高峰期挂着一个 LVM 快照,IOPS 掉一半不是稀奇事。所以它只适合短时间存在:改配置前建一个,改完确认没问题立刻删掉。有人把它当长期备份挂着,既拖慢业务,又在最需要的时候发现它早就因为写满而失效了。

云平台那边的磁盘快照是另一回事。它是平台侧对整块云盘做的时间点拷贝,存在平台自己的存储里,跟这台云主机、这个卷组、这个文件系统全都没有依赖关系。它的粒度是整块盘,恢复的时候是“把这块盘回到那个时间点”,时间点之后写入的数据会被覆盖掉。它能扛住机器误删、卷组损坏、文件系统被 resize2fs 搞坏这类故障,因为拷贝在别的地方。代价是它通常比 LVM 快照慢(取决于平台实现和盘的大小)、粒度粗(整盘而不是单个目录)、保留策略要自己看清楚(能留几份、保留多久、是不是额外计费)。

两者的分工很清楚:平台侧快照是兜底的保险,LVM 快照是手边几分钟的临时回滚点。真正要防“我把这事搞砸了”的时候,靠的是前者。尤其在做缩容、动分区表、重建文件系统这类操作之前,先在平台侧打一次整盘快照——这一步花的时间,跟数据没了之后再想办法比,根本不在一个量级。

顺带提两个实操细节。一是 xfs 的 LVM 快照挂载问题:快照卷和原始卷的 UUID 相同,直接 mount 会被拒绝,得加 nouuid 选项,或者先用 xfs_admin 生成一个新的 UUID 再挂。很多人打完快照兴冲冲去挂,挂不上就以为快照坏了,其实是 UUID 撞了。二是精简配置的快照(thin snapshot)和传统快照不一样,它不受固定 COW 空间大小的限制,可以挂得久一些,但同样依赖同一个精简池,池子坏了照样一起没。位置决定命运,这一点两种快照没有区别。

所以别把两者当同一个保险。这句话的具体含义是:如果你只做了 LVM 快照,那你其实一个保险都没有。

云主机上到底要不要用 LVM:三种场景的判断

LVM 不是标配,它是一个可选层。多一层就多一层要理解、要维护、要在出问题时排查的东西。用不用,只看一件事:你这块盘以后会不会变。

第一种场景:单盘,容量在开机器的时候就规划到位,就是放日志、放备份、放一个固定大小的数据目录,以后也没有跨盘合并的需求。这种直接格式化挂载就行,别上 LVM。理由很简单:你用不到它的任何能力,却要承担它的全部复杂度。哪天真要扩容,直接扩云盘、推分区、扩文件系统,三步走完,链路越短越不容易出错。排查时也省心——别人接手你的机器,lsblk 一眼看完,不用先搞懂卷组结构再往下查。

第二种场景:你会持续加盘,或者需要把几块盘并成一个目录用,而且希望扩的时候业务不中断。这种该上 LVM。它的核心价值就在“逻辑卷可以跨物理卷延展,而且在线就能做”:新买一块盘,做成 PV 加进卷组,逻辑卷一扩,文件系统一扩,目录就大了,整个过程服务不用停。没有 LVM 的话,你想把第二块盘并进来,要么改挂载结构,要么做软链,要么上 RAID,哪一个都比多敲两行命令麻烦。多盘场景下,LVM 几乎是唯一体面的答案。

第三种场景:你需要快照回滚。这里要泼一盆冷水——如果你是为了“能随时回滚”而上 LVM,那方向错了。前面说过,LVM 快照和原始卷在同一个故障域里,它对抗不了盘坏、机器误删、文件系统损坏这类真正的灾难。要回滚能力,正确的做法是平台侧的云盘快照,或者选一个原生支持快照的文件系统(btrfs、zfs),它们的多版本和快照是文件系统层面的,比 LVM 快照整得多。LVM 快照在这个场景里只能当“改配置前留的十分钟后悔药”,不能当备份策略来设计。

系统盘要不要做 LVM 是另一个常被问的问题。多数云平台的标准镜像是整盘一个分区、一个文件系统,不做 LVM。这个选择是对的:系统盘的容量需求稳定,扩的机会少,而一旦做了 LVM,机器起不来的时候救援环境得先能识别并激活卷组,多一道手续,半夜排障的时候这道手续能多花你二十分钟。除非你的系统盘确实需要跨盘扩展,或者你明确要用 LVM 快照做系统级的临时回滚点,否则跟着镜像默认走,别自作聪明。

还有一种情况要单独说:如果你的数据可靠性是靠上层保证的——数据库本身有多副本、对象存储有多副本冗余、容器平台把本地盘当临时存储用——那本地盘做不做 LVM 影响很小。因为单块盘坏了,上层会自动补,你不需要靠 LVM 去合并或者打快照。这种情况下 LVM 唯一剩下的价值还是“扩起来方便”,如果连这个需求都没有,那就别加这一层。

判断规则落地成一句话:盘以后会加、会合并、要在线扩——上 LVM;盘一次规划到位、单盘用到底——直接用文件系统;要的是回滚和备份能力——找平台侧快照或者支持快照的文件系统,别指望 LVM。三类需求可以叠加,叠加的时候按最严格的那条来。

这类扩容属于交付之后要自己做的运维动作,跟选哪家机器没有关系,但跟选机器时怎么规划盘有关系。开机器之前想清楚两件事:这块盘以后会不会加、会不会需要和别的盘并起来用。想清楚了,后面是三层还是六层就定了,半年后那次扩容是三分钟还是三小时也定了。一万网络深耕 IDC 19 年(成立于 2007 年),从行业部署角度看,交付时盘是分层还是单盘直挂,往往是这一类麻烦的分水岭。

扩 LVM 之前,最常问的六个问题

控制台扩完容,机器一定要重启吗?绝大多数情况不用重启,重启也解决不了问题。云盘扩容之后内核一般会自动看到新容量,lsblk 里立刻就能看到 200G。真正需要重启或者重新扫描设备的场景是少数——老内核、或者某些虚拟化驱动没有自动触发容量重读,这时手动 rescan 一下对应的 SCSI 设备即可。如果你重启之后 df 变了,那通常不是重启的功劳,而是镜像里带了 cloud-init,开机时自动跑了 growpart 和 xfs_growfs 或 resize2fs。搞清楚这一点很重要:靠重启能解决,说明你的环境有自动化兜底;换一台没有这套脚本的机器,重启一百次 df 也不会动。正确的做法是按层级一层层确认,别把重启当万能药。

lsblk 显示 200G、df 显示 100G,断点在哪一层?顺着 lsblk 从上往下比。先看盘是不是 200G(云盘层),再看分区是不是 200G(分区层),然后 pvs 看 PSize 和 PFree(物理卷层),vgs 看 VFree(卷组层),lvs 看 LSize(逻辑卷层),再看 df 的挂载点容量(文件系统层)。第一个出现“下面大了、上面没大”的交界处,就是你要动手的地方。最常见的两处:pvs 里 PFree 已经多出 100G 但 lvs 里 LSize 没变,说明 lvextend 没跑;lvs 里 LSize 已经是 200G 但 df 还是 100G,说明文件系统没扩,ext4 要 resize2fs、xfs 要 xfs_growfs。两个命令加一张层级图,比查文档快。

ext4 和 xfs 扩容命令一样吗?xfs 能缩吗?不一样,而且差别不止是命令名。ext4 用 resize2fs 跟设备路径,在线离线都能扩,缩则必须卸载后离线做。xfs 用 xfs_growfs,参数是挂载点路径而不是设备路径,写错会被直接拒绝——这是新手最常撞的一堵墙。至于缩容,xfs 在设计上就不支持缩小,没有任何命令能绕过,唯一办法是备份数据、重建更小的逻辑卷、重新格式化、再把数据导回去。所以如果你管理的目录以后有可能要缩,选格式的时候就要把这一条算进去,别等到要缩了才发现选错了格式。

把卷组剩余空间一次性全给逻辑卷,会有什么后果?用了 -l +100%FREE 之后,卷组里就没有空闲 PE 了。直接后果有两个:一是以后想给同一个卷组里的另一个逻辑卷加空间,没得加;二是想建 LVM 快照卷时,没有 COW 空间可用,快照要么建不起来,要么建起来很快就写满失效。如果这台上还有别的逻辑卷要长,或者你有“改配置前打个快照”的习惯,就别一次给满,留 5% 到 10% 的余量在卷组里。余量不值钱,事后想从别的盘抠空间回来,那才是真的麻烦,而且往往要停机才能做。

扩逻辑卷会影响业务吗?需要停机吗?扩容这一整套动作——pvresize、lvextend、resize2fs 或 xfs_growfs——都是在线操作,不需要停服务,也不需要卸载挂载点,LVM 的设计初衷就包含在线扩展。真正需要停机的是缩容:ext4 缩文件系统要求离线,必须卸载,根分区这种没法卸的还得进救援环境。性能方面,扩完之后文件系统做在线伸展时会有短时间的元数据写,量很小,业务上基本感知不到。唯一值得盯的是如果你还挂着 LVM 快照,任何写入都有写放大,这时候扩文件系统会明显慢一些,建议先删掉快照再扩。

缩容之前到底要做哪些准备?三件事,缺一不可。一是备份,而且必须是在平台侧的整盘快照或者另一台机器上的拷贝,不能是同一个卷组里的 LVM 快照——逻辑卷被砍的时候,同 VG 上的快照一起完蛋。二是文件系统检查,ext4 缩容前必须 e2fsck -f 强制检查一遍,不加 -f 会因为“看起来干净”而跳过;在一张带错的布局图上做 resize2fs,会把小错放大成大面积损坏。三是确认格式,xfs 不能缩,只能备份重建恢复。做完这三件,再按“文件系统、逻辑卷、物理卷、分区”的顺序自上而下走,每一步都核对尺寸,别用 -r 让工具自动跳步。

本文操作逻辑的依据,和哪些步骤必须先备份验证

本文讲的是存储层级的结构和操作顺序,属于 Linux LVM2 用户态工具与内核块设备层的通用行为,不是某家云平台的专属特性。涉及的机制包括:物理卷按 PE 登记容量、卷组统一管理空闲 PE、逻辑卷按 LE 分配、文件系统在超级块里自记容量;扩容自下而上(pvresize、lvextend、resize2fs 或 xfs_growfs),缩容自上而下且必须先做文件系统检查;xfs 不支持缩容、ext4 缩容要求离线;LVM 快照是同一卷组内的写时复制空间、写满即失效、与原始卷同故障域;平台侧云盘快照是独立于主机的整盘时间点拷贝。这些在任何一份 LVM 文档里都能对上,你可以拿自己机器的输出逐条验证。

本文不提供任何实测输出,也没有引用任何测速、跑分或客户案例。命令在你机器上的实际表现,取决于发行版、LVM2 版本、内核版本、文件系统类型以及云平台的设备实现,需要你自己跑一遍确认——这个数字我没有实测,需要你在自己的验收环境里打一遍。尤其是尺寸相关的输出,各家对 1000 和 1024 的口径不统一,看到的数字跟标称容量有出入是正常的,别当成故障去排查。

有几件事必须在动手前跟平台方确认清楚,因为它们不属于技术通识,各家实现不一样:你这块云盘是否支持在线扩容(绝大多数支持,但要确认)、是否支持缩容(很多平台只支持扩不支持缩,缩完物理卷多出来的容量无处可去)、云盘快照能保留几份、保留多久、是否额外计费、系统盘和数据盘是不是分开的两块盘。这几条的答案会直接改变你的操作方案,别凭经验猜,也别拿别的平台的经验套。

哪些步骤必须先备份再做,这里列清楚:缩容全链路(包括 e2fsck 之后的 resize2fs、lvreduce、pvresize 加 --setphysicalvolumesize)、任何动分区表的操作(growpart、resizepart)、任何 lvreduce、以及在有错误提示的文件系统上做的任何修复动作。这几类的共同点是:一旦方向错了,回滚的成本远远高于备份的成本。相对地,扩容三步在下面几层已经确认扩好的前提下属于低风险操作,正常做即可,不需要额外停机。

本篇不涉及任何具体价目,也不出现任何一万网络产品的价格数字。文中提到的资源形态(云服务器、独立服务器这类)与品牌年限——一万网络深耕 IDC 19 年(成立于 2007 年)——来自官网公开描述,官网对应产品页以 www.idc10000.net 上的页面为准;其余内容均为行业技术层面的分析,不代表对某一具体配置或服务条款的承诺。盘型怎么规划、要不要多盘合并、平台侧快照的策略怎么定,建议下单前跟销售确认一遍再定,比事后改结构省事得多。


上一篇:Btrfs 上生产前要算清的三笔账:写时复制的碎片、快照占住的空间和 RAID 级别的选择

下一篇:ext4 还是 XFS:先想清楚三个「以后」,别再问谁更快