先交代一下我是怎么入坑的:有段时间我在帮团队搭一套本地开发测试环境,天天手工装系统、配环境、打快照,来回折腾得人崩溃。后来换了 Vagrant 加 VirtualBox 这套组合,几个命令就能把一套完整的 Linux 环境从零拉起来,配置文件一分享,同事那边直接跑同样的命令,环境一丁点儿都不带差的。这个组合解决的就是虚拟机管理最烦的那几件事:环境难复现、目录共享麻烦、重复劳动太多。这篇教程我尽量写得细一点,从版本选择到实际敲命令,把能踩的坑都给你标出来,适合刚接触虚拟化、想快速上手 Vagrant 和 VirtualBox 的同学。
1. 为什么是 Vagrant 加 VirtualBox:这套组合到底解决了什么问题
1.1 一句话讲清两个工具的分工
很多新手第一次接触这个组合,容易把两者搞混。Vagrant 是一个命令行工具,它不负责运行虚拟机本身,负责的是“调度”和“自动化”。VirtualBox 才是真正干活的虚拟机引擎,你的 CPU、内存、硬盘资源是它在分配,虚拟机的图形窗口也是它弹出来的。
打个比方:VirtualBox 是一台电视机,Vagrant 是遥控器。你可以手动走到电视机跟前按按钮(打开 VirtualBox 图形界面创建虚拟机),但这样效率低,也没法批量操作。有了遥控器,你躺在沙发上就能开关机、换台、调音量(用 vagrant up、vagrant halt、vagrant ssh 管理虚拟机)。而且 Vagrant 还能把“换到哪个台、音量调多大”这些配置写成一个脚本文件,下次想再看同样的内容,直接跑脚本就行。
这里的核心配置文件就是 Vagrantfile。它用 Ruby 语法写,但你完全不用会 Ruby,照着模板改几行参数就能用。Vagrantfile 里定义了用哪个镜像、分配多少内存、开几个 CPU、要不要端口转发、要不要私有网络,所有这些都写在一个纯文本文件里。这个文件可以提交到 Git,团队里任何人拉下来执行 vagrant up,得到的虚拟机环境是几乎一致的。
1.2 这套方案最值钱的两个特性
第一个是环境即代码。以前搭一套开发环境,要在文档里写十几步手工操作:下载系统镜像、创建虚拟机、配置网络、装依赖包……每一步都可能因为人为操作差异而出错。Vagrant 把这一整套流程压缩成了几条命令加一个 Vagrantfile。我团队里有个新同事入职,之前完全没用过 Linux,我让他照着 Vagrantfile 跑 vagrant up,二十分钟后他就进到了一个配置好的 Ubuntu 环境里,中间只问了我一句“vagrant ssh 是不是应该在项目目录下执行”。这种一致性是手工装虚拟机给不了的。
第二个是目录同步。Vagrant 默认会把项目目录(也就是 Vagrantfile 所在目录)同步到虚拟机里的 /vagrant 路径下。这意味着你可以在宿主机上用自己习惯的编辑器写代码,保存之后虚拟机里立刻就能看到,运行结果直接在虚拟机的终端里输出。做开发的同学应该都知道,以前在虚拟机里开发最痛苦的就是文件来回拷,Vagrant 把这个痛点直接解决了。
1.3 和 Docker、VMware 比,为什么还要选 VirtualBox
现在聊虚拟化,绕不开 Docker。但 Docker 和 Vagrant 解决的其实不是同一层问题:Docker 是进程级隔离,共享宿主机内核;VirtualBox 是完整的硬件虚拟化,跑的是完整的客户机操作系统。如果你要测试不同内核版本、要加载内核模块、要折腾 systemd 或者网卡驱动,Docker 是不行的,必须上完整虚拟机。
Vagrant 当然也能管 VirtualBox 之外的 Provider,比如 VMware、Hyper-V,甚至还有 Docker Provider。但 VirtualBox 是默认支持最好、最容易获取的,而且开源免费。VMware Workstation 功能确实强,但商业授权不便宜,对个人学习来说成本偏高。Hyper-V 在 Windows 上是系统自带的,但配置起来比较麻烦,和某些需要嵌套虚拟化的场景兼容性也不如 VirtualBox 直接。
这里顺带说明一个常见的应用场景:network simulator(比如有些网络设备模拟软件)跑在比自己电脑更干净、更可控的虚拟化环境里,VirtualBox 往往是指定依赖。这也是为什么很多人搜 VirtualBox 安装往往是为了装这些网络模拟平台。后面我会在错误排查部分详细讲一个我和这种场景死磕过的教训。
2. 安装前先定版本:VirtualBox 选哪个版本最省心
2.1 版本选择的坑:为什么满网都在搜 5.2.44
你可能在搜索引擎里看到过大量关于 VirtualBox 5.2.44 的下载帖子和问题讨论。5.2.44 是 5.2 系列最后一个维护版本,发布于 2019 年年中。这个版本号至今还有很高搜索量,核心原因就是兼容性:有一部分网络设备模拟软件、老版本虚拟机镜像,绑定的是 VirtualBox 5.2.x 时代的接口,用新版本反而跑不起来。
这就有一个很实际的问题:到底装新版还是装老版?我的建议是分情况。如果你是跑现代 Linux 发行版、做日常开发测试环境,直接上官网最新的稳定版,比如 6.1 或者 7.x 系列,性能和功能都好很多,新系统对虚拟化指令集的支持也更完整。如果你明确知道自己要用某个依赖 VirtualBox 5.2 的软件,而且做过匹配验证,那就老老实实装 5.2.44,别折腾。装新版再想办法降级兼容,往往不如直接一步到位装旧版来得省事。
顺便提一句,网上有人做“免安装版”“绿色版”VirtualBox。我个人不建议碰这种东西。VirtualBox 涉及内核驱动、服务注册、USB 驱动等系统级组件,免安装版很容易缺驱动或者服务状态不对,出了问题你根本没法排查。老老实实从官方渠道下载安装包,永远是最稳的路。
2.2 从官网下载的正确姿势
VirtualBox 官网就是 virtualbox.org,下载页面里会根据当前系统自动推荐对应安装包。Windows 用户下载 .exe,Linux 用户选择对应发行版的包(也有通用的 .run 脚本)。这里要提醒一件事:尽量不要从第三方下载站拉安装包。
我在实际中遇到过不止一次,第三方站点放的安装包是旧版,或者捆绑了额外软件,甚至有人下载到的安装包根本没法在 64 位系统上正确安装 VirtualBox 的驱动。
下载完成之后,建议顺手校一下 SHA256 校验和。官网下载页面每个文件旁边都有对应的 checksum,Windows 上在 PowerShell 里执行:
Get-FileHash .\VirtualBox-*.exe -Algorithm SHA256Linux 上执行:
sha256sum VirtualBox-*.run把输出的哈希值和官网对照,一致再安装。这一步花不了十秒钟,但能挡掉很多因为下载文件损坏导致的离奇报错。
2.3 扩展包(Extension Pack)到底装不装
VirtualBox 安装包本身只提供最基本的虚拟化能力,很多实用功能其实在扩展包里:USB 2.0/3.0 控制器、RDP 远程桌面、NVMe 存储控制器、Host 键绑定等。如果你只是装个 Linux 跑命令,不装扩展包也能用。但只要涉及 USB 设备透传(比如让虚拟机识别 U 盘、打印机),就必须装扩展包。
扩展包有两个容易踩的坑:第一,版本必须和 VirtualBox 主程序严格一致。比如你装的是 6.1.40,扩展包也必须是 6.1.40,差一个小版本号都不行。第二,扩展包的许可证是 PUEL,个人使用免费,但商用要留意授权条款。下载路径也在官网同一页面,文件名类似 Oracle_VirtualBox_Extension_Pack-6.1.40.vbox-extpack,安装时直接双击或者执行:
VBoxManage extpack install Oracle_VirtualBox_Extension_Pack-6.1.40.vbox-extpack安装后可以执行 VBoxManage list extpacks 验证扩展包是否加载成功。
3. 保姆级的实际安装流程
3.1 Windows 下安装 VirtualBox 完整步骤
我先以 Windows 为例走一遍完整流程,Linux 用户后面单独补充差异部分。
第一步,双击下载好的安装包,进入安装向导。VirtualBox 的安装向导默认会装四类组件:VirtualBox 主程序、USB 驱动、网络驱动、Python 绑定。一般不需要动默认项,直接下一步就好。
第二步,选择安装位置。这里有个很容易被忽略的点:VirtualBox 默认的虚拟机存储目录在 C 盘用户目录下。如果你 C 盘剩余空间不多,建议在安装过程中或者安装完成后,把全局的虚拟机默认位置改到其他盘。具体操作是:打开 VirtualBox 后,菜单“管理-全局设定-常规”,把“默认虚拟机文件夹”改到 D 盘之类的大分区。这个坑我踩过,C 盘被几个虚拟机镜像撑爆之后,清理起来特别难受。
第三步,安装过程中 Windows 会弹出“是否允许安装设备软件”的提示,这是 VirtualBox 在安装虚拟网卡和 USB 驱动,务必点“安装”。如果这里点了拒绝,后面创建虚拟机时会发现网络类型里没有任何选项可选。
第四步,安装完成后打开 VirtualBox,如果宿主机的用户账户控制(UAC)设置比较严格,最好右键以管理员身份运行。不过日常使用其实不需要管理员权限,只有创建虚拟网卡这类操作会临时需要。
Linux 用户安装稍有不同。Debian/Ubuntu 系可以直接:
sudo apt update && sudo apt install virtualboxCentOS/RHEL 系的官方源里也有 virtualbox,但版本往往偏旧。想装比较新的版本,官方提供了对应发行版的仓库配置方案,建议参照官网说明操作。
还有一个很多人在搜的问题:“linux 版本 virtualbox 的安装”。主要区别在于 Linux 宿主机安装 VirtualBox 后需要编译内核模块,系统更新了内核之后模块可能失效。这个问题我在下一节错误排查里详细展开。
3.2 安装 Vagrant 并做好基本配置
Vagrant 的安装相对简单。Windows 用户从 vagrantup.com 下载对应安装包,装完在“命令提示符”或者 PowerShell 里执行:
vagrant --version如果提示“vagrant 不是内部或外部命令”,多半是安装完成后没有新开一个终端窗口,PATH 环境变量还没刷新。
Linux 用户可以用包管理器直接装:
sudo apt install vagrant发行版自带的 Vagrant 版本可能比较旧,但我个人建议优先用官方安装包,因为 Vagrant 和 VirtualBox 之间通过插件通信,新版本 VirtualBox 对旧版 Vagrant 的兼容性不一定好。
Vagrant 本身没有图形界面,纯命令行操作。装完之后不用额外配置就能用,但如果你的网络环境下载镜像很慢,可以配置国内镜像源加速。方法很简单,设置环境变量 VAGRANT_SERVER_URL 指向镜像服务地址。常见做法是把这个环境变量写进系统环境变量,Windows 用户在“系统属性-环境变量”里加,Linux 用户在 ~/.bashrc 里写:
export VAGRANT_SERVER_URL="https://mirrors.example.com/vagrant"这样后续 vagrant init 时拉取 box 镜像会快很多。设置完记得 source ~/.bashrc 或者新开终端。
3.3 用 Vagrant 拉取第一个虚拟机:init 和 up 的完整过程
找一个新的空目录,比如 C:\vagrant-demo,进入这个目录,然后执行:
vagrant init hashicorp/bionic64这条命令的作用是在当前目录生成一个默认的 Vagrantfile。你可以用记事本打开看看内容,里面全是注释和示例配置。如果你要指定镜像,把镜像名换成对应的 box 名称就行,比如 ubuntu/focal64、centos/7,这些是 Vagrant 官方镜像仓库里的公共镜像。
接下来是重头戏:
vagrant up第一次执行这条命令时,Vagrant 会先从配置好的镜像源下载 box 文件,然后调用 VirtualBox 创建虚拟机并开机。整个过程会打印很多日志,第一次跑的同学看到大段输出不要慌,这是正常的。看到类似下面的内容就表示成功了:
==> default: Machine booted and ready! ==> default: Mounting shared folders... default: /vagrant => C:/vagrant-demo如果中途卡住或者报错,最常见的原因有两个:一是 box 镜像没下载完或损坏,二是宿主机的 CPU 虚拟化没有开启。CPU 虚拟化的问题一般出现在老电脑或者某些虚拟化嵌套环境里,需要在 BIOS 里打开 VT-x/AMD-V,或者在宿主机虚拟机设置里勾选“向客户机系统传递硬件虚拟化”。
启动之后,用:
vagrant ssh就能直接进到虚拟机里的终端。注意,默认通过密钥免密登录,不需要手动输入密码。如果你想用传统的账号密码方式登录,默认用户名是 vagrant,密码是 vagrant,root 账户默认密码一般也是 vagrant,但不推荐直接用 root,需要用 sudo 时直接执行 sudo 就行。
3.4 日常使用频率最高的几个命令
Vagrant 的日常操作命令非常少,核心就六个:
- vagrant up:启动虚拟机。如果虚拟机不存在会先创建。
- vagrant ssh:登录虚拟机。
- vagrant halt:关闭虚拟机,相当于正常关机。
- vagrant suspend:挂起虚拟机,休眠到内存或磁盘,启动比 halt 快。
- vagrant reload:重启虚拟机,改了 Vagrantfile 之后需要执行这个让配置生效。
- vagrant destroy:销毁虚拟机,把创建出来的所有资源全部删除。
这里特别提醒:改了 Vagrantfile 之后一定记得执行 vagrant reload,我见过很多人改了内存配置然后直接 vagrant ssh,发现内存没变,其实就是配置还没生效。执行 reload 之后再进虚拟机,用 free -h 看一下,内存就是新值了。
还有两个实用的查询命令:
vagrant box list vagrant status前者看本地已经拉取过哪些 box 镜像,后者看当前项目里的虚拟机状态。有了这几个命令,日常管理基本就够用了。
4. 高频错误排查实录:踩过的坑都给你列出来
4.1 kernel driver not installed (rc=-1908) 的完整解法
这个问题在搜索量里常年名列前茅,报错信息通常长这样:
Kernel driver not installed (rc=-1908) The VirtualBox Linux kernel driver is either not loaded or not set up correctly.核心意思是 VirtualBox 的内核模块没有加载。Linux 宿主机上特别常见,尤其是系统内核自动更新之后,旧的 vboxdrv 模块和当前内核版本对不上,VirtualBox 就起不来了。
解决思路分三步。第一步,尝试重新编译加载模块:
sudo /sbin/vboxconfig如果这条命令报错,说明编译环境缺依赖。Debian/Ubuntu 系需要先装:
sudo apt install linux-headers-$(uname -r) build-essential然后在 VirtualBox 的安装包里找到对应脚本重新执行。第二步,手动加载模块:
sudo modprobe vboxdrv再验证一下:
lsmod | grep vbox看到 vboxdrv、vboxnetadp、vboxnetflt 这些模块就算加载成功了。第三步,如果以上都不行,最简单粗暴但有效的方式是重装一遍和当前系统匹配的 VirtualBox,或者彻底卸载后重启系统再安装。
Windows 宿主机上如果出现这个错误,一般就是驱动被安全软件拦截了。到“设备管理器-查看-显示隐藏的设备”,找到系统设备里的 VirtualBox 相关驱动,手动卸载,再重新安装一遍 VirtualBox,安装时务必以管理员身份运行。安装完建议重启一次系统,让驱动完成初始化。
4.2 E_FAIL 0x80004005 这类通用错误的排除思路
报错长这样:“VirtualBox error: Failed to open a session for the virtual machine ... E_FAIL (0x80004005)”。
E_FAIL 是 COM 组件返回的通用错误,就好比医生告诉你“你病了”,但具体是感冒还是阑尾炎,得进一步检查。这类错误在 VirtualBox 里出现过很多种原因,我按概率排序讲我见过的:
概率最高的是虚拟机配置文件损坏。每个虚拟机文件夹里有一个 .vbox 文件,记录虚拟机的硬件配置。如果 VirtualBox 崩溃或者手动改了配置文件导致 XML 格式错误,打开虚拟机就会报 E_FAIL。解决方法是先备份被损坏的 .vbox 文件,然后新建一个同名虚拟机,把原来虚拟机的虚拟磁盘(.vdi 文件)挂载进去。注意数据都在这块 .vdi 里,配置文件丢了不可怕,磁盘文件在就行。
概率其次的原因是存储路径有问题。虚拟机所在路径包含中文、空格、特殊字符,或者所在目录被同步软件(比如网盘)同步,都可能导致 VirtualBox 无法正常访问文件。解决办法是把虚拟机目录迁移到纯英文路径下,并设置同步软件忽略该目录。
还有一个 Windows 特有的原因:系统开启了 Hyper-V 或者内核隔离(内存完整性)。Win10/11 默认的内存完整性和虚拟化安全会占用 Hyper-V 虚拟化层,和 VirtualBox 的 VT-x 使用产生冲突。解决方法是把“核心隔离-内存完整性”关掉,或者在“启用或关闭 Windows 功能”里取消 Hyper-V。改完重启系统。如果你确实需要 Hyper-V,那就别用 VirtualBox,直接用 Hyper-V 就好,两条路不要同时走。
4.3 Ubuntu 宿主机 USB 设备识别不了,怎么办
“ubuntu virtualbox usb 识别问题”也是搜索热词之一。现象是:宿主机插上 U 盘,在 VirtualBox 设置里把 USB 设备添加给虚拟机,但虚拟机系统里 lsusb 看不到设备。
这个问题九成是用户权限问题。VirtualBox 的 USB 透传需要宿主机终端用户属于 vboxusers 用户组,否则没有权限访问 /dev/usb 下的设备节点。把当前用户加进组:
sudo usermod -aG vboxusers $USER改完要重新登录或者干脆重启,让用户组生效。然后再试。
另外检查一下扩展包有没有装。没有 Extension Pack 的 VirtualBox 只支持 USB 1.1 控制器,很多相对新的设备根本不识别。装了扩展包之后,虚拟机设置-USB 里才能选 USB 2.0 或 USB 3.0 控制器。如果扩展包版本和 VirtualBox 版本不一致,设备列表会显示异常甚至直接报错。
4.4 兼容性专题:ENS、老系统、特殊硬件的一个血泪教训
我在前文提到过的那个和网络模拟器死磕的经历,值得展开讲一讲。有次我需要跑某个华为网络模拟平台,安装时提示依赖 VirtualBox。我以为装最新版 VirtualBox 就行,结果平台一启动虚拟机就报错,反复重装了好几次都没解决。最后查资料才知道,这个平台早期版本绑定的是 VirtualBox 5.2 的 Python API,新版改了接口,兼容性就断了。唯一的解法就是安装它明确要求的 5.2.44 版本,然后把 VirtualBox 的自动更新关掉。这个案例非常典型:工具装最新版不一定好,兼容性永远是第一位。
另外,如果你在比较老的 Windows 系统,或者某些深度定制的 Linux 发行版上装 VirtualBox,注意安装程序可能会提示“无法在此设备上加载驱动程序”。这种情况多半是系统启用了 Secure Boot,而 VirtualBox 的驱动没有正确签名。解决方案:进入 BIOS 暂时关闭 Secure Boot,或者把 VirtualBox 添加到系统的 MOK(Machine Owner Key)管理里。关闭 Secure Boot 会影响系统安全启动校验,改完之后记得保持系统其他防护措施正常开启。
4.5 虚拟打印机和 Windows Server 场景
搜索词里还有一个高频场景:虚拟机和打印机的关系,以及 Oracle VirtualBox 里装 Windows Server 2019。这两件事可以一起说。
如果你要在虚拟机里访问打印机,有两条路。第一条是 USB 直连:把打印机的 USB 线插在宿主机,然后在 VirtualBox 的 USB 设备列表里把打印机透传给虚拟机。前提是装好扩展包,并且打印机驱动在虚拟机系统里也装一遍。第二条是网络打印:如果打印机支持网络协议(现在大多数多功能打印机都支持),直接在虚拟机系统里通过 IP 添加网络打印机,这个方法其实更省事,完全绕开了 USB 透传的兼容性问题。很多打印机 USB 直连之后在虚拟机里出现“设备已识别但打印不出来”的情况,换成 IP 网络打印之后问题立刻消失。
至于 Windows Server 2019 的安装,VirtualBox 的支持整体上是很成熟的。注意两点:安装的时候建议给虚拟机分配至少 4GB 内存和双核 CPU,不然 Server 系统安装过程会非常卡;另外 Windows Server 默认启用防火墙,装完系统后第一件事先把远程桌面相关的防火墙规则放行,不然宿主机没法通过 RDP 连进去操作。
5. 进阶玩法:显卡、批量管理、目录传输的高阶配置
5.1 关于显卡直通,给大家泼盆冷水
经常有人在搜“vagrant + virtualbox 显卡直通”。这里要说点直话:VirtualBox 在显卡虚拟化这块一直不是强项。它支持 3D 加速,但性能和兼容性都比较有限;至于把宿主机的物理显卡完整直通给虚拟机,VirtualBox 的支持度很差,这个方向官方文档里都不推荐。
如果你的真实需求是虚拟机里跑 OpenGL 应用、深度学习推理、或者做桌面虚拟化,VirtualBox 大概率会让你失望。建议直接考虑 KVM/QEMU 方案,或者在 Windows 上用 VMware Workstation,显卡虚拟化比 VirtualBox 好用得多。另一个替代思路是用宿主机直接跑这些重图形任务,虚拟机只做开发和测试,图形负载隔离开来。方向走对比折腾工具省力得多。
5.2 用 Vagrantfile 批量管理多台机器
Vagrant 真正拉开差距的能力在于编排多台机器。比如你搭一个三节点的集群,在一个 Vagrantfile 里可以定义三台机器,并给它们分配不同的角色。一个简单的例子:
Vagrant.configure("2") do |config| config.vm.box = "ubuntu/focal64" ["node1", "node2", "node3"].each_with_index do |name, i| config.vm.define name do |node| node.vm.hostname = name node.vm.network "private_network", ip: "192.168.56.#{10 + i}" node.vm.provider "virtualbox" do |vb| vb.memory = "1024" vb.cpus = 1 end end end end然后在项目目录执行 vagrant up,Vagrant 会依次创建三台虚拟机,IP 从 192.168.56.10 到 192.168.56.12。之后你可以分别 vagrant ssh node1、vagrant ssh node2 登录。要销毁全部机器就执行 vagrant destroy -f,整个环境一颗螺丝钉都不用手动收拾。对做实验、测集群、学习分布式系统的朋友来说,这个模式价值非常大。
5.3 目录同步的三种方法,以及如何做双向传输
默认情况下,宿主机项目目录会映射到虚拟机的 /vagrant 目录,这是第一种目录共享方式,也是我最推荐的:简单、无感知、不需要额外配置。
第二种是在 VirtualBox 图形界面的“共享文件夹”设置里手动添加目录。这种方式可以指定任意路径,但在虚拟机里需要手动挂载。第三种是 Vagrantfile 里配置:
config.vm.synced_folder "D:/host_data", "/guest_data"这条配置把宿主机 D 盘下的 host_data 目录挂到虚拟机的 /guest_data。注意如果 VirtualBox 的增强功能没有正确安装,synced_folder 的速度会很慢,这时候到虚拟机里把增强功能重新装一遍就好。
很多人搜“virtualbox 怎么双向传输”,其实被这个概念绕进去了。虚拟机和宿主机之间真正高效的共享不是“传输”,而是共用一个目录。你用 /vagrant 目录,文件天然双向可见,不需要复制粘贴。剪贴板共享和拖拽共享在 VirtualBox 的“设备-共享粘贴板”菜单里可以直接开启,但要先装好增强功能,否则菜单是灰的。
5.4 部署后的日常维护小技巧
环境搭好只是开始,长期维护同样有学问。我的习惯是每完成一个阶段性的配置,就给虚拟机打一个快照。Vagrant 本身也有快照功能:
vagrant snapshot save baseline # 保存当前状态 vagrant snapshot list # 查看快照列表 vagrant snapshot restore baseline # 恢复某个快照这个功能尤其适合在系统测试前给自己留一条退路。我自己经常在跑一些破坏性实验之前执行 vagrant snapshot save,实验做完发现环境被搞乱了,直接 vagrant snapshot restore 恢复,比重新 vagrant up 快得不是一星半点。
另一个维护要点是镜像目录的空间管理。box 镜像和虚拟磁盘都占着实际硬盘空间,时间一长很容易塞满磁盘。建议定期用 vagrant box list 看看本地有哪些镜像,不用的用 vagrant box remove 删掉。虚拟机的 .vdi 磁盘文件如果不再用,直接删那个虚拟机目录就行。C 盘空间紧张的同学,可以注意把全局默认虚拟机位置和 box 缓存目录都改到大分区,具体路径在 VirtualBox 全局设定里看得到。
最后再分享一个实用小技巧:初始使用的 box 镜像版本,建议在 Vagrantfile 里锁定到具体版本号,不要用 latest。比如:
config.vm.box_version = "1.0.4"否则哪天镜像仓库更新了新版本,你执行 vagrant up,拉下来的虚拟机环境和之前完全不同,排查环境差异的时候会怀疑人生。锁定版本之后,配合上面的快照流程,整个环境生命周期都是可控的。这套流程我用了很久,直到现在团队里新同事入职,我发给他的第一个教程还是 Vagrant 加 VirtualBox 的基础操作,因为它经受住了太多开发环境复现场景的考验。