尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

VMware虚拟机扩容:从VMDK到Linux分区的完整实战指南

VMware虚拟机扩容:从VMDK到Linux分区的完整实战指南 简介在VMware虚拟机中运行Linux时磁盘空间不足往往导致软件安装失败或服务运行异常这份资源正是针对这一痛点的实操指南适合Linux运维人员、开发者和虚拟机使用者。文档完整覆盖从VMware侧扩展磁盘、Linux内部分区、格式化、挂载到通过/etc/fstab实现开机自动挂载的全流程并补充了当前磁盘无扩展空间时新增虚拟硬盘的替代方案可帮助读者按步骤排查并完成扩容。包体为单个docx文档约324KB内容以命令行与界面操作组合呈现结构清晰便于边看边做。预览内容显示文档以实际案例为主线详细演示了如扩容至50GB、创建分区/dev/sda4等关键操作并配有fdisk、mkfs、mount及fstab配置说明实操性较强。目前已有6504人学习/下载适合需要快速解决虚拟机存储不足问题的中初级Linux用户。1. VMware扩容不是把滑块拉大就完事真正的瓶颈在Linux层在VMware Workstation Pro里跑Linux开发环境、编译节点、附带的数据库实例用久了都会撞上同一个问题磁盘快满了。最直觉的操作是把虚拟磁盘从20G改成100G然后你会发现df -h里还是那可怜的20G。原因在于VMware虚拟机扩容是两层的第一层在VMware层把虚拟磁盘文件本身撑大第二层在Linux系统里把分区和文件系统扩展到新边界。只做第一层不做第二层系统根本感知不到新空间。这篇文章把整条链路走一遍覆盖非LVM和LVM两种主流布局附上参数选型、命令输出特征和翻车记录。无论你只是在VMware里装个Ubuntu练手还是在为银河麒麟这类国产发行版留足数据分区都可以照这个流程操作。2. VMware层动手两种扩展虚拟磁盘的方式与前置准备2.1 扩容前的5个前置检查快照、关机、磁盘格式、备份、文件系统动手之前先花五分钟做检查。扩展操作本身并不复杂但前置条件没满足界面上的按钮可能是灰的命令行工具也可能直接拒绝执行。第一检查快照。VMware Workstation的磁盘扩展功能在有快照的情况下默认不可用因为你当前操作的是快照链上的一层直接改父磁盘会破坏快照的引用关系。我一般这样做先给当前状态打一个快照当作后悔药然后在快照管理器里删除这个快照时选择“保留”这样既拿到了完整数据副本又让磁盘回到可扩展状态。第二确认虚拟机是否在运行。Workstation桌面版本地编辑虚拟磁盘时“扩展”入口在开机的状态下经常是灰色不可点的最省事的做法是把虚拟机关机再做。如果你用的是带web Client的ESXi环境SATA和SCSI类型的磁盘支持在线热扩展但扩展完还得进系统重扫SCSI总线这点到第四章会细说。第三看一下虚拟磁盘文件的形态。很多从模板部署出来的虚拟机VMDK是拆成多个2GB小文件的比如vm-disk1.vmdk、vm-disk1-s001.vmdk这种结构。扩展时无论界面操作还是命令行只需要指向主vmdk文件也就是名字最简单那个VMware会自动合并扩容但合并过程耗时明显比单文件长。第四做好数据备份。虽然VMware扩容不会重写已有数据但后续Linux层扩展分区和文件系统是有写操作的。建议在扩容前把VMDK文件物理复制一份或者用导出OVF的方式做整机备份。备份占用空间大可这是唯一能让你在误操作之后全身而退的路径。第五用VMware界面确认你选的是不是正确的磁盘。一台虚拟机可能同时挂了三块VMDK界面上看到的磁盘大小和系统里/dev/sda、/dev/sdb的对应关系要对清楚。如果你不确定在虚拟机设置里看SCSI地址0:0对应Linux里通常就是sda这个规律在多数发行版下都成立。2.2 图形界面操作VMware Workstation的Expand入口图形界面的操作路径是所有方式里最不容易出错的尤其适合刚接触虚拟化的新手。具体入口是选中虚拟机右键“设置”进入“硬件”页签点中“硬盘”右侧会显示当前磁盘容量和“最大大小”。这里的关键按钮在“磁盘实用工具”区域展开后有一个“扩展”选项。点击后输入目标容量比如从20G改成60G确认后开始扩展。这里有两个值得注意的细节。细节一是“最大大小”可以填得比当前容量大很多但只能扩展不能缩小这是VMware虚拟磁盘的硬限制。理由很简单缩容需要在线迁移和重写全部数据Workstation产品一直没有开放这个能力。细节二是扩展过程不是瞬间完成的如果你的VMDK是拆分的多个2GB文件会在扩展过程中被整合成单个VMDK文件输出窗口里能看到明显的进度条和磁盘空间变化。界面操作完成后虚拟磁盘从文件层面已经变大了。但此时打开Linux虚拟机执行df -h你会发现分区和文件系统还是老样子。这不是操作失败而是扩容只完成了VMware这一层Linux里的分区表并不知道后面多出来的空间。系统的下一章要做的事情就是让Linux层把这段尾部空间吞进来。2.3 命令行操作vmware-vdiskmanager -x的参数与输出如果你需要批量处理多台VMware虚拟机或者在Linux宿主机上用脚本做自动化图形界面就不够高效了。VMware Workstation自带命令行磁盘管理工具vmware-vdiskmanager在Linux宿主机上安装完全版Workstation后它位于/usr/bin目录下。执行扩容的命令格式是sudo vmware-vdiskmanager -x 60GB /data/vm/ubuntu2004/ubuntu2004.vmdk参数-x表示扩展磁盘容量后面紧跟的目标大小必须是大于当前容量的数字可以用MB或GB作为单位中间不留空格。最后一个参数是VMDK文件路径注意要指向主vmdk而不是那些-s001、-s002的拆分文件。命令执行过程中会显示当前磁盘格式和扩展进度成功时输出一串以“Successfully expanded”开头的提示。如果你是在Windows宿主机上装的Workstation命令地址一般是 C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe -x 60GB D:\vms\centos7\centos7.vmdk这里用到了PowerShell的调用运算符因为路径带空格。同样的vmdk路径写引号是防止空格截断参数。Windows下注意要用管理员权限打开PowerShell否则工具会报无法写入磁盘文件的权限错误。需要补充一条边界经验vmware-vdiskmanager同样不适用于正在运行的虚拟机它会检测vmdk文件是否被占用占用时直接拒绝操作并提示先关闭虚拟机。如果你是ESXi环境扩容命令则是vmkfstools -X语法为“vmkfstools -X 60G vm.vmdk”注意区分两者参数风格不同不能混用。3. Linux层感知新空间growpart、resize2fs与LVM三条路径3.1 先定方案lsblk、df -h、blkid一分钟摸清现状VMware层做完之后回到虚拟机终端。第一步不是急着执行扩容命令而是先确认磁盘现状和分区布局。原因很简单不同布局对应不同扩展命令LVM和非LVM差的不是一星半点。先跑这三条命令lsblk /dev/sda df -h blkidlsblk的输出会显示整块磁盘sda的大小是否已经变成60G同时列出sda1、sda2这些分区的起止情况。你需要重点看最后一个分区的大小和磁盘总大小是否一致。如果磁盘显示60G但最后一个分区仍只有20G说明磁盘尾部多出一段未分配空间接下来就是要把它并入最后一个分区。df -h是为了确认根分区或者数据分区的当前使用率这决定你扩容后是否真的缓解了空间压力。有时系统提示磁盘满但实际上是某个独立挂载点比如/home或者/var/log满了而不一定是根分区满。这种情况盲目扩展根分区并不能解决问题。blkid则是查看分区的文件系统类型和UUID。ext4类型的分区后续用resize2fs扩展XFS类型要用xfs_growfs两者命令完全不同。UUID则用于后续写fstab时防止设备名漂移。这三条命令组合起来一分钟内就能确定你的系统是LVM布局、普通ext4布局、还是XFS布局然后就可以选择对应的处理路径了。3.2 非LVM场景growpart与resize2fsext4和xfs_growfsXFS如果你的lsblk输出里没有LVM相关的vgroup和lvol字样那就走传统分区扩容流程。核心是两个步骤先把分区表扩到磁盘新边界再把文件系统扩到分区新边界。首先是扩展分区边界用growpart命令sudo growpart /dev/sda 3growpart的参数格式是“磁盘路径 分区号”两者之间是空格而不是冒号。上面这个命令的含义是把/dev/sda的第3个分区扩展到磁盘末尾。执行成功后会显示分区起止扇区的变化。如果你看到报错信息带有“unexpected input”字样多半是把分区号写成了sda3这种完整设备名需要改回“3”。接下来重读分区表这一步经常被忽略但很关键sudo partprobe /dev/sda内核有时会保留旧的分区表缓存不执行partprobe的话后续resize2fs读到的分区边界还是旧的会提示没有可用空间。在老一些的发行版上也可以使用partx -u /dev/sda代替效果相同。分区边界扩展完成后再扩展文件系统。ext4格式使用resize2fssudo resize2fs /dev/sda3resize2fs不指定大小参数时默认将文件系统扩展到分区边界能容纳的最大容量。这个命令可以在挂载状态下在线执行不需要卸载分区这是ext4的一个优势。执行过程显示“Filesystem at /dev/sda3 is mounted on /; on-line resizing required”之类的信息最终输出新的块数量。如果你的文件系统是XFS命令组合就要调整。XFS文件系统的在线扩展命令是xfs_growfs而且参数是挂载点而不是分区设备路径sudo growpart /dev/sda 3 sudo xfs_growfs /xfs_growfs的挂载点参数要写实际的挂载目录比如根分区就是/数据分区就写/data。这是因为XFS的在线扩展依赖挂载上下文直接传分区设备路径反而会报错。这里有个很常见的误操作新手会试图用resize2fs去扩XFS分区结果报错“Usage: mkfs.xfs”然后就开始怀疑系统坏了其实只是工具选错了。3.3 LVM场景pvresize和lvextend的逻辑链LVM布局在服务器场景和国产Linux发行版中非常普遍流程比非LVM多了一层但也更灵活。先确认你的系统确实用了LVMlsblk输出中会出现vgroup和lvol字样pvdisplay或vgs能看到物理卷和卷组。LVM扩容的关键在于理解“分区→物理卷→逻辑卷→文件系统”这条链。VMware层扩容后磁盘尾部多出的空间并没有自动进入物理卷需要手动通知LVM。第一步是扩展物理卷sudo pvresize /dev/sda3pvresize的作用是让物理卷感知到底层分区容量的变化不指定新大小时它默认扩展到分区允许的最大边界。执行后可以用pvdisplay确认Physical Volume Size已经变为新的容量。物理卷扩展完成后接着扩展逻辑卷。这里有两种写法我实际工作中的选择逻辑略有不同# 把卷组所有剩余空间都分配给指定逻辑卷 sudo lvextend -l 100%FREE /dev/vg01/lvroot # 或者只增加固定容量比如增加20G sudo lvextend -L 20G /dev/vg01/lvroot第一种写法适合逻辑卷数量少、剩余空间就这一个用途的虚拟机第二种写法适合卷组里有多个逻辑卷需要分别分配空间的场景避免一次性把空间全塞给某个卷。参数-l后面跟百分比-L后面跟具体容量号表示在现有基础上增加。逻辑卷扩展完成后最后一步同样是扩展文件系统。ext4格式的LVM逻辑卷用resize2fssudo resize2fs /dev/vg01/lvroot注意这里的目标是逻辑卷设备路径/dev/vg01/lvroot不是挂载点也不是物理分区。如果是XFS格式的逻辑卷则用xfs_growfs加挂载点sudo xfs_growfs /整个LVM链路执行完后df -h就能看到容量变化。有一个值得养成的习惯是在执行lvextend前先用lvs查看一下卷组的剩余空间确认空间确实已经进了卷组避免lvextend报“Insufficient free space”然后再回头查pvresize是否成功。3.4 独立挂载点方案新空间不合并而是单独给/home或/data有些时候你并不想把新空间合并到根分区。比如根分区已经用了很久里面碎片化严重或者你希望以后的开发数据、容器数据独立一块磁盘方便备份快照。这种场景下更稳妥的做法是给虚拟机新增一块独立虚拟磁盘然后挂载到指定目录。在VMware界面里点击“添加”→“硬盘”创建一个新的VMDK容量按需求填。新磁盘在Linux里会作为/dev/sdb出现不会动到现有系统的任何分区。在系统里这样操作sudo parted /dev/sdb --script mklabel gpt mkpart primary ext4 1MiB 100% sudo mkfs.ext4 /dev/sdb1第一条命令用parted把整块新盘分成一个GPT分区从1MiB开始到100%结束script参数表示非交互执行。第二条命令把分区格式化为ext4。如果选择XFS则把mkfs.ext4替换为mkfs.xfs /dev/sdb1。挂载配置时推荐用UUID而不是设备名防止重启后设备名漂移导致挂载失败sudo blkid /dev/sdb1 echo /dev/sdb1 /data ext4 defaults 0 2 | sudo tee -a /etc/fstab sudo mount -amount -a的作用是按照fstab内容尝试加载所有未挂载的条目这一步就是为了验证配置是否正确。如果fstab写错了mount -a会当场报错而不是等到重启才发现进不了系统。只要你用的是标准ext4文件系统银河麒麟、openEuler、Ubuntu、CentOS等发行版的流程都完全一致底层都是同一套内核机制。4. 排查避坑VMware扩容失败的四种翻车现场与处理4.1 界面扩展按钮是灰色的点不下去现象进入虚拟机设置后硬盘的“扩展”选项是灰色不可点击状态。原因虚拟机存在快照。VMware不允许在快照存在的情况下调整虚拟磁盘大小尤其是有多个快照点时磁盘结构已经变成链式引用直接扩容会让快照链失效。解决先给当前系统打一个快照然后在快照管理器里删除刚才创建的快照并选择“删除但保留文件”也就是合并到父磁盘这样数据完整保留磁盘快照链也清理干净了扩展按钮即可生效。如果你根本不需要快照直接全部删除也行但前提是确认快照里没有需要找回的历史状态。4.2 扩容后resize2fs报No space left on device但磁盘明明大了现象VMware层已经显示磁盘60Glsblk也能看到sda磁盘是60G但扩容最后一步resize2fs提示没有可用空间文件系统容量纹丝不动。原因这是最典型的“漏了一步”错误。磁盘变大后分区表里最后一个分区的边界还是旧的没有执行growpart把分区边界扩到磁盘尾部。resize2fs只是扩展文件系统到分区边界分区边界没变文件系统自然扩不进去。解决回到分区的操作先执行growpart /dev/sda 3再用partprobe重读分区表最后重新跑resize2fs。如果growpart中途报错先确认有没有安装cloud-utils-growpart这个包部分精简发行版默认不带growpart需要apt install cloud-guest-utils或yum install cloud-utils-growpart补齐。4.3 MBR磁盘到了2TB边界分区表不配合扩容现象VMware磁盘扩容完成后在Linux里fdisk -l可以看到磁盘很大但growpart执行时报错提示分区表类型不支持或无法扩展超过2TB。原因老虚拟机创建时使用了MBR分区表。MBR的分区表项使用32位扇区寻址单个磁盘最大只能管理到2TB。当磁盘容量超过这个边界MBR无法描述新增的空间扩容自然无从谈起。解决两件事。事前创建新虚拟机磁盘时超过2TB要选择GPT分区表。事后如果已经遇到这种情况需要把MBR转换为GPT。转换工具有gdisk的sgdisk命令或者系统自带的分区工具。这里给一条经验MBR转GPT是破坏性操作虽然转换本身不写数据但操作失误可能丢分区务必先备份再转换。转换完成后重跑growpart和resize2fs即可。4.4 开机状态热扩展了磁盘但Linux重扫SCSI设备后还是旧容量现象ESXi环境下在虚拟机开机时执行了热扩展磁盘容量已经变大Linux里用lsblk看磁盘还是旧大小执行rescan命令后依然没有变化。原因SCSI类型磁盘在热扩展后确实支持在线重扫描但有两个前提磁盘控制器型号被正确识别并且没有处于I/O繁忙状态。IDE类型的磁盘不支持热扩展重扫必须重启才能识别新容量。另外部分精简内核里没有加载scsi_mod的rescan支持模块修复命令根本不存在。解决最省心的方法是直接重启虚拟机。如果必须在线处理先确认磁盘类型是SCSI或SATA再执行echo 1 /sys/class/scsi_device/0:0:0:0/device/rescan设备路径根据ls /sys/class/scsi_device输出调整。重置SCSI总线可用sg3_utils工具包sg_scan -i和sg_reset -d /dev/sda配合。但说实话在线扩容重扫的玄学程度不低我一般直接选择维护窗口重启三十秒的事省得折腾半天最后还是要重启。5. 扩容后最后一个习惯不直接重启先mount -a做闭环核对扩容操作真正的收尾不是看到df -h里容量变大就结束了而是要把扩容后的状态和配置文件的正确性做一次闭环核对。我的习惯是执行完上面的扩容步骤后按以下顺序逐个核对lsblk /dev/sda df -hT / sudo mount -alsblk确认磁盘、分区、逻辑卷三级容量已经对齐df -hT确认文件系统类型和容量更新mount -a是为了验证fstab里面新增的挂载项有没有写错。很多时候fstab的语法错误不会在写入时立即暴露等到重启系统才真正翻车——轻则数据分区没挂上重则直接进入emergency mode。mount -a能在十秒钟内发现问题是性价比最高的验证手段。还有一个检验文件系统完整性的细节在扩容后执行一次umount和mount或重启后执行xfs_repair或e2fsck -f确认在线扩容没有给文件系统留下隐藏错误。在线resize2fs通常不会出问题但文件系统是长期跑的一次全量校验能换来后续的踏实。这一步用的时间多一点值得做。扩容这个操作本身不难难的是能否把前置状态摸清楚后置状态验证到位。我自己就翻过一次车当时给一台跑业务的CentOS虚拟机扩容VMware层扩了LVM层扩了df -h也正常了唯独没有同步检查fstab结果一个月后重启发现规划的数据分区根本没挂上报错信息还指向UUID找不到。问题的根子在当初写fstab时用了设备名/dev/sdb1后来重启时内核识别顺序变了设备名漂移导致挂载失败。自那次之后我所有的挂载配置一律用blkid输出的UUID新增挂载条目也一定先跑一遍mount -a验证再谈重启的事。希望这些从VMware层到Linux层的扩容操作和踩坑记录能帮到你。下次再遇到虚拟机磁盘不够用先从这五件事想起有没有快照拦路磁盘类型支不支持热扩展分区表是否撞了2TBgrowpart有没有先于resize2fs执行fstab里的新条目有没有验证过。这套组合拳打下来扩容就真成了一件不用提心吊胆的常规操作。本文还有配套的精品资源点击获取
返回列表