☰
VirtualBox虚拟机加盘与磁盘扩容实战:从图形界面到命令行
2026/9/29 7:29:08 网站建设 项目流程

1. 先搞清楚:加盘、扩盘、直通盘,到底选哪个

VirtualBox 用久了,最先撞上的墙就是磁盘空间告急。我自己的经历很典型:系统盘分了 40G,装完系统装完开发环境就剩不到 10G,再放几个镜像、拖几个数据集,虚拟机直接亮红灯。这时候脑子里冒出来的第一个念头就是“给虚拟机添加磁盘”。但这句话看着简单,实际操作前必须先想明白一件事:你要的是“新加一块盘”,还是“把原来的盘变大”?这两个操作在 VirtualBox 里的实现路径完全不同,搞混了非常麻烦。

新加一块盘,本质上是给虚拟机多接一个存储设备,相当于物理机上插了一块新硬盘。原来的盘不动,新增的盘可以作为数据盘、备份盘或者专门放日志的位置。这个方案的好处是风险极低,不影响原有系统,也不涉及分区调整,任何时候都能操作,而且是“加”就立即生效的,只要虚拟机系统里做了相应的初始化和挂载。坏处也很明显,它不会解决系统盘满的问题——如果你的 C 盘、根分区已经满了,新加的盘只能缓解未来的存储压力,当前满盘的困境还得靠清理或者扩展解决。

扩展原有盘,则是直接把虚拟磁盘文件撑大。比如原来建的动态盘是 40G,现在改成 100G,直接在 VirtualBox 里把上限调大。这个操作的难点不在 VirtualBox 本身,而是改完之后分区表不会自动扩展,需要你进到客户机里用分区工具处理。Windows 下磁盘管理能直接扩展卷,但前提是这个分区和未分配空间是连续的;Linux 下要么用 fdisk 删了重建分区(有风险),要么用 GParted 这种图形工具去调整。我见过不少人卡在这一步,以为在 VirtualBox 里把盘调大了就完事,结果进系统一看分区还是原样,以为失败,其实只是没做后半段。

另外还有一种情况是直通物理磁盘。VirtualBox 允许把宿主机上的真实硬盘直接挂给虚拟机,绕过虚拟磁盘的封装。这么做性能更好,但对操作要求极高,尤其是选盘的时候认错盘符,可能把宿主机系统盘弄崩。我个人的建议是,普通用户不要碰这个功能,除非你明确知道自己在做什么,并且有完整的备份方案。虚拟磁盘虽然性能有一定损耗,但胜在安全、灵活、可移植,这才是日常用的正道。

所以这篇内容的主线很清晰:优先推荐“新增磁盘”的方式,因为它简单、可逆、出错不影响原系统。我会把图形界面和命令行两种操作都写明白,然后把“加完盘之后在虚拟机系统里怎么让这块盘真正能用”这个最容易踩坑的环节,单独拆开来讲,最后补充扩展原有磁盘的方法和常见问题的排查思路。

2. 图形界面快速实操:VirtualBox Manager 里加一块新硬盘

2.1 打开存储设置,找到你的硬盘控制器

很多人第一次操作,进入设置界面就两眼一抹黑。其实路径非常固定:选中目标虚拟机,点击“设置”,在弹出的对话框里切到“存储”选项卡。你会看到一个类似硬件的树形列表,最上面是存储控制器,默认通常是“IDE”或者“SATA”,下面挂着已经连接的存储设备,包括你的虚拟硬盘和光驱。

这里先解释一个概念:控制器类型决定了虚拟机的使用方式和界面名称。老版本 VirtualBox 默认用 IDE 控制器,新版本基本都是 SATA。SATA 控制器支持多个端口,你可以同时挂多块硬盘,这在添加新盘时没有任何障碍。重点来了:添加磁盘之前不需要关虚拟机,但改配置过程中最好不要有写入操作,稳妥起见我一直建议关机再改,这也是 VirtualBox 官方推荐的做法。改完配置开机再分区格式化,跟物理机加硬盘的逻辑完全一致。

