尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

VMware ESXi虚拟机CentOS 7系统盘扩容实战:从VMDK到LVM全流程详解

VMware ESXi虚拟机CentOS 7系统盘扩容实战:从VMDK到LVM全流程详解 1. 项目概述与核心需求解析最近在整理一个运行在ESXi上的CentOS 7测试环境时发现当初分配的系统盘空间告急了。这个虚拟机主要用来跑一些中间件和数据库服务随着日志和数据的积累原本50GB的磁盘眼看着就要被塞满。直接新建虚拟机迁移固然是一种方法但涉及到服务配置、网络调整等一系列繁琐操作耗时耗力。相比之下给现有虚拟机的虚拟硬盘VMDK扩容然后在操作系统内部进行分区调整无疑是更经济、更快捷的选择。这个过程涉及到虚拟化层和操作系统层两个层面的操作任何一个环节出错都可能导致数据丢失或系统无法启动因此需要格外谨慎。本文将详细记录我在VMware ESXi 6.7环境下为一台CentOS 7虚拟机成功扩容系统盘的全过程并分享其中关键的原理、步骤以及我踩过的一些坑。这个操作主要适合以下几类朋友负责运维虚拟化平台的工程师、需要在开发测试环境中灵活调整资源的技术人员以及任何希望深入了解虚拟机磁盘管理细节的爱好者。整个过程不需要昂贵的第三方工具利用VMware和Linux自带的命令即可完成但要求操作者对命令行有基本的熟悉度并且务必在操作前做好完整的数据备份。2. 虚拟化层扩容在ESXi中扩展VMDK磁盘整个扩容流程的第一步是在虚拟化管理层进行操作即扩大虚拟机硬盘文件VMDK的容量。这相当于给一个“物理硬盘”增加了物理空间但操作系统暂时还无法使用这部分新增空间。2.1 操作前的关键准备与风险评估在进行任何磁盘操作之前充分的准备是避免灾难的基石。我的准备工作分为以下几个步骤完整虚拟机快照这是最重要、最不能省略的一步。在vSphere Client或Web Client中为需要扩容的虚拟机关机然后创建一个完整的快照。这个快照会捕获虚拟机当前所有的磁盘状态和内存如果选了包含内存万一扩容过程中出现任何不可预知的问题比如操作失误、命令错误导致分区表损坏你可以瞬间回滚到操作前的完美状态。我个人的习惯是给快照起一个清晰的名字例如“Before_Disk_Expansion_20231027”。确认虚拟机状态必须将虚拟机关机。在线热扩容虚拟机运行时扩容在某些高级存储和特定配置下可能支持但对于大多数标准配置和系统盘扩容关机操作是最稳妥、兼容性最好的方式。强行对开机状态的虚拟机进行磁盘属性修改可能导致数据不一致。记录现有磁盘信息登录到CentOS 7虚拟机内部使用fdisk -l或lsblk命令清晰地记录下当前的磁盘设备名如/dev/sda、分区结构如/dev/sda1,/dev/sda2以及各分区对应的挂载点。这为后续在操作系统内的操作提供了清晰的“地图”。2.2 在vSphere Client中扩展虚拟磁盘VMware提供了图形化和命令行两种方式图形化对于不熟悉命令行的用户更友好。图形化操作步骤关闭目标虚拟机后在vSphere清单中右键点击该虚拟机选择“编辑设置”。在打开的虚拟机属性窗口中找到需要扩容的硬盘。通常被标识为“硬盘1”或类似名称后面会显示当前大小如50GB。在“磁盘大小”输入框中直接输入你想要的新容量。例如从50GB扩容到100GB就输入100。这里有一个关键细节你只能输入比当前容量更大的值并且扩容是以GB为单位线性增加不能缩小。点击“确定”保存更改。这个过程非常快本质上只是修改了VMDK描述文件中的容量参数并可能预分配一些元数据并不会立即进行大规模的数据迁移。注意这里扩展的是虚拟磁盘的“整体容量”而不是某个特定的分区。就好像你买了一块更大的硬盘替换了电脑里的小硬盘但新硬盘上的空间还是一片未划分的“原始区域”。命令行操作适用于ESXi Shell或SSH连接对于习惯命令行或者需要通过脚本批量操作的管理员可以使用vmkfstools命令。首先通过SSH登录到ESXi主机。# 首先找到目标虚拟机的存储路径和VMDK文件名 # 可以使用 find 命令或者通常路径是 /vmfs/volumes/[datastore_name]/[vm_name]/[vm_name].vmdk # 假设虚拟机名为 centos7-test 存储在 datastore1 上系统盘文件是 centos7-test.vmdk # 将其从50G扩展到100G vmkfstools -X 100G /vmfs/volumes/datastore1/centos7-test/centos7-test.vmdk执行命令后会提示你确认因为这是一个不可逆的增大操作除非使用其他复杂工具。输入y确认即可。实操心得无论用哪种方式完成后建议再次查看虚拟机设置确认磁盘大小已更新。同时可以到ESXi存储浏览器中查看对应的VMDK文件属性其“大小”应该显示为新的容量如100GB但“已用空间”可能还是原来的值如48GB这很正常因为新增的空间尚未被使用。3. 操作系统层扩容在CentOS 7中识别与分配新空间虚拟磁盘在ESXi层面已经“变大”了但虚拟机内部的CentOS 7系统对此还一无所知。这一步的目标是让系统识别出新空间并将其合并到现有的逻辑卷LVM或分区中。3.1 让系统识别扩容后的磁盘启动刚才扩容的CentOS 7虚拟机并登录系统。首先我们需要让内核重新读取磁盘的容量信息。使用lsblk命令查看现状你会看到磁盘例如/dev/sda的总容量可能已经显示为新的大小如100G但其下的分区如/dev/sda1/dev/sda2大小还是旧的。这说明系统检测到了磁盘容量变化但分区表并未更新。lsblk # 输出示例 # NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT # sda 8:0 0 100G 0 disk # ├─sda1 8:1 0 1G 0 part /boot # └─sda2 8:2 0 49G 0 part # ├─centos-root 253:0 0 45G 0 lvm / # └─centos-swap 253:1 0 4G 0 lvm [SWAP]重新扫描磁盘设备对于/dev/sda这样的SCSI/SATA磁盘可以使用以下命令让系统在不重启的情况下重新探测设备大小echo 1 /sys/class/block/sda/device/rescan这条命令向指定的磁盘设备发送一个重新扫描的指令。执行后再次运行fdisk -l /dev/sda你应该能看到“Disk /dev/sda: 107.4 GB”这样的信息确认总容量已更新。3.2 扩展分区表使用fdisk或parted这是整个过程中最具技术风险的一步。我们需要调整分区表将新增的未分配空间划归到现有的分区中。CentOS 7默认安装通常使用LVM系统盘分区结构一般是一个小的/boot分区/dev/sda1和一个大的LVM物理卷分区/dev/sda2。我们需要扩展的是第二个分区。警告操作分区表有极高风险务必在操作前确认备份和快照已完成。使用fdisk进行操作运行fdisk /dev/sda。输入p打印当前分区表仔细核对。输入d删除分区。选择分区号2即/dev/sda2。注意删除分区仅删除分区表中的记录在后续正确操作完成前不会立即丢失数据。输入n创建新分区。选择主分区p分区号2。设置起始扇区。这里至关重要新分区的起始扇区必须和原来被删除的分区2的起始扇区完全一致fdisk通常会提示一个默认的起始扇区这个默认值往往就是原分区的起始扇区直接按回车采用默认值即可。如果记不住在删除分区前先用p命令记下起始扇区值Start列。设置结束扇区。这里直接按回车采用默认值即最后一个可用扇区这样新分区就会占用所有剩余空间包括新增的空间。输入t更改分区类型。选择分区2将其类型设置为8eLinux LVM 的十六进制代码。输入p再次打印分区表确认新分区2的结束扇区已变大包含了新增空间。输入w将更改写入分区表并退出。系统会提示分区表已更改需要重启或使用partprobe命令让内核重新读取。使用parted进行操作更直观parted工具支持直接调整分区大小对于GPT分区表也更友好。# 启动parted交互界面 parted /dev/sda # 在parted提示符下 (parted) print free # 查看磁盘空闲空间确认新增的未分配空间 (parted) resizepart 2 # 调整2号分区 # 会询问结束位置输入100% 或者具体的容量如100GB (parted) quit踩坑记录我曾有一次在扩展分区后忘记将分区类型改回8eLVM导致系统重启后无法识别该分区为物理卷启动失败。幸亏有快照迅速回滚。所以在fdisk中w写入之前务必用t命令确认分区类型正确。3.3 扩展LVM物理卷、卷组与逻辑卷分区调整好后新增的空间现在属于/dev/sda2这个“容器”。但这个容器是LVM体系中的“物理卷PV”我们需要将其空间加入到“卷组VG”最后才能扩展到“逻辑卷LV”也就是我们实际使用的/根目录。扩展物理卷PV告诉LVM物理卷/dev/sda2的实际大小变了。pvresize /dev/sda2执行pvdisplay查看可以看到物理卷的“自由空间”增加了。检查卷组VG空间物理卷的空间会自动加入到其所属的卷组中。运行vgdisplay或vgs查看“自由空间”是否增加。扩展逻辑卷LV现在可以将卷组中的自由空间分配给需要扩容的逻辑卷了。通常根目录对应的逻辑卷是/dev/centos/root具体名称请用lvdisplay查看。# 将卷组中所有剩余空间都分配给根逻辑卷 lvextend -l 100%FREE /dev/centos/root # 或者如果你知道要扩展多少容量例如扩展20G # lvextend -L 20G /dev/centos/root扩展文件系统这是最后一步也是让操作系统真正能使用新空间的关键。逻辑卷好比一个“大房子”里隔出来的“房间”我们刚刚把房间的墙往外推了扩展了LV但房间里的地板文件系统还没有铺到新区域。对于CentOS 7默认的xfs文件系统使用xfs_growfs如果是ext4则使用resize2fs。# 对于xfs文件系统CentOS 7默认 xfs_growfs / # 对于ext4文件系统如果安装时选择了ext4 # resize2fs /dev/centos/root这个命令会在线扩展挂载在/下的文件系统无需卸载。执行完成后使用df -h命令查看你会发现根目录/的可用空间已经变大了。4. 完整操作流程复盘与命令清单为了更清晰地呈现整个操作链条我将关键步骤和命令整理如下表。你可以将其视为一个检查清单在操作时逐一核对。阶段操作位置目标关键命令/操作注意事项准备vSphere Client创建数据备份点关闭虚拟机 - 创建完整快照生命线必须做CentOS 7 内部记录当前状态lsblk,df -h,pvdisplay,lvdisplay明确操作对象和初始状态ESXi层扩容vSphere Client扩大虚拟磁盘编辑设置 - 增加磁盘容量 - 确认只能增大不能减小ESXi Shell命令行扩大VMDKvmkfstools -X 新大小G vmdk路径需SSH到ESXi主机确认路径正确OS层识别CentOS 7 内部让内核识别新容量echo 1 /sys/class/block/sda/device/rescan针对SCSI/SATA磁盘执行后fdisk -l确认分区调整CentOS 7 内部扩展分区以包含新空间fdisk /dev/sda或parted /dev/sda高风险操作务必记准原分区起始扇区保持分区类型不变LVM扩展CentOS 7 内部将新空间纳入LVM体系pvresize /dev/sda2扩展物理卷vgdisplay查看卷组是否有空闲空间lvextend -l 100%FREE /dev/centos/root将空闲空间全部加入根逻辑卷文件系统扩展CentOS 7 内部扩展文件系统以使用空间xfs_growfs /(xfs) 或resize2fs(ext4)针对已挂载的文件系统在线操作验证CentOS 7 内部确认扩容成功df -h,lsblk核对根目录容量是否按预期增加5. 常见问题排查与实战技巧即使按照步骤操作也可能遇到各种意外。下面是我在多次扩容中遇到的一些典型问题及解决方法。5.1 分区起始扇区错位导致数据丢失风险这是使用fdisk工具时最容易出错的地方。在删除旧分区2后创建新分区2时如果起始扇区Start设置得比原来的大那么新旧分区之间就会产生一个“间隙”。这个间隙对于操作系统来说是未分配空间而原来分区2末尾的一部分数据实际上就被“隔离”在了这个间隙之前导致数据错位和丢失。更危险的是如果起始扇区设置得比原来的小则会覆盖之前分区1(/boot) 的数据导致系统无法启动。解决方案在删除分区前务必用p命令精确记录下分区2的Start扇区号。创建新分区时手动输入这个扇区号而不是盲目接受默认值尽管默认值通常是对的。使用parted工具的resizepart命令可以避免这个问题因为它是在原分区基础上直接调整结束位置。5.2 扩容后系统无法启动Grub Rescue有时扩容操作后特别是涉及/boot分区所在磁盘的结构变化可能会导致GRUB引导程序找不到启动文件。重启后你可能看到grub rescue提示符。排查与解决首先检查是否误操作了/dev/sda1(/boot分区)。确保其起始和结束扇区没有改变。使用Live CD/USB启动挂载原系统的根分区和/boot分区然后重新安装和配置GRUB。# 假设在Live环境中原系统根分区挂载在 /mntboot分区挂载在 /mnt/boot mount /dev/sda2 /mnt mount /dev/sda1 /mnt/boot # 绑定虚拟文件系统 mount --bind /dev /mnt/dev mount --bind /proc /mnt/proc mount --bind /sys /mnt/sys # chroot到原系统环境 chroot /mnt # 重新安装GRUB到磁盘 grub2-install /dev/sda # 重新生成GRUB配置文件 grub2-mkconfig -o /boot/grub2/grub.cfg # 退出chroot并重启 exit reboot5.3 使用parted调整分区后fdisk显示异常parted和fdisk对于分区表的解读有时存在差异尤其是在使用GPT分区表而非传统的MBR时。用parted调整大小后用fdisk -l查看可能会报警告或显示大小不正确。解决方案这是工具兼容性问题通常不影响实际功能。以parted的print输出为准。可以运行partprobe命令强制内核重新读取分区表或者直接重启系统让内核获取最准确的信息。只要后续的pvresize,lvextend等命令能正常执行并成功扩展文件系统就说明操作是成功的。5.4 文件系统扩展命令执行失败执行xfs_growfs或resize2fs时提示“设备上没有剩余空间”或类似错误。排查步骤确认逻辑卷已真正扩展运行lvdisplay /dev/centos/root检查“LV Size”是否已经变大。如果没变说明lvextend步骤可能失败了需要回头检查卷组是否有空闲空间vgdisplay。确认文件系统类型运行lsblk -f或blkid确认根分区文件系统到底是xfs还是ext4用错了扩展命令自然会失败。尝试指定设备有时xfs_growfs /可以有时需要指定具体的设备名xfs_growfs /dev/centos/root。可以都试一下。检查文件系统错误在极少数情况下文件系统本身可能有错误阻碍了在线扩展。可以尝试在单用户模式或Live CD环境下先对文件系统进行检查修复xfs_repair或e2fsck然后再进行扩展。注意对根文件系统进行修复通常需要卸载它这意味着必须从其他介质启动。6. 进阶考量与替代方案对于生产环境或更复杂的场景还有一些进阶的考量点。在线扩容的可能性对于数据盘非系统盘如果虚拟机配置了支持热扩展的SCSI控制器如LSI Logic SAS或VMware Paravirtual并且客户机操作系统也支持如Linux内核支持对应SCSI驱动和文件系统的在线扩展那么可以在虚拟机开机状态下先在ESXi层面扩展磁盘然后在操作系统内执行rescan、扩展分区、LVM和文件系统等一系列操作实现真正的业务不中断扩容。但这需要对硬件和驱动有更深入的了解并且每一步都要严格测试。使用GParted Live ISO对于不熟悉命令行分区操作或者分区表比较复杂例如涉及多个主分区、扩展分区的情况可以使用GParted Live ISO镜像。将其挂载到虚拟机的光驱并设置为优先启动就可以进入一个图形化的分区编辑器环境像在Windows下使用DiskGenius一样通过拖拽滑块来调整分区大小操作更直观且工具会自动处理分区对齐等细节。这对于调整非LVM的普通分区尤其有用。规划比扩容更重要最后也是最根本的一点良好的前期规划能避免频繁扩容的麻烦。在创建虚拟机时根据业务增长预期为磁盘选择“厚置备延迟置零”或“厚置备急切置零”模式并预留足够的空间。对于日志、数据等增长快速的目录在初始设计时就考虑将其放在独立的磁盘或分区上方便单独管理和扩容。使用LVM本身就是为了获得这种灵活性因此即使在初始安装时只有一个分区也强烈建议基于LVM来创建为未来的扩展打下基础。整个给ESXi虚拟机CentOS 7扩容的过程就像给一间正在使用的房子进行扩建。ESXi层面的操作是买下了隔壁的地皮扩大VMDK而CentOS内部的操作则是敲掉旧墙、扩建房间调整分区、通知物业管理系统新面积扩展LVM、最后把新地板铺好扩展文件系统。每一步都需要精准无误否则房子就可能塌。我的体会是慢就是快。在每一个破坏性操作如fdisk删除分区之前停顿十秒钟再次核对命令和参数这十秒钟可能省下的是数小时的数据恢复甚至重建系统的时间。另外对于任何重要的虚拟机定期快照和备份的策略远比任何精湛的故障修复技术更重要。
返回列表