☰
Linux虚拟机磁盘扩容实战:从VMware扩容到fdisk分区挂载
2026/10/16 17:53:50 网站建设 项目流程

简介:在VMware虚拟机中运行Linux系统时,磁盘空间不足往往导致软件无法安装、服务被迫中断,而重装系统又需要重新配置开发环境,代价高昂。这份docx格式的扩容操作指南面向虚拟机管理员、运维人员以及所有需要在Linux下扩展存储的开发者,完整收录了从VMware Workstation界面调整虚拟磁盘大小,到Linux内部使用fdisk创建分区、mkfs格式化、mount挂载及编辑/etc/fstab实现开机自动挂载的全套步骤,并针对“磁盘已无未分配空间”给出了添加新硬盘的备选方案。资源为单文件docx文档,压缩包大小仅324KB,内容紧凑但覆盖关键细节,包括命令交互示例、分区编号选择、必须重启才能格式化等易错提醒。目前已有6512人学习该文档,其操作性极强,按文档操作即可在不重装系统的情况下安全扩展磁盘容量,有效保障开发与测试环境的持续运行。

1. Linux中VMware虚拟机扩容:一个反直觉的开场

在Linux环境里跑VMware Workstation的人,迟早会撞上同一堵墙:系统盘空间耗尽了。排查半天软件装不上、编译失败,最后发现不是环境问题,只是磁盘满了。如果这时候重装系统,开发环境、依赖库、服务配置全部推倒重来,代价远大于扩容本身。最稳妥的做法是在虚拟层先扩展磁盘,再在Linux内部把新空间切出来用。但这里有个反直觉之处:VMware里明明显示扩展成功,Linux里df检查却毫无变化——不是操作失败,而是新空间还没被内核识别、没有分区表记录、也没有格式化。本次分享就围绕这条完整链路展开,从虚拟磁盘扩展、fdisk分区、格式化挂载,到fstab持久化,一次讲透。

2. VMware端磁盘扩展:从20G到50G的物理层操作

2.1 扩展前的准备:快照、名额与备份习惯

进入VMware界面操作之前,建议先把虚拟机做一个快照。扩容本身不会覆盖数据,但fdisk、格式化这些后续动作属于高危操作,一旦中途断电或者分区表写错,快照就是后悔药。

另外要确认宿主机磁盘剩余空间足够。扩展50G意味着宿主真实磁盘也要付出对应的空间占用,如果宿主剩余不足,VMware会直接报错或扩展失败。还有一个容易忽略的点:如果虚拟机做了多级快照,扩展按钮有时会被锁死(详见第4章的避坑小节)。所以我的习惯是:先关闭虚拟机,做快照,再检查宿主机磁盘可用空间,最后才打开虚拟机设置去动硬盘参数。

2.2 把磁盘扩容到50GB:界面步骤与参数选择

VMware Workstation的扩展入口在虚拟机设置里,具体路径是:

  1. 选中目标虚拟机,点击 Edit virtual machine settings(编辑虚拟机设置)
  2. 在 Hardware 选项卡中找到 Hard Disk
  3. 右侧 Utilities(实用程序)下拉框中找到 Expand(扩展)
  4. 将磁盘容量从当前值修改为目标值,例如20G改为50G,点击 Expand
  5. 等待扩展过程完成——这个过程通常需要几分钟,界面会显示进度条

扩展完成后不要在界面层继续做任何操作,直接启动虚拟机进入Linux系统。

这里有几个参数层面的注意事项。第一,该功能只能增大磁盘,不能缩小,所以扩容前把目标值想清楚,宁可一次多扩一点,也不要反复扩容。第二,扩展的值必须是整数,单位是GB,VMware不接受小数。第三,如果你的磁盘是独立模式(Independent)或者存在快照树,Utilities下拉框里的Expand选项可能会置灰,这时需要先删除快照或克隆出一个新虚拟机再操作。

以50G作为目标值是实践中比较稳妥的选择。开发环境加上编译缓存、Docker镜像、日志文件,一般预留10G到15G的余量比较合理。如果之前只有20G,扩到50G相当于翻倍有余,短期内不会再遇到空间焦虑。要是计划存储大型数据集或模型文件,建议直接扩到100G,省得几个月后再重复一次全套流程。

2.3 扩展后的状态确认:物理可见,系统不认

扩展完成后,此时的状态可以用一句话概括:VMware层面已经承认这块磁盘变大,但Linux操作系统内核还“不认识”新空间。因为磁盘分区表仍然记录着旧的大小,内核加载的也是旧分区信息。用fdisk -l查看,盘符和分区都保持原样,df统计的文件系统可用空间也没有变化。

