打包前须确保虚拟机处于 poweroff 状态,推荐用 vagrant halt 关机;--base 参数值需严格匹配 vboxmanage list vms 输出的引号内名称;禁用 --vagrantfile,仅打包系统与软件;导入后需在 vagrantfile 中显式配置 ssh 用户名、密码及禁用密钥校验。

确认虚拟机已关机且名称正确
打包前必须确保目标虚拟机处于 poweroff 状态,否则 vagrant package 会失败或导出不完整镜像。运行 vagrant halt 是最稳妥的方式,不要依赖 GUI 关机或直接在 VirtualBox 中关机——Vagrant 可能无法感知状态变化。
虚拟机名称不是项目目录名,也不是 Vagrantfile 中的 box 名,而是 VirtualBox 内部注册的唯一标识。需用以下命令查准:
vboxmanage list vms
输出类似 "myproject_default_1623456789012_34567" {a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8},取引号内的字符串(如 myproject_default_1623456789012_34567)作为 --base 参数值。Windows 下若提示 vboxmanage 找不到,请进入 VirtualBox 安装目录(如 C:\Program Files\Oracle\VirtualBox\)再执行。
执行 vagrant package 时不加 --vagrantfile
绝大多数人误以为要打包进自定义配置,于是加 --vagrantfile Vagrantfile。这是错的:Box 镜像只应包含系统、软件和基础环境;端口映射、共享目录、内存/CPU 设置等全部属于项目级配置,必须由本地 Vagrantfile 控制。强行打包进去会导致新环境无法灵活调整,甚至覆盖用户实际需求。
正确命令是:
vagrant package --base "myproject_default_1623456789012_34567" --output dev-env-202609.box
-
--base值必须与vboxmanage list vms输出完全一致(含下划线和数字) -
--output路径建议用相对路径,避免空格和中文;文件名带版本或日期便于管理 - 不要加
--vagrantfile,也不要在打包后手动改 Box 内置的_Vagrantfile
导入新环境时必须手动补全 SSH 认证配置
自己打包的 Box 通常不带 vagrant 用户的私钥认证机制,vagrant up 会卡在 SSH 连接环节,报错类似:
default: Warning: Connection timeout. Retrying...
这不是网络问题,而是 Box 里没配好 SSH 登录方式。必须在新项目的 Vagrantfile 中显式指定账号密码,并禁用密钥校验:
config.ssh.username = "vagrant"<br>config.ssh.password = "vagrant"<br>config.ssh.insert_key = false
这三行要加在 config.vm.box = "..." 之后、end 之前。如果 Box 里 root 密码被改过,或创建了其他用户,则需同步更新这几行内容。别指望 vagrant box add 自动处理认证逻辑——它只管注册镜像,不改行为。
box add 后 init 时别用 vagrant init centos/7 这类官方名
导入自己的 Box 后,执行 vagrant box add my-dev-box dev-env-202609.box,这时 Box 别名是 my-dev-box。后续初始化必须用这个别名:
vagrant init my-dev-box
如果误写成 vagrant init centos/7 或 vagrant init ubuntu/bionic64,Vagrantfile 会默认拉取官方镜像,你刚导入的 Box 就彻底被绕过了。验证方法很简单:执行 vagrant box list 确认别名存在,再打开生成的 Vagrantfile,检查 config.vm.box 的值是否与 vagrant box list 输出一致。
另外,首次 vagrant up 前,建议先删掉旧的 .vagrant 目录,避免残留状态干扰新 Box 启动。