点击“控制器:SATA”这一行,右侧会出现一个“添加虚拟硬盘”的图标,形状是一个磁盘上加了个加号。点它,就会弹出选择磁盘文件的窗口。注意,这个窗口默认给你两个选项:第一是选一个已有的虚拟硬盘文件(.vdi、.vmdk、.vhd 等),第二是点“创建”按钮新建一块盘。如果你手上没有现成的磁盘文件,就走“创建”这个入口。

2.2 创建磁盘文件的几个关键选择,参数到底该怎么定

点“创建”之后会进入“创建虚拟硬盘”向导,这里有几个决定性的选项,很多人都是在这里埋下坑的。

第一个是磁盘文件类型。VirtualBox 原生格式是 VDI,VMware 的格式是 VMDK,微软的虚拟硬盘格式是 VHD。如果你不打算把这块盘搬到别的虚拟机软件里跑,直接选 VDI 就好,兼容性和性能都是最优的。选 VMDK 的唯一理由是你可能想迁移到 VMware,但 VirtualBox 官方其实提供了格式转换工具,没必要为了“未来可能迁移”牺牲当下体验。这是我自己反复比较之后得出的结论,实际测试中 VDI 和 VMDK 的性能差异很小,真正的区别在于快照处理和管理性,VDI 在 VirtualBox 里更顺手。

第二个是动态分配和固定大小的选择。动态分配的意思是磁盘文件按需增长,比如你设置了 100G 上限,但实际只写了 20G 数据,那么磁盘文件大小就可能只有几 G;固定大小则是一开始就占满设定容量,性能上稍有优势。我强烈建议选动态分配。原因是日常使用中,90% 的场景都用不到满容量,动态分配能大幅节省宿主机磁盘空间。另外,动态分配的盘后续可以扩展大小,而固定大小的盘想扩展会麻烦很多。关于这个“扩展”的操作,后文会专门讲。

第三个是磁盘容量和位置。容量设置要看需求,不过有一点值得提醒:虚拟磁盘文件不要放在 C 盘默认目录。VirtualBox 默认把虚拟机文件放在用户目录下的 VirtualBox VMs 文件夹里,系统盘本来就吃紧,再叠加大容量 DSik 文件只会雪上加霜。我在实际项目中会把磁盘文件专门放到一个数据分区或者独立硬盘上,比如 D:\VirtualBox\ 或者 /home/xxx/VirtualBox/。路径里尽量不要出现中文和空格,某些老版本解析路径偶尔会出问题,纯英文路径能少很多麻烦。

创建完成后回到“存储”界面,你会看到控制器下多了一个新的虚拟硬盘。这时候还要注意一个细节:端口号。默认会分配到空闲的端口,比如前面有 sata0、sata1,新盘可能就是 sata2。端口号本身不影响使用,但如果你的虚拟机有特殊启动要求,要确认启动顺序里没把新盘排在系统盘前面。设置完成后点“确定”保存配置,硬件层面的“插盘”动作就完成了。

3. 命令行进阶:用 VBoxManage 创建和挂载虚拟磁盘

3.1 为什么推荐学命令行操作

图形界面操作直观,但如果你需要批量管理多台虚拟机,或者想写脚本自动化创建机器,VBoxManage 就派上用场了。我早期处理实验环境时,一晚上要创建七八台虚拟机,全是靠一行命令搞定,效率完全不一样。而且命令行能实现一些图形界面不好操作的事情——比如精确控制磁盘的 UUID、把磁盘挂载到指定端口、修改盘的模式,这些在图形界面里做容易出现误操作。

VirtualBox 安装之后,VBoxManage 会跟着一起装上。Windows 下它位于 VirtualBox 安装目录下,Linux 下一般直接在你 PATH 里。Windows 下使用前建议先把安装目录加进环境变量,否则每次都要输全路径,非常累人。

打开终端,先执行一条命令查看当前虚拟机列表,确认虚拟机名称。注意,虚拟机名称必须写得和 VirtualBox 管理器里显示的一模一样,包括空格和大小写:

VBoxManage list vms

这条命令会把宿主机上所有虚拟机都列出来,每行前面是名称,后面是大括号括起来的 UUID。记住你将要操作的那台虚拟机的准确名称,下面的步骤都靠它定位。

3.2 创建磁盘和挂载磁盘的完整命令拆解

创建一块新虚拟磁盘,用 createhd 子命令:

VBoxManage createhd --filename /data/virtualbox/disks/backup01.vdi --size 20480 --variant Standard

这里简单拆解一下参数含义。--filename 指定磁盘文件保存位置和名称,--size 指定容量,单位是 MB,20480 就是 20G。--variant 指定磁盘类型,Standard 表示标准动态扩容类型。如果想让磁盘定长占满空间,可以改成 Fixed,但正如前面所说,日常建议 Standard。

创建完之后磁盘还是“游离”的,需要把它挂载到虚拟机上,这一步用 storageattach 子命令:

VBoxManage storageattach "manage01" --storagectl "SATA" --port 2 --device 0 --type hdd --medium /data/virtualbox/disks/backup01.vdi

再解释一下每个参数。Storagectl 的名字必须跟你虚拟机的存储控制器名称一致,这个可以用 VBoxManage showvminfo 虚拟机名 来查看,我实测下来很多人的控制器名不是默认的“SATA”,可能是“SATA Controller”,写错就直接报错。--port 指定端口号,必须选一个没被占用的,--device 固定写 0 就行。--type hdd 表示挂载的是硬盘设备,光驱设备是 dvddrive,不要搞混。--medium 后面跟的就是磁盘文件的完整路径。

这条命令执行成功后没有任何输出,这是正常的。你可以再用 showvminfo 验证一下:

VBoxManage showvminfo "manage01" | grep "SATA"

你会看到 SATA 控制器下面多了一行关于 backup01.vdi 的记录,说明挂载成功。如果需要卸载磁盘,把 --medium 改成 none 再执行一次 storageattach 即可,其他参数保持一致。

3.3 命令行操作里的细节和坑

命令行操作最大的问题就是报错不直观,很多新手遇到报错就懵了。我碰到的几个常见问题,在这里直接说清楚。

一个是提示“Cannot register the hard disk ... because a hard disk ... already exists”。这是因为你之前创建过同名磁盘文件,VirtualBox 的注册表里已经有一条相同 UUID 的记录。最简单的解决办法是用 --uuid 参数重新指定一个新 UUID,或者在创建时用不同文件名避免冲突。你还可以用 VBoxManage closemedium 来注销旧的磁盘记录,但要注意,这条命令不会删除磁盘文件本身,只是让它“脱管”。

另一个常见报错是存储控制器名称不匹配。VBoxManage 对控制器名称要求完全精确,复制自 showvminfo 的输出是最保险的做法。另外,Windows 下执行 VBoxManage 若提示不是内部或外部命令,八成是环境变量没配好,直接在安装目录下执行 cd "C:\Program Files\Oracle\VirtualBox" 再运行命令就行。

还有一点要强调:命令行添加磁盘必须保证虚拟机处于关机状态。虽然 VirtualBox 在某些场景下支持热插拔,但这依赖客户机的驱动和总线类型,SATA 默认并不是所有系统都支持热插拔,稳妥起见别冒险。我早期实验时图省事,在虚拟机运行中执行 storageattach,结果虚拟机蓝屏崩溃,教训惨痛。

4. 加了盘不等于能使用:客户机内的分区、格式化与挂载

4.1 Windows 客户机:磁盘管理和扩展卷

很多人以为在 VirtualBox 里把盘加进去就万事大吉了,开机看到新磁盘才开始懵:“怎么我的电脑里啥都没多?”这就好比物理机上你给电脑插了一块新硬盘,系统不会自动格式化,你需要去“磁盘管理”里初始化、分区、格式化、分配盘符。虚拟机里的 Windows 完全遵循同样的逻辑。

进入 Windows 虚拟机,右键点击“此电脑”,选择“管理”,在左边找到“存储 – 磁盘管理”。此时系统会弹出“初始化磁盘”的向导,如果你加的磁盘容量超过 2T,初始化时要注意选 GPT 分区表,否则只能识别出 2T 的空间;小于 2T 的盘用 MBR 就行,兼容性更好。初始化完成后,你会看到磁盘 1 显示“未分配”,这就是你新加的盘。

接下来右键点击未分配空间,选择“新建简单卷”,按照向导设置卷大小,分配盘符,选择文件系统。日常存数据 NTFS 就够了,exFAT 更适合需要灵活挂载的场景,但在虚拟机里几乎没有这个需求。格式化完成后,打开“此电脑”就能看到新盘符,到这个程度,一块新盘才算真正到位。

我在这个环节踩过的一个小坑是:新建简单卷向导里,卷大小默认是全部分配空间,但如果我计划以后在这块盘上再做其他分区,就需要手动调小第一个卷的大小。很多教程不会讲这一步,结果就是整块盘成了一个区,后面想拆分还得删卷,麻烦得很。建议在向导里就把规划想好,比如 20G 的盘,先建 15G 给数据盘,剩下 5G 以后放专门的数据库备份。

4.2 Linux 客户机:fdisk 分区到挂载的完整示例

Linux 下加盘之后的操作更为关键,因为没有任何图形化向导帮你做初始化,所有动作都得靠命令行。我自己用的 CentOS 和 Ubuntu 都会遇到这个过程,这里用一个最小完整示例来说明。

先查看系统中是否识别到新盘:

lsblk

你会看到类似 sda、sdb 这样的设备名。sda 是原来的系统盘,sdb 通常就是新加的盘,大小与你设置的一致。如果 lsblk 里没看到新盘,多半是前面 VirtualBox 挂载步骤没做对,回头检查配置。

确认设备名后,开始分区。我一般用 fdisk,虽然它是老一代工具,但胜在稳定,任何发行版都有:

sudo fdisk /dev/sdb

进入交互界面后,按 n 创建新分区,p 选择主分区,然后回车默认接受起始扇区,再次回车让分区占满整块盘,最后按 w 写入分区表退出。写入成功后,你再用 lsblk 会看到 sdb1 这个分区。如果分区表没刷出来,可以执行 partprobe /dev/sdb 或者重启虚拟机。

接下来是格式化。这里要注意文件系统的选择:ext4 是 Linux 老牌文件系统,稳定,支持广泛,适合大多数场景;xfs 性能好,是大文件读写和高并发的选择;如果你需要 Windows 和 Linux 双系统共享数据,用 exFAT 或 NTFS。我日常用 ext4,只有在跑高负载数据库时才会用 xfs:

sudo mkfs.ext4 /dev/sdb1

格式化完成后,创建一个挂载点并把分区挂上去:

sudo mkdir /data sudo mount /dev/sdb1 /data

到这里只是临时挂载,重启后会失效。要实现开机自动挂载,需要把分区信息写进 /etc/fstab。获取分区的 UUID 用下面命令:

sudo blkid /dev/sdb1

然后编辑 /etc/fstab,在文件末尾加一行:

UUID=你的UUID号 /data ext4 defaults 0 2

保存后执行 mount -a 验证配置是否有误,没有报错就说明开机挂载没问题。这一步是新手最容易忽略的,我见过很多人每次重启都要去手动 mount,非常低效。

4.3 不同操作系统的挂载方式对比

Windows 和 Linux 的做法差异很明显,而且每种系统的挂载参数还不一样。我把常见的一些系统选项放在一起对比,方便你对照自己的环境操作:

客户机操作系统分区工具文件系统挂载方式
Windows磁盘管理NTFS / exFAT右键分配盘符,自动挂载
CentOS / RHELfdisk / partedxfs / ext4mount 临时挂载,/etc/fstab 永久挂载
Ubuntu / Debianfdisk / gdiskext4 / xfsmount 临时挂载,/etc/fstab 永久挂载
macOS磁盘工具APFS / HFS+图形化挂载,或 diskutil

macOS 跑 VirtualBox 的场景相对少,但逻辑是一样的:加了盘进系统后用“磁盘工具”做格式化,然后就能在访达里看到新卷宗。如果你在 macOS 上选了 exFAT 格式,Windows 虚拟机也能直接读写,这是跨系统共享虚拟数据的一种实用方案。

5. 从源头解决空间焦虑:扩展已有虚拟磁盘的正确姿势

5.1 VirtualBox 里的 resize 操作

新增磁盘适合增加整体存储容量,但如果系统盘本身已经满了,纯粹加盘解决不了眼前的问题。这时候就应该走扩展路线,把原来的虚拟磁盘文件容量调大。

扩展的唯一前提是磁盘文件类型必须是 VDI 且为动态分配。如果你是固定大小或者 VMDK 格式,需要先转换格式再扩展。转换命令是 VBoxManage clonemedium,可以把固定大小的盘克隆成动态盘,也可以把 VMDK 转换成 VDI,这个过程本身不会破坏数据,但建议操作前做好备份。

扩展操作的命令很简单:

VBoxManage modifymedium "/路径/你的虚拟机磁盘.vdi" --resize 51200

--resize 的单位是 MB,51200 就是扩大到 50G。指定的是目标大小,不是“再增加多少”。执行完成后,VirtualBox 层面看到的盘已经变成 50G,但在客户机内部你看到的还是原来分区,因为分区表不会自己改。

还有一个细节很多人不知道:如果你有快照,modifymedium 可能会失败。VirtualBox 在存在快照时不允许直接修改磁盘,需要你先删除所有快照,或者用新快照合并之后再做 resize。我在一开始建虚拟机时通常会主动关闭自动快照,因为实验环境的快照意义不大,反而总在关键时刻碍手碍脚。

5.2 客户机内部的扩容思路:Windows 和 Linux 各有讲究

磁盘改大之后,Windows 客户机的操作相对简单。打开磁盘管理,右键点击操作系统所在分区,选择“扩展卷”,按向导操作即可。但这里有个限制条件:未分配空间必须在系统盘的右侧且紧挨着系统盘。虚拟磁盘扩容后,新增的空间位于整个磁盘的末尾,正好紧跟系统盘右侧,所以顺序是对的。唯一要注意的就是系统盘必须是 GPT 或 MBR 引导都支持的基本磁盘,如果转成了动态磁盘,扩展卷会受限。

Linux 客户机则复杂得多。根分区是物理分区的话,你需要用重启进入 Live 环境或使用 GParted 图形工具来移动分区和扩展分区,这一步在网上有大量失败案例,核心风险在于调整分区表时断电或者操作错误导致系统无法引导。我个人的建议是,如果 Linux 根分区满了,别走扩展的路,直接加一块新盘挂到某个目录,然后把大目录迁移过去,比如把 /home、/var 或者 /opt 迁移到新盘。这种方式比动根分区安全得多。

如果你是 LVM 布局,情况会好很多。LVM 的逻辑卷可以跨物理卷,扩展步骤如下:新盘建成物理卷,加入卷组,分配空间给逻辑卷。整套流程不用重启,也几乎不会影响系统运行。这也是为什么我现在创建 Linux 虚拟机,一律用 LVM 而不是传统的分区方案,空间管理灵活太多。

6. 常见问题与排查技巧实录

6.1 “加完盘启动报错”与启动项问题

加了新盘之后,有的虚拟机会在启动时报错,或者直接进入不了系统。最常见的原因是启动顺序发生了变化。VirtualBox 的启动顺序一般默认是“软驱 – 光驱 – 硬盘”,硬盘里如果挂了很多块,它会按端口顺序找。你把新盘插到了端口前面,系统可能会尝试从新盘启动,而新盘没有引导记录,自然起不来。

解决办法要么是在设置里把启动顺序固定为“系统盘优先”,要么把新盘挂载到端口号比较大的位置。图形界面操作时,可以在设置里面拖动端口顺序;命令行操作时,给新盘分配一个靠后的端口号就行。我习惯把系统盘挂在 SATA 0,光驱在 SATA 1,所有新加的盘从 SATA 2 开始排,基本不会再遇到启动错乱的问题。

6.2 “无法注册磁盘”与 UUID 冲突

在命令行创建磁盘时,如果复制过别人的虚拟机目录或者从别处拷贝了 .vdi 文件,最常见的一个报错是 UUID 冲突。VirtualBox 不允许两个相同 UUID 的磁盘同时注册,即使你把他们放在不同目录里。

解决方法是用 VBoxManage internalcommands sethduuid 给磁盘文件重新生成一个 UUID:

VBoxManage internalcommands sethduuid /path/to/your.vdi

这个命令只是修改磁盘文件的元数据,不会影响里面的数据。执行完再挂载,问题基本就解决了。如果是图形界面添加磁盘时遇到“无法注册”,也可以用同样的思路处理。

6.3 “内核驱动未安装”和 VirtualBox 版本问题

这个报错在我的使用史里出现过不止一次,典型提示是“Kernel driver not installed (rc=-1908)”。它跟加不加磁盘没有直接关系,但恰好在你频繁调整虚拟机配置的时候容易出现,尤其是宿主机内核升级后,VirtualBox 内核模块没有跟着重新编译。

Linux 宿主机上,最常见的原因是 vboxdrv 模块没有加载。处理思路是重新安装对应的内核模块,例如在 Debian/Ubuntu 系执行 /etc/init.d/vboxdrv setup,或使用 dkms 重新编译模块。如果你用的是较老的 VirtualBox 5.2.x,碰到新内核时这个问题尤其高频,换到新版本 VirtualBox 会好很多。Windows 宿主机上类似的问题则通常和驱动签名或者旧版本不兼容有关,升级版本、重装扩展包都是可尝试的方向。

从我个人的经验看,这类问题最好的对策是:保持 VirtualBox 主程序和扩展包版本一致。版本号对不上,很容易出现各种灵异现象,不只是驱动报错,还包括 USB 设备识别异常、网络模式异常等。VirtualBox 的版本更新频率不高,定期升一下级,稳定性能提升一大截。

6.4 磁盘文件巨大,宿主机空间告急

这个问题的根源是动态分配盘并没有在删除文件后自动“收缩”。你在虚拟机里删了 10G 数据,宿主机上的 .vdi 文件大小可能纹丝不动,因为它只是把那些块标记为空闲,并没有真正释放给宿主机。

要收缩磁盘,需要先做零填充,再执行磁盘压缩。Windows 虚拟机里可以用 sdelete 工具,Linux 虚拟机里可以直接写零到文件,然后删除该文件:

dd if=/dev/zero of=/tmp/zero bs=1M rm /tmp/zero

然后关机,在宿主机上执行:

VBoxManage modifymedium compact /path/to/disk.vdi

这条命令会把空闲空间回收,宿主机磁盘文件会明显变小。这个操作在转移或备份虚拟机目录前尤其实用,能省下不少存储空间和传输时间。

7. 终版建议:我一直沿用的一套“加盘”流程图

说再多理论,最后还是要落在能直接照做的流程上。我自己的习惯是,每次需要调整虚拟机磁盘,都按下面这个顺序走:

第一,备份。不管你打算做什么操作,先把虚拟机的 .vdi 文件复制一份出来。VirtualBox 磁盘文件不像数据库有事务机制,操作中断很可能损坏磁盘,备份是唯一保险。

第二,确认类型和容量。用 VBoxManage showvminfo 查看当前磁盘类型、端口号和已分配容量,做到心里有数。决定是加块盘还是扩原有盘,别到了操作中途再改主意。

第三,选好操作方式。图形界面适合偶尔改成配置的情况,命令行适合批量操作和脚本化。新手建议先用图形界面走通流程,再尝试命令行,两条路都能达到目的。

第四,完成硬件层面的操作后,不要急着关机。进系统先执行分区、格式化、挂载或扩展卷的步骤,确认数据可写可读,再考虑重启验证。

第五,所有操作完成后,再做一次检查:lsblk 或磁盘管理里能看到正确大小,能正常读写文件,重启后配置依然生效。

说句实在话,给虚拟机加磁盘本身不算复杂,但很多人栽在各种边角细节上——端口不对、控制器名写错、客户机没格式化、快照挡住了 resize。把这些坑都避开之后,整个流程也就是几分钟的事情。VirtualBox 作为免费虚拟化工具,在个人开发、测试环境里依然非常能打,学会正确地管理虚拟磁盘,你的虚拟机才能真正成为可靠的实验场地。

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

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

立即咨询