这个“看不见”的现象是正常的,不需要慌张,也不要在这里反复重启Linux尝试——重启多少次都不会让新空间自动出现,因为分区表还没有被修改。接下来要做的,是进入Linux内部,用fdisk把扩展出来的空闲空间划分成一个新分区,再格式化、挂载、写fstab,至此整个扩容才算落地。下一章就进入Linux内部操作。

注意:如果此时你打开VMware的磁盘实用程序,会看到类似“磁盘已扩展,客户机操作系统需要重新扫描”的提示。这个提示不是让你在VMware界面操作,而是引导你进入系统完成分区步骤。不要在这时做任何额外动作,直接开虚拟机即可。

3. fdisk手工分区:把空闲空间变成可用的sda4

3.1 先看清分区现状:fdisk -l的输出怎么读

进入Linux系统,用root账号打开终端,第一件事就是执行:

# 查看当前磁盘的分区表结构 fdisk -l

输出大概是这样的:

Disk /dev/sda: 53.7 GB, 53687091200 bytes 255 heads, 63 sectors/track, 2610 cylinders Device Boot Start End Blocks Id System /dev/sda1 * 1 13 104391 83 Linux /dev/sda2 14 263 2008125 82 Linux swap /dev/sda3 264 1566 10461397 83 Linux

这里最关键的信息在最后几列:Device列出的是已有的分区设备号,System列标识分区类型。当前最大分区是/dev/sda3,磁盘总容量变成了53.7G,但所有分区加起来的空间仍然只有扩容前的大小——中间多出的那部分空闲空间没有任何分区记录。

所以可以确定:新创建的分区将是/dev/sda4。如果你的磁盘上已经存在sda4、sda5等编号,新分区会按顺序递增,别机械照抄sda4这个号,以fdisk -l输出的实际排列为准。另外注意总容量显示为53.7GB而不是整数50GB——磁盘厂商的十进制GB与系统二进制的换算差异导致,完全正常。

3.2 交互式创建主分区:n、p、回车、回车、w

确认空闲空间存在后,开始真正的分区操作。执行:

# 进入/dev/sda的分区编辑界面 fdisk /dev/sda

此时会进入一个交互式命令行,fdisk会提示:

Command (m for help):

在提示符后依次输入以下命令,每输入一条按一次回车:

# 查看帮助菜单(可选,但对新手友好) m # 添加新分区 n # 选择创建主分区 p # 回车:分区号选默认值(此处为4) # 回车:起始柱面选默认值(系统自动选择第一个空闲柱面) # 回车:结束柱面选默认值(把剩余空间全部用完) # 保存修改并退出 w

等fdisk输出“The partition table has been altered”,表示分区表已经写入。

这段操作的逻辑并不复杂,但几个细节值得说明。n是新建分区的指令,p告诉fdisk我们要创建的是主分区(primary)而不是逻辑分区(logical)。为什么选主分区?因为这块磁盘上已经有sda1、sda2、sda3三个主分区了,剩余空闲空间还能再创建一个主分区,sda4就是它的编号。全程直接回车接受默认值,是因为fdisk会自动选择第一个可用的分区号和起始柱面这样能最大限度利用空间,也不会跟已有分区冲突,手动指定反而容易写错。

执行w之前,如果对操作没有把握,可以用p命令先打印一次分区表预览。确认无误后输入w让分区表真正写入磁盘。这一步是全程的转折点——分区表从这一刻起不再保留旧数据,扩展出来的空间被视为一个全新的独立分区。

3.3 必须重启:为什么fdisk的分区不立即生效

分区表写入完成后,接下来就到了整段流程中最容易“翻车”的一步:重启。

在fdisk退出之后,直接执行:

# 重启Linux系统 reboot

这个过程不是走形式。Linux内核在启动时一次性读取分区表,运行期间已经加载的分区信息会一直维持原状直到重启。如果跳过重启直接尝试格式化/dev/sda4,系统会提示“No such file or directory”或“找不到设备”,因为/dev目录下根本没有这个分区节点。

重启后重新登录,再用fdisk -l确认,此时在Device列表的末尾就会出现/dev/sda4。有些内核版本比较新的发行版支持在线重读分区表(partprobe或partx命令),但对VMware虚拟SCSI磁盘而言,稳妥起见我依然建议直接reboot。为了这一次重启能避免后续更多麻烦,值得。

