首页 / 资讯中心 / 文章详情

LVM磁盘扩容实操指南:从分区识别到文件系统在线扩展,附踩坑记录

LVM磁盘扩容实操指南:从分区识别到文件系统在线扩展,附踩坑记录 ★ FEATURED ARTICLE
前阵子帮某公司的一台内部机器扩容磁盘折腾了一圈LVM从查看分区状态、加物理卷到扩展逻辑卷、在线调整文件系统过程不算复杂但里面有几个细节很容易被忽略。尤其是第一次操作的人很容易在“分区类型”或者“文件系统调整”这步卡住。这篇就当是一份带踩坑记录的实操笔记把LVM扩容的完整链路和背后的原理拆开讲一遍。1. LVM扩容之前先搞清楚你的机器是什么分区布局很多人一上来就执行lvresize或者lvextend结果提示空间不足或者扩完了df看不到变化。原因多半是没弄明白当前磁盘在LVM体系里处于哪个层级以及哪一层缺空间。LVM的完整链路是物理磁盘或分区PV→ 卷组VG→ 逻辑卷LV→ 文件系统。扩容的本质就是逐层检查、逐层分配。操作顺序必须从底层往上层走先保证PV有空间再确认VG有剩余空间最后扩LV并调整文件系统。建议先跑一遍下面这组命令把家底盘清楚lsblk df -hT pvs vgs lvslsblk看的是磁盘和分区的大小、挂载点能直接看到你的根分区、数据盘在哪个物理盘上。df -hT看的是文件系统当前使用率和类型。pvs、vgs、lvs分别显示物理卷、卷组、逻辑卷的空间分配情况。常见的几种场景是这样的物理磁盘本身还有未分配的空间但VG没有将它纳入。有多块物理盘VG还有剩余空间直接扩LV就行。整块盘已经全部划给了某个分区需要先对分区表动手术把分区扩大再让PV识别新空间。机器是虚拟机底层的虚拟磁盘大小变了但操作系统里看到的还是旧大小。这几种情况的操作路径完全不同。我这次遇到的就是第4种底层磁盘从80G扩到了120G但系统里lsblk看到的还是80G需要先让系统重新识别磁盘的新容量然后才谈得上LVM扩容。如果是物理机加了一块新硬盘流程又是另一套。另外有一点值得提/boot分区一般不在LVM里是个独立的小分区。如果你只是根分区满了扩LVM就行如果是/boot满了那是另一码事扩容方式和LVM完全不搭边。这也是很多人搞混的地方。判断方法很简单df -h /boot看下类型如果是xfs或ext4且不挂LVM那就单独处理如果输出里写着/dev/mapper/...才走LVM扩容。2. 底层磁盘扩容后让系统识别新容量的几种手段虚拟机的虚拟磁盘在管理界面扩容后操作系统不会主动发现整块磁盘变大了。如果你用lsblk看到的还是老容量说明系统还没感知到新空间。这时候不同环境有不同的处理方法。2.1 最简单粗暴重启重启是最稳妥的方式绝大多数Linux发行版在开机过程中会重新扫描所有磁盘设备直接拿到新容量。代价是如果机器上有正在跑的业务重启窗口需要协调。2.2 在线刷新针对常见的SCSI/SAS/VMware虚拟磁盘通过echo强制触发SCSI设备的重新扫描可以在不重启的情况下刷新磁盘容量。echo 1 /sys/class/scsi_disk/0:0:0:0/device/rescan但注意设备路径里的0:0:0:0不是固定的要根据实际情况找到对应的scsi设备。用下面的命令逐一列出ls /sys/class/scsi_disk/然后逐个尝试刷新。如果是VMware虚拟机更常用的做法是用vmware-toolbox-cmd或通过重启guest OS来获得新磁盘但实际在/sys路径下刷新rescan对大多数版本也能生效。2.3 某些云厂商的裸金属/云盘场景部分云平台的块存储扩容后在操作系统内直接rescan通常能生效最多再执行一条partprobe重读分区表。老一点的系统可能需要用hdparm -z /dev/sda来强制内核重读分区表。这里我实际遇到的问题是lsblk能看到变化但/dev/sda整块盘new size已经到位可用fdisk -l看分区表时发现分区大小没变。这是正常的因为分区表还停留在旧空间上你需要把分区扩大之后PV才能拿到新增的空间。3. 分区扩容fdisk与parted的实操与边界当物理盘已经识别到新容量且旧分区并没有占满整块盘的时候就需要对分区本身下手。分两种情况一种是分区表的最后一个分区需要扩展另一种是中间某个分区这种情况没法安全扩展建议不要动除非你愿意重新做数据盘。3.1 fdisk方式操作流程以/dev/sda为例假设/dev/sda2是LVM所在分区操作流程如下fdisk /dev/sda p # 打印分区表记录起始扇区 d # 删除分区注意只删分区不删数据 n # 新建分区 p # 主分区 2 # 保持原分区编号 起始扇区 # 必须填之前记录的起始扇区不要直接回车 结束扇区 # 直接回车使用剩余全部空间 w # 写入分区表很多人担心删除分区再重建会丢数据。实际上LVM的元数据存在PV内部也就是你分的那个分区里的数据块上只要分区起始扇区保持一致重建分区不会动到实际数据。但是起始扇区必须手动指定千万不要用fdisk默认的起始位置否则分区起点对不上数据就真没了。建议在删除分区之前用fdisk -l或者parted /dev/sda unit s print把起始扇区精确记录下来最好截图或者抄在小本本上。这一步错了后面神仙难救。写分区表后执行partprobe /dev/sda或者重启让内核重新读取分区表。可以用lsblk确认分区大小已经变成新容量。3.2 parted方式操作如果分区表是GPT格式或者你更喜欢parted流程是parted /dev/sda unit s print free resizepart 2 100% quitresizepart是较新版本parted的特性可以直接把分区扩展到100%即磁盘剩余所有空间前提也一样——确保起点不动。执行完同样跑partprobe。3.3 某个关键细节分区编号和分区类型用fdisk删除重建分区时系统有时候会提示“分区编号已存在分区在内存中”这时候可以先w写一次分区表并partprobe或者用parted的resizepart来绕过。另外分区类型要保持8eLinux LVM如果新建分区时默认变成了83Linux filesystem后续PV识别不到会提示找不到分区。用t命令手动改成8e。有一点我说下很多文章会说“删除重建分区表有风险建议备份”。这话没夸张我见过有人操作完之后数据丢了基本都是起始扇区填错。所以如果你对命令行不是特别熟更稳妥的路子是不动分区直接把新磁盘做成PV加入VG。4. 卷组和逻辑卷的扩容其实是最爽的一步分区调整好之后PV、VG、LV这一层的操作相对简单但命令的细微参数也值得展开。4.1 让PV感知新空间pvresize /dev/sda2执行后用pvs查看PV的大小应该已经变为新容量。比如原来是80G现在应该是120G。如果没变大多是因为分区表重读没生效先partprobe再试。4.2 确认VG剩余空间vgs看VFree那一列的数值。如果VG没有剩余空间那就要考虑把新磁盘做成PV后加入VG或者扩容已有的PV上面步骤已经做了。4.3 把新磁盘加入VG如果是加盘方案假设新盘是/dev/sdb直接pvcreate /dev/sdb vgextend 你的卷组名 /dev/sdb注意pvcreate会清空磁盘上的所有数据操作前务必确认磁盘没有在用。有的服务器可能装的是数据盘不是系统盘别把正在用的数据盘直接初始化了。判断方法用lsblk看挂载情况没有挂载且确认没有业务写入才能执行。4.4 扩展LVlvextend -l 100%FREE /dev/你的卷组名/你的逻辑卷名-l 100%FREE表示把VG里剩余所有空间全部给这个LV。如果你只想给指定大小比如加20Glvextend -L 20G /dev/你的卷组名/你的逻辑卷名这里多说一句-L 20G是增加20G-L 20G是设置LV成20G。两者区别很大写错了可能会导致LV被缩小缩小的操作有严重风险。建议第一次操作的直接检查现有大小后再动手。4.5 确认LV结果lvs看看LV Size是否已经是目标容量。如果df -h看到的还是旧容量那是文件系统没有同步接着往下走。5. 文件系统在线扩容ext4与xfs的不同别套错命令扩充完LV不等于文件系统就自动变大了。要让操作系统真正能用上新增空间需要调整文件系统。这一步用错命令轻则报错重则文件系统受损。5.1 先确认文件系统类型用之前df -hT的输出或者blkid /dev/你的卷组名/你的逻辑卷名看到TYPEext4就是ext4TYPExfs就是xfs。5.2 ext4文件系统的扩容命令resize2fs /dev/你的卷组名/你的逻辑卷名该命令会自动把文件系统扩展到整个LV。在线扩容是安全的不用卸载。5.3 xfs文件系统的扩容命令xfs_growfs /挂载点注意xfs_growfs用的是挂载点不是设备路径。比如xfs_growfs /和ext4不同xfs不支持缩小只支持扩大。想缩小xfs文件系统没有这个操作除非备份重做。这一点在分区规划时就要想清楚。5.4 某些特殊情况文件系统在LV上但用的是btrfs如果你用的是btrfs命令又不一样btrfs filesystem resize max /挂载点不过这种情况在普通服务器上比较少见这里就不展开太多。只要记住一点文件系统类型不同扩容命令几乎完全不同。最稳妥的方法就是用blkid确认类型后再选命令。5.5 扩完文件系统后df的验证df -hT看到Size那一列变大才算真正完成。我和某位同事搭档处理过一台机器扩LV时忘了文件系统这步业务方反馈df没变化后来一查才发现LV已经400G了根文件系统还停留在200G经典的二段跳问题。6. 从pvs看到PV unchanged开始的完整排查链路这里分享一下我这次的实际操作过程因为正好覆盖了“系统里看不到新空间”到“df最终正常”的完整链路。这台机器是某公司的测试环境虚拟机磁盘从80G扩到120G根分区是/dev/mapper/centos-rootVG名是centos。我第一次跑pvs的时候PV还是80G。lsblk显示sda的大小已经是120G说明虚拟机层面的磁盘扩容生效了。但sda2分区的大小还是80G分区表没有同步。执行partprobe /dev/sda之后重新看lsblksda2还是80G。这种时候不用慌说明内核还没完全接受新的分区表或者设备已经处于busy状态。重启我是不想重启的因为上面有服务在跑所以采用下面的方式parted /dev/sda unit s print记录sda2的Start值。然后直接parted /dev/sda resizepart 2 100%执行完parted可能会提示老内核还在使用分区表要求重启或者重新读取。这时跑partprobe /dev/sda再用lsblk发现sda2已经变成120G左右。接下来按照前面说的流程pvresize /dev/sda2 pvsPV已经显示120G。继续vgsVFree那一列有40G。执行lvextend -l 100%FREE /dev/centos/root然后确认文件系统类型blkid /dev/centos/root是xfs于是执行xfs_growfs /跑完df -hT根分区已经变成115G左右扣掉部分系统保留空间。整个链路不算复杂但每一步都可能出现“看起来没生效”的假象。如果卡住了优先看是什么层没同步磁盘层、分区层、PV层还是LV层。逐层用lsblk、fdisk -l、pvs、vgs、lvs就能定位卡点。7. 扩容之后我建议顺手检查的几件事扩容完成后不是df看到变大就万事大吉。有几个检查项是我每次都会顺手过一遍的都很便宜但对后续运维会有帮助。7.1 LVM自检命令vgscan vgck lvscan检查卷组和逻辑卷的元数据是否健康。正常情况下输出里不会有“ERROR”或者“missing”。如果某个PV显示missing说明可能有人在没通知的情况下把磁盘摘了这种情况在虚拟化环境里不是没见过。7.2 改开机自动挂载配置现在的安装器大多会通过/etc/fstab里写/dev/mapper/centos-root这种设备路径一般不会变化。但如果你修改过LV名或VG名fstab对应关系会失联开机可能直接进入emergency模式。检查一下fstab里的UUID或设备名是匹配的cat /etc/fstab blkid不过依赖/dev/mapper/xx的方式在机器重启后也是稳定的因为LVM的设备和顺序不会轻易变。7.3 观察业务影响扩容完成后建议观察一段时间。你可以用iostat看一眼磁盘利用率其实在线扩容对IO有一定影响xfs_growfs和resize2fs都会触发元数据更新极端情况下可能造成IO延迟增高。业务高峰期不建议做这种操作最好在低峰期执行。这是我吃了好几次亏才养成的习惯。7.4 顺手清理无用快照或旧LVTMP空间、old log LV之类的如果是在扩容过程中发现的陈年无用LV在确认没有任何进程使用后可以顺手移除但不要在扩容任务里顺手做。一次只做一件事改存储尤其如此。8. 几个反复遇到的坑文件系统边界、PE大小和分区表最后一个部分专门聊几个实际中反复被坑到的地方希望后面看到文章的人能避开。8.1 坑删除重建分区起始位置变了这是最高危的坑。fdisk重建分区时默认起始扇区可能和原分区不一致一旦不一致数据全部无法识别。规避方式就是按老分区表手动填起始扇区或者直接用parted的resizepart不要自己重建分区。如果实在没有记录老起始扇区有一种办法df命令看到的挂载关系在你删除分区前是正常的但分区一删必须立刻把原来的起始扇区写回来。如果你不确定自己能不能搞定就别用这个方案改为拉新盘来做VG扩容。稳妥比炫技重要。8.2 坑PV和VG的PE大小影响最小扩容粒度LVM默认的PE大小通常是4MB但如果你创建VG的时候改过PE大小比如设成16MB或者64MB逻辑卷扩容的最小粒度就是那个PE大小。假设VG的PE是64MB你执行lvextend -L 100M实际扩展的可能不是刚好100M而是128M2个PE。这对一般场景没影响但对需要精确控制容量的场景要注意。查看方法vgdisplay 你的卷组名 | grep PE Size如果你在意这种细节建议创建VG时统一用默认4MB扩容的时候用-L xxG而不是百分比否则对齐问题会影响后续扩展的计算。8.3 坑lvextend命令里-l和-L的大小写/单位问题-l是PE数量或者百分比-L是容量。两者容易混。比如lvextend -l 100 /dev/vg/lv的意思是扩展到100个PE而不是100%。如果你真想扩展到全部写-l 100%FREE如果固定容量写-L 20G。这个错很隐蔽尤其当你从文档里复制命令时看漏一个符号结果就完全不对。建议发命令前先看一遍lvs的当前容量执行后再lvs确认。8.4 坑不是所有文件系统都能在线扩到LV的100%ext4和xfs都能在线扩到LV的100%但有些场景需要先卸载再扩容比如某些特殊的网络文件系统或者非标准文件系统。普通场景下ext4和xfs在线扩容都没问题。但如果文件系统已挂载且处于使用状态扩容时内核会锁定数据结构短时间内可能造成瞬时IO卡顿量大的业务会感知到微小的延迟抖一下体感不强但存在。大文件持续写入时做扩容也可能让写延迟变大。所以如果有人跟你说“在线扩随便搞”听听就好真上生产还是挑低峰期。8.5 坑分区表是gpt还是dos处理方式不同在fdisk里o创建的是dos分区表g创建的是gpt。gpt分区表情况下使用fdisk做删除重建提示可能更严格因为gpt每个分区有独立的GUID直接d再n会生成新的GUID虽然不影响LVM的PV识别但对某些依赖分区GUID做标识的软件可能造成困扰。这种情况下用parted的resizepart会保留分区GUID更干净。最后一点实际心得说了这么多LVM扩容本身真不是一个高难度操作真正考验人的是对“分层”概念的理解。磁盘、分区、PV、VG、LV、文件系统每一层都有自己独立的容量上限哪一层满了都表现为“空间不够”。你只要掌握逐层检查、逐层扩展的顺序逻辑不管以后遇到什么存储设备都能按同样的思路去排查。另外如果你手头有重要的数据扩容之前做一次备份或者快照始终是值得的。LVM本身支持在线做快照虽然会占用VG的剩余空间但关键时刻是个后悔药。我在生产环境动LVM之前只要条件允许都会先创建一个快照LV扩完确认没问题再删除。这个习惯救过我一次那次正好在删除重建分区时手一抖起始扇区填错靠快照恢复了一部分数据不至于酿成大事故。如果你正在为扩容LVM分区发愁希望这篇笔记能帮你少走几步弯路。有操作细节不清楚的欢迎留言区讨论我看到会回复。
阅读完成 · 觉得有帮助?
咨询建站