
摘要:VirtualBox 的图形界面适合偶尔用一下的场景,但开发者频繁创建、销毁、快照虚拟机时,命令行才是效率最优解。本文系统介绍 VBoxManage 的核心命令体系,覆盖虚拟机创建、资源调配、快照管理、组网互联和脚本编排,提供一套可直接落地的命令行工作流,帮助开发者将虚拟机管理从「点鼠标」升级为「跑脚本」。
VirtualBox 的图形管理器功能完整,但在以下场景中效率极低:
VirtualBox 自带一套完整的命令行工具 VBoxManage,位于安装目录下。它覆盖了图形界面中几乎全部功能,并且支持在脚本中编排调用。接下来说明它的核心用法。
VirtualBox 安装后,VBoxManage 位于以下路径(Windows 默认安装):
C:\Program Files\Oracle\VirtualBox\VBoxManage.exe建议将该路径加入系统环境变量 PATH,后续在任意终端可直接调用。
验证安装:
VBoxManage --version输出示例:7.0.12r159484。
所有 VBoxManage 命令遵循统一格式:
VBoxManage <子命令> <目标> [参数...]最基本的查询操作——列出当前所有虚拟机及 UUID:
VBoxManage list vms以创建一个 Ubuntu Server 22.04 虚拟机为例,以下命令一次性完成创建、注册、资源配置:
# 1. 创建虚拟机并注册
VBoxManage createvm --name "ubuntu-dev" --ostype Ubuntu_64 --register
# 2. 分配内存 4096MB,CPU 2核,启用硬件虚拟化
VBoxManage modifyvm "ubuntu-dev" --memory 4096 --cpus 2 --hwvirtex on --nestedpaging on
# 3. 创建虚拟硬盘(VDI格式,固定大小 40GB)
VBoxManage createhd --filename "D:\VMs\ubuntu-dev.vdi" --size 40960 --format VDI --variant Fixed
# 4. 挂载硬盘到 SATA 控制器
VBoxManage storagectl "ubuntu-dev" --name "SATA" --add sata --controller IntelAhci
VBoxManage storageattach "ubuntu-dev" --storagectl "SATA" --port 0 --device 0 --type hdd --medium "D:\VMs\ubuntu-dev.vdi"
# 5. 挂载安装ISO
VBoxManage storageattach "ubuntu-dev" --storagectl "SATA" --port 1 --device 0 --type dvddrive --medium "D:\ISOs\ubuntu-22.04-server.iso"
# 6. 配置网络(NAT + 端口转发,将宿主机2222端口映射到虚拟机22端口)
VBoxManage modifyvm "ubuntu-dev" --nic1 nat
VBoxManage modifyvm "ubuntu-dev" --natpf1 "ssh,tcp,127.0.0.1,2222,,22"
# 7. 启动虚拟机
VBoxManage startvm "ubuntu-dev" --type headless参数说明:
--variant Fixed:固定大小磁盘,性能优于动态分配,适合开发环境。--type headless:无头模式启动,不弹出虚拟机窗口,适合后台运行。--natpf1:NAT 端口转发规则,格式为 规则名,协议,宿主机IP,宿主机端口,客户机IP,客户机端口。快照是虚拟机最有价值的功能之一。VBoxManage 的快照操作比 GUI 更快、更可编排。
创建快照:
VBoxManage snapshot "ubuntu-dev" take "init-clean" --description "刚装完系统,未装任何软件"查看快照列表:
VBoxManage snapshot "ubuntu-dev" list恢复到指定快照:
VBoxManage snapshot "ubuntu-dev" restore "init-clean"删除快照:
VBoxManage snapshot "ubuntu-dev" delete "init-clean"实用场景:在测试软件安装脚本前拍一个快照,脚本跑完后无论结果如何,一条命令回滚到干净状态。将这套操作写成批处理,可以反复测试而不污染环境。
Guest Additions(增强功能包)是实现宿主机与虚拟机之间无缝交互的核心组件,提供共享剪贴板、拖放文件、自动调整分辨率等功能。在无头模式下,必须通过命令行完成安装。
挂载 Guest Additions ISO(VirtualBox 安装目录自带):
VBoxManage storageattach "ubuntu-dev" --storagectl "SATA" --port 2 --device 0 --type dvddrive --medium "C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso"在虚拟机内挂载并安装(SSH 连接后执行):
sudo mount /dev/cdrom /mnt
cd /mnt
sudo ./VBoxLinuxAdditions.run
sudo reboot安装完成后,共享文件夹的挂载命令为:
# 在宿主机创建共享文件夹
VBoxManage sharedfolder add "ubuntu-dev" --name "workspace" --hostpath "D:\projects" --automount
# 在虚拟机内访问(自动挂载路径)
ls /media/sf_workspace/注意:
--automount要求 Guest Additions 已正确安装。若虚拟机内看不到共享文件夹,执行sudo usermod -aG vboxsf $USER将当前用户加入vboxsf组后重新登录。
开发者常见的需求是用虚拟机模拟一个多层架构,验证服务之间的网络连通性。VirtualBox 的「内部网络」(intnet)模式适合搭建隔离的虚拟局域网,虚拟机之间可以直接通信,但与宿主机外部网络隔离。
场景:三台虚拟机——Nginx 反向代理(proxy-node)、后端 API(api-node)、MySQL 数据库(db-node),通过内部网络互联,模拟一个最小化的 Web 服务栈。
# 为三台虚拟机添加内部网络(nic2用作内网,nic1保留NAT访问外网)
VBoxManage modifyvm "proxy-node" --nic2 intnet --intnet2 "service-net"
VBoxManage modifyvm "api-node" --nic2 intnet --intnet2 "service-net"
VBoxManage modifyvm "db-node" --nic2 intnet --intnet2 "service-net"启动后在各自虚拟机内配置静态 IP:
10.0.0.1010.0.0.2010.0.0.30验证互通性——在 proxy-node 上 ping api-node:
ping 10.0.0.20这套拓扑中,api-node 和 db-node 不对外暴露端口(仅通过内部网络通信),proxy-node 通过 NAT 端口转发对外暴露 80 端口,模拟了真实生产环境中的网络分层。整个环境都运行在同一台物理机上,无需额外硬件。
VirtualBox 还支持 --nictype 参数指定虚拟网卡型号。对于 Linux 虚拟机,推荐使用 virtio 以获得最佳网络吞吐量:
VBoxManage modifyvm "api-node" --nictype2 virtio注意:使用 virtio 网卡需要虚拟机操作系统内核支持该驱动(主流 Linux 发行版默认包含)。
多台虚拟机同时运行时,快速获取状态信息是关键运维能力。
# 查看所有运行中的虚拟机
VBoxManage list runningvms
# 查看指定虚拟机的详细配置(内存、CPU、网卡、存储等)
VBoxManage showvminfo "ubuntu-dev" --machinereadable
# 查看虚拟机的实时统计(需 Guest Additions)
VBoxManage guestproperty enumerate "ubuntu-dev"--machinereadable 输出的是键值对格式(key="value"),可以直接被脚本解析。例如在 Bash 中提取虚拟机的内存配置:
VBoxManage showvminfo "ubuntu-dev" --machinereadable | grep "memory="当需要在另一台物理机上使用相同配置的虚拟机时,导出为 .ova 文件是最简单的方式。
导出:
VBoxManage export "ubuntu-dev" --output "D:\exports\ubuntu-dev.ova" --ovf10导入:
VBoxManage import "D:\exports\ubuntu-dev.ova" --vsys 0 --vmname "ubuntu-dev-clone" --memory 8192--vsys 0 表示第一个虚拟系统(OVA 可包含多个虚拟机),--memory 8192 在导入时覆盖原有内存配置,适应新主机的硬件。
无头模式(headless)启动的虚拟机不显示窗口,通过 SSH 远程管理,体验等同于操作一台远程 Linux 服务器。
前提:虚拟机内已安装并启动 SSH 服务(Ubuntu Server 默认包含),且 NAT 端口转发已正确配置(见第三节第6步)。
启动无头模式:
VBoxManage startvm "ubuntu-dev" --type headless宿主机通过端口转发连接:
ssh -p 2222 username@127.0.0.1关闭虚拟机(优雅关机,相当于在虚拟机内执行 shutdown):
VBoxManage controlvm "ubuntu-dev" acpipowerbutton强制关机(相当于拔电源,仅在系统无响应时使用):
VBoxManage controlvm "ubuntu-dev" poweroff常见问题排查:
VBoxManage: error: Could not find a registered machine named 'xxx':虚拟机名称不匹配,用 VBoxManage list vms 确认准确名称(区分大小写)。bcdedit /set hypervisorlaunchtype off 并重启(注意:这将禁用 WSL2 和基于 Hyper-V 的功能)。--natpf1 规则添加时虚拟机处于关机状态。若规则已存在但连接失败,检查宿主机防火墙是否放行了对应端口。VBoxManage modifyhd "D:\VMs\ubuntu-dev.vdi" --resize 81920,将虚拟磁盘容量扩至 80GB。扩容后需在虚拟机内部扩展文件系统(Linux 下用 resize2fs 或 xfs_growfs)。将上述命令组织成一个批处理脚本,即可实现「一键创建开发环境」。以下是一个 Windows 批处理示例,保存为 create-dev-vm.bat:
@echo off
set VM_NAME=dev-env
set VM_PATH=D:\VMs\%VM_NAME%
set ISO_PATH=D:\ISOs\ubuntu-22.04-server.iso
echo [1/6] Creating VM...
VBoxManage createvm --name %VM_NAME% --ostype Ubuntu_64 --register
echo [2/6] Configuring hardware...
VBoxManage modifyvm %VM_NAME% --memory 4096 --cpus 2 --hwvirtex on --nestedpaging on
VBoxManage modifyvm %VM_NAME% --nic1 nat --natpf1 "ssh,tcp,127.0.0.1,2222,,22"
echo [3/6] Creating virtual disk...
VBoxManage createhd --filename "%VM_PATH%.vdi" --size 40960 --format VDI --variant Fixed
echo [4/6] Attaching storage...
VBoxManage storagectl %VM_NAME% --name "SATA" --add sata --controller IntelAhci
VBoxManage storageattach %VM_NAME% --storagectl "SATA" --port 0 --device 0 --type hdd --medium "%VM_PATH%.vdi"
VBoxManage storageattach %VM_NAME% --storagectl "SATA" --port 1 --device 0 --type dvddrive --medium "%ISO_PATH%"
echo [5/6] Starting VM in headless mode...
VBoxManage startvm %VM_NAME% --type headless
echo [6/6] Done. Connect via: ssh -p 2222 username@127.0.0.1
pause将此脚本放在项目仓库中,团队成员拉取后配置 ISO_PATH 变量即可快速搭建一致的开发环境。
VBoxManage 的命令数量超过 200 条,本文覆盖的是开发场景中最常用的子集。完整命令参考可通过 VBoxManage --help 及 VBoxManage <子命令> --help 逐级查阅。命令行管理的核心价值在于可重复、可版本控制、可集成到自动化流水线——这正是图形界面永远做不到的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。