3.4 格式化:理解mkfs类型和等待时长的关系

重启完成后,在/dev/目录下确认sda4存在,然后进行格式化。本次以ext2文件系统做示例:

# 查看新分区是否出现 ls -l /dev/sda4 # 格式化为ext2文件系统 mkfs.ext2 /dev/sda4

格式化进程会输出一组inode、block计数信息,这个过程一般几十秒内完成,输出内容相对简洁。如果希望使用日志能力更强的文件系统,可以顺手换成mkfs.ext4 /dev/sda4,逻辑完全一致,命令本身就是文件系统类型名。

针对ext2和ext4的选择做一个说明。ext2没有ext4的日志(journal)功能,断电或系统崩溃后需要完整的文件系统检查,但对一块只存放普通软件包或静态资源的挂载盘,差别不大。ext4具备日志,故障恢复更快,也是最常见的现代Linux默认文件系统。原文用ext2是因为老教程的习惯写法,生产环境我一般会直接换成ext4。换了文件系统类型,后续fstab里的类型字段也要对应修改,这两处保持一致就行。

格式化的本质是把分区结构整理成文件系统可以识别的目录树结构。mkfs会把inode表、块组描述符、超级块等元数据写入分区——格式化完成前,分区只是“空间的划分”,格式化完成后才成为Linux可以直接挂载使用的“文件系统”。

4. 挂载与自动持久化:写入fstab的完整链路

4.1 创建挂载点并手动挂载

格式化完成后,磁盘还不能直接用,需要给它一个访问入口。首先在根目录下创建挂载点目录,然后执行挂载:

# 在根目录下创建挂载点 mkdir /disk4 # 将/dev/sda4挂载到/disk4 mount /dev/sda4 /disk4/ # 用df检查挂载结果 df -h /disk4

df -h输出中会出现/dev/sda4以及对应的容量、已用空间、挂载点信息。到这里,新增加的空间已经可以在/disk4/目录下正常读写文件了。

挂载点目录名没有硬性要求,/disk4只是一个示例。生产环境中更常见的做法是按用途命名,比如/data、/opt/backup、/var/lib/docker-old,或者用带语义的路径如/disk-extra。命名建议明确可读,避免以后自己都搞不清这个挂载点里放的是什么数据。要注意的是,挂载点目录在mount之前必须存在,如果目录不存在,mkdir会报错,mount也会报“special device /dev/sda4 does not exist”之外的另一个错误——mount point does not exist。

4.2 写入/etc/fstab实现开机自动挂载

手动挂载只在当前会话有效,重启后挂载关系会全部丢失。要让系统每次开机自动挂载/dev/sda4,需要编辑/etc/fstab文件:

# 用vim打开fstab配置(也可以使用vi/nano) vim /etc/fstab

在文件末尾追加一行:

/dev/sda4 /disk4 ext2 defaults 0 0

保存退出后,用以下方式验证fstab配置是否正确:

# 卸载后通过fstab重新挂载,这一步不会出错说明配置无误 umount /disk4 mount -a # 再次确认挂载状态 df -h /disk4

mount -a的作用是读取/etc/fstab中的所有条目并尝试挂载。如果命令执行后没有报错,df检查/disk4正常显示,说明自动挂载配置生效。接下来重启时,系统会在启动过程中自动完成挂载动作,新空间就不再需要手动介入。

fstab每一列的含义分别是:设备文件、挂载点、文件系统类型、挂载选项、dump备份标志、fsck检查顺序。defaults是一个组合选项,包含rw、suid、dev、exec、auto、nouser、async。如果对数据一致性比较敏感,可以在defaults后面追加noatime减少访问时间戳的写入次数(尤其是机械盘场景下),这一项可以按需加。

强调一个常见误区:fstab配置生效的条件是启动时挂载,而不是立即挂载。写入fstab后不执行mount -a,当前分区仍然是未挂载状态,只有重启或mount -a才会真正挂到/disk4下。验证时记得先手动mount一次或者直接用mount -a完成挂载,再检查df结果。

4.3 当原磁盘无空间可扩:增加一块新磁盘的路径

VMware里的虚拟机可能存在另一类场景:磁盘扩展按钮可用,但宿主磁盘剩余空间紧张,或者虚拟机处于某种受限配置,此时“扩容原有磁盘”这条路走不通。替代方案是为虚拟机增加一块全新的虚拟磁盘。

在VMware主界面,选中虚拟机,从VM下拉菜单进入Settings,点击Add按钮,按向导添加一个虚拟硬盘。新磁盘会作为独立的/dev/sdb出现,后续步骤与之前完全一致:用fdisk对/dev/sdb分区,mkfs格式化,mkdir创建挂载点,mount挂载,最后将新分区写入/etc/fstab。唯一区别是分区设备号变为sdb、sdb1等,其余逻辑完全相同。

新增磁盘与扩容原磁盘有一个本质差异:原磁盘扩容是“空余空间追加到磁盘后端”,新磁盘是“新增一个硬件设备”。两种方式对Linux的后续操作路径没有区别,都走“分区→格式化→挂载→fstab”这四步。如果虚拟机上有LVM逻辑卷,新磁盘还可以直接做成物理卷并入卷组,实现更灵活的动态扩容,这是第5章会展开的进阶话题。

5. 扩容避坑:分区、格式化和挂载的三类典型翻车现场

5.1 mkfs报“找不到设备”:同一台机器上最频繁的失误

现象:mkfs.ext2 /dev/sda4执行后,系统回显“ls: cannot access /dev/sda4: No such file or directory”或者“mkfs.ext2: Unable to read superblock”,同时/dev目录下根本没有sda4这个设备。

原因:分区表修改后没有重启。fdisk的w写入了新分区表,但内核的设备映射还停留在旧状态,/dev/sda4设备节点没有被创建。旧内核版本的VMware虚拟SCSI驱动不支持在线扫描分区表变化,所以直接格式化必然失败。

解决:执行reboot重启Linux,让内核重新读取分区表并创建设备节点。重启后先ls -l检查/dev/sda4是否出现,再执行格式化。如果重启后设备节点仍然不存在,排查方向要转向分区是否真的保存成功——重新运行fdisk -l查看分区表里是否存在sda4条目。

5.2 fstab写错之后开机卡在emergency mode

现象:重启虚拟机后没有进入正常的multi-user登录界面,而是停留在类似“Give root password for maintenance”的紧急模式,系统提示有挂载失败。

原因:/etc/fstab新增的那一行看起来人畜无害,实则某个字段与实际不匹配。最常见的情况有三种:把挂载点写成不存在的目录、文件系统类型写成了实际格式化的类型之外的值、设备路径写错(比如扩容后设备号发生漂移)。尤其要注意,如果挂载点目录在fstab里引用但该目录不存在,开机挂载必然失败。

解决:在紧急模式的提示符后输入root密码进入维护模式,用vim打开/etc/fstab,检查新增行并把错误的字段修正,保存后执行reboot。fsck检查建议挂在启动流程前执行,但fstab里noauto与defaults混合使用时也可能出现异常,新手阶段默认配置即可。修正fstab后重启,系统即可正常进入。从我自己的经验来看,fstab问题是扩容流程中最容易让人慌的一环,但只要知道“维护模式改回来”这个出口,就可以放心大胆写配置。

5.3 格式化后挂载报错“wrong fs type”

现象:mount /dev/sda4 /disk4/时提示“mount: wrong fs type, bad option, bad superblock”,但mkfs命令明明执行成功且无报错。

原因:格式化与挂载时指定的文件系统类型不一致。比如mkfs.ext4格式化了分区,但mount命令手滑写成了ext2或vfat,内核查找不到对应的文件系统签名就会报bad superblock。很多时候不是分区坏了,而是mount参数打错了拼音或记混了类型。

解决:执行blkid /dev/sda4查看分区的实际文件系统类型,再使用mount -t对应的类型重新挂载。例如:

# 查看分区文件系统签名 blkid /dev/sda4 # 按实际类型直接挂载,-t参数有时可以省略 mount /dev/sda4 /disk4

blkid的输出会很明确地显示“TYPE="ext4"”字样。按这个类型来挂载,问题自然消除。另外fstab里的类型字段也必须跟这个保持一致,否则重蹈5.2的覆辙。

5.4 扩展按钮置灰,扩容无法开始

现象:VMware的Edit virtual machine settings中,Utilities下拉框里的Expand选项是灰色的,无法点击。

原因:虚拟机上存在快照,且当前没有处于活动状态的分支清理干净。VMware不允许对带快照的虚拟磁盘执行扩展,因为快照文件引用的是磁盘原始状态,扩展会破坏快照与基础磁盘之间的链接关系。另一种是磁盘设置为独立模式,会跳过快照直接写盘,同样影响扩展逻辑。

解决:先关闭虚拟机,在快照管理器中删掉所有快照(注意确认快照里的数据不再需要),然后重新打开设置界面,Expand选项恢复可点击状态。如果快照删除后仍然置灰,检查虚拟机的磁盘模式是否为Independent,如果是则切开控制器的配置改为非独立模式。这里建议把还未使用快照做备份的场景直接先“删除快照”而不是“恢复快照”,否则数据可能回滚。

5.5 重启后挂载丢失:没写fstab或写了无效设备号

现象:重启之后,df -h里看不到/disk4的存在,空间又“没了”。

原因:挂载是临时的,重启后系统不会记住mount命令建立的映射。如果fstab没有正确写入,或者写入的设备号与实际设备不匹配,就会出现空间“消失”的错觉。另外,前面的操作如果使用了/dev/sdb这类由VMM生成的设备名,重启后设备顺序可能发生变化——GPU虚拟机在硬件改动场景下比较常见,普通虚拟机以/dev/sda为主时概率较低。稳妥做法是使用UUID替代设备路径写入fstab。

解决:用blkid /dev/sda4查询该分区的UUID,然后将fstab中的设备路径改成UUID=xxx格式。这样即使设备号发生漂移,系统也能靠UUID准确找到分区。挂载状态用df -h检查,开机自动挂载用mount -a手动验证一遍,全部通过后重启确认。

6. 验证三件套与一个关键的LVM思维转换

扩容完成后,建议不要急着把数据拷进去,先用以下三组命令做一次完整验收。

第一,检查文件系统类型与挂载状态。执行df -hT来同时显示容量、已用空间、文件系统类型和挂载点。确认/dev/sda4的成绩单上Type列是ext4或ext2,Mounted on是/disk4,Use%过高或类型不对都要继续排查。这里的使用量百分比如果超过90%,说明最初规划的空间还是偏保守,下次扩容时直接把目标值翻倍会更从容。

第二,验证开机自动挂载的可靠性。在确保当前数据已安全的条件下,执行umount /disk4,然后直接运行mount -a,再执行df -h确认/disk4已经恢复挂载。如果mount -a不报错,代表fstab的配置语法与设备引用都是正确的。这一步能做的事,比直接重启省时,也能更快速地定位到fstab是否有误。

第三,写一个文件做大粒度的“压力测试”。用dd从/dev/zero写入一个2G到5G的测试文件,确认分区的真实可写能力:

# 在挂载点内写入2G容量的测试文件 dd if=/dev/zero of=/disk4/test.bin bs=1M count=2048 # 校验写入回读内容一致 md5sum /disk4/test.bin # 清理测试文件 rm -f /disk4/test.bin

这一组命令能验证的不只是“能写”,还包括整条IO链路的稳定性,包括虚拟磁盘驱动、文件系统、VMM宿主存储。如果dd中途报错或md5校验不通过,说明硬件层面的缓存或磁盘本身有问题,回到宿主机检查底层磁盘健康状态。

三组验证都通过后,备份fstab以及df输出截图/文本,作为本次扩容完成的存档记录。以后再做扩容时,直接对比这两份记录就能快速定位新变化。

关于扩容的长期维护,还有一个思维层面的建议。本次的方案是“原磁盘扩展+新建分区”的经典路线,它要求分区表手动调整。如果机器在最初安装系统时就启用了LVM,那么整个扩容流程可以大幅简化:VMware端扩展完磁盘后,进入Linux执行fdisk新建物理分区、pvcreate建物理卷、vgextend扩卷组、lvextend扩容逻辑卷,最后resize2fs让文件系统跟随变化,全程不需要新建挂载点,也不需要重写fstab。

两套方案的选择不是智商高低的问题,而是部署阶段就要做的架构决策。对长期运行的开发虚拟机,建议下一台新虚拟机创建时,系统盘直接使用LVM。日常使用不需要预知未来要挂载多少个分区,逻辑卷可以随时扩展,扩展时不用改fstab,不用重启。这次的fdisk路线虽然可用,但它是一次性的补救动作——不改变分区表结构,就总是面临空间不够再次手工处理的局面。

我一向认为,磁盘扩容这种操作看着简单,但每一环都藏着坑。写fstab的时候随手省略一个挂载点目录,第二天开机的紧急模式就是代价。从那以后,我每次在Linux上处理完分区类的变更都强制走一遍“df -h验证、mount -a验证、写入文件实测”的三步流程,一步都不跳,等确认无异常才宣布操作结束。希望这篇笔记里踩过的坑,能帮你安全度过第一次磁盘扩容的不安期,顺利把系统和数据都留在原地,只是空间更大了一点。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询