Vagrant 虚拟机管理速查表 - Vagrant 常用命令与配置大全

Vagrant 的价值可以归成一句话:把怎么搭环境写进 Vagrantfile,vagrant up 就能在任何人电脑上复现同样的虚拟机。生命周期命令本身并不复杂,真正要留意的是 box 版本锁定、同步目录选型、以及 Provision 脚本到底在什么时机执行——这三处是「我这台能跑你那台不能」的主要来源。这张表按虚拟机生命周期、Box 镜像管理、Vagrantfile 配置、网络与同步目录、多机器与 Provision、快照与插件分组,把生命周期命令与这些配置点放在一起。什么时候翻它:接手一个跑不起来的 Vagrantfile 要排查、要把本地环境交付给新同事、Windows 上文件监听很卡要换同步方式、或者需要多台机器同时起一套服务做联调。判断依据是改完配置后环境是否真的可重建:能 destroy 再 up 一次得到同样结果,才算这套定义成立。

系统与运维·共 40 条命令·最后更新 2026-07-21
vagrant虚拟机开发环境devops

典型使用场景

面向需要在一台笔记本上复现多台机器的完整环境、并且希望团队成员一条命令就能得到同样系统的工程师:本地跑一套 LAMP + Nginx、多台机器演练负载均衡、在 CI 里起一个带依赖服务的测试环境。Vagrant 的核心价值是把「机器」和「初始化脚本」都写进一个可 review 的 Vagrantfile,因此关键是理解它的四条状态线:虚拟机生命周期(up / halt / suspend / destroy)、box 管理(本地缓存的镜像,版本错配是故障高发区)、网络与同步目录(forwarded_port 与私有网络)、以及 provision(首次 up 与 reload 时执行,destroy 后需重跑)。最需要警惕的是 destroy:它会销毁虚拟机,但 Vagrantfile 本身不受影响,配置错误的代价是一次重新下载 box 与重新 provision。

虚拟机生命周期 9

vagrant init ubuntu/jammy64
初始化 Vagrant 项目
vagrant up
启动虚拟机
vagrant ssh
SSH 登录虚拟机
vagrant halt
关闭虚拟机
vagrant destroy
销毁虚拟机
vagrant suspend / vagrant resume
挂起 / 恢复虚拟机
vagrant reload
重启并重新加载配置
vagrant status
查看虚拟机状态
vagrant global-status
查看本机所有 Vagrant 环境

Box 镜像管理 6

vagrant box add ubuntu/jammy64
下载 Box 镜像
vagrant box list
列出已安装的 Box
vagrant box outdated
检查 Box 是否有更新
vagrant box update --box ubuntu/jammy64
更新指定 Box
vagrant box remove ubuntu/jammy64
删除 Box 镜像
vagrant box add my-box ./package.box
从本地文件添加 Box

Vagrantfile 配置 6

config.vm.box = "ubuntu/jammy64"
指定基础镜像
config.vm.hostname = "dev-server"
设置主机名
config.vm.provider "virtualbox" do |vb| vb.memory = "2048" vb.cpus = 2 end
配置虚拟机资源
config.vm.synced_folder "./src", "/var/www"
同步文件夹
config.vm.provision "shell", path: "setup.sh"
Shell 脚本 Provision
config.vm.provision "shell", inline: "apt-get update"
内联 Shell Provision

网络与同步目录 6

config.vm.network "forwarded_port", guest: 80, host: 8080
端口转发
config.vm.network "private_network", ip: "192.168.33.10"
私有网络(固定 IP)
config.vm.network "public_network"
公共网络(桥接)
config.vm.synced_folder "./src", "/var/www", type: "nfs"
NFS 类型同步(性能更好)
config.vm.synced_folder "./data", "/data", disabled: true
禁用指定同步目录
vagrant port
查看端口转发映射

多机器与 Provision 6

config.vm.define "web" do |web| web.vm.box = "ubuntu/jammy64" end
定义 web 机器
config.vm.define "db" do |db| db.vm.box = "ubuntu/jammy64" end
定义 db 机器
vagrant up web
启动指定机器
vagrant ssh web
登录指定机器
vagrant provision
重新运行 Provision 脚本
vagrant provision --provision-with shell
只运行指定类型的 Provision

快照与插件 7

vagrant snapshot save my-snapshot
保存快照
vagrant snapshot restore my-snapshot
恢复快照
vagrant snapshot list
列出所有快照
vagrant snapshot delete my-snapshot
删除快照
vagrant plugin install vagrant-vbguest
安装插件(自动更新 Guest Additions)
vagrant plugin list
列出已安装插件
vagrant package --output my-box.box
打包当前虚拟机为 Box

参数矩阵

参数作用示例
vagrant init ubuntu/jammy64在当前目录生成一份可用的 Vagrantfile,是所有后续命令的前提vagrant init ubuntu/jammy64
vagrant up创建并启动虚拟机;首次会下载 box 并执行 provision,之后每次启动都会重新跑 provisionvagrant up
vagrant ssh用 vagrant 账号登录虚拟机,省去记用户名与密码vagrant ssh
vagrant halt正常关机,磁盘与配置保留;这是「暂停一天」该用的命令vagrant halt
vagrant destroy销毁虚拟机与其磁盘;不可撤销,Vagrantfile 保留但要重新下载与 provisionvagrant destroy
vagrant suspend / vagrant resume把虚拟机内存快照落盘后挂起,恢复时状态与挂起前完全一致,比 halt 更快但占磁盘vagrant suspend
vagrant reload重启虚拟机并重新执行 provision,是「改了 provision 脚本」后的标准动作vagrant reload
vagrant status查看当前项目下每台机器的状态(running / poweroff / not created)vagrant status
vagrant global-status列出目录下所有项目的虚拟机状态,解决「我是不是在别的目录操作」的困惑vagrant global-status
vagrant box add ubuntu/jammy64把 box 下载到本地缓存,之后其它项目用同一个 box 就不用再下vagrant box add ubuntu/jammy64
vagrant box list列出本地已缓存的 box 与版本,能解释为什么版本对不上vagrant box list
vagrant box outdated检查已装 box 是否有新版本,是升级前的标准检查vagrant box outdated
vagrant box remove ubuntu/jammy64移除本地缓存的 box;报错时先确认没有虚拟机仍在使用它vagrant box remove ubuntu/jammy64
config.vm.box指定使用哪个 box;版本锁定写在这里,改它需要 destroy 后重建才生效config.vm.box = "ubuntu/jammy64"
config.vm.hostname设置虚拟机内主机名,排障时用于确认连的是哪台config.vm.hostname = "dev-server"
vb.memory / vb.cpus在 provider 块里调整内存与 CPU;改后必须 reload 才生效config.vm.provider "virtualbox" do |vb| vb.memory = "2048" vb.cpus = 2 end
config.vm.synced_folder "./src", "/var/www"把宿主机目录挂进虚拟机;默认类型是 VirtualBox 共享文件夹,性能差时改 nfsconfig.vm.synced_folder "./src", "/var/www"
type: "nfs"同步目录改用 NFS,在 Linux 宿主机上性能明显好于共享文件夹config.vm.synced_folder "./src", "/var/www", type: "nfs"
disabled: true默认不挂载该目录,需要时再用 vagrant up --enable-... 打开config.vm.synced_folder "./data", "/data", disabled: true
config.vm.provision "shell", path: "setup.sh"引用外部脚本做初始化,脚本逻辑复杂时比 inline 更可维护config.vm.provision "shell", path: "setup.sh"
config.vm.provision "shell", inline: "apt-get update"直接内联一段命令,适合一两行的轻量初始化config.vm.provision "shell", inline: "apt-get update"
forwarded_port把宿主机端口映射到虚拟机端口,是本地访问容器内服务的标准做法config.vm.network "forwarded_port", guest: 80, host: 8080
private_network, ip: "192.168.33.10"私有网络固定 IP,多机互相访问与文档化地址都依赖它config.vm.network "private_network", ip: "192.168.33.10"
vagrant port查映射端口的实际分配值;自动分配或被占用时会与配置不同vagrant port
config.vm.define "web" / "db"定义多台机器,之后可以只操作其中一台config.vm.define "web" do |web| web.vm.box = "ubuntu/jammy64" end
vagrant up web只启动具名的那一台,多机项目里避免全部拉起来vagrant up web
vagrant ssh web登录指定机器;多机项目里不加名字会登错vagrant ssh web
vagrant provision不重启直接重跑 provision 脚本,是改完 setup.sh 后的正确做法vagrant provision
vagrant provision --provision-with shell只跑 shell 类 provision,跳过 chef/puppet 等其它 provisionervagrant provision --provision-with shell
vagrant snapshot save / restore / list / delete快照是比 box 更细粒度的回滚点,装完依赖后存一个能省大量重装时间vagrant snapshot save my-snapshot
vagrant plugin install安装 Vagrant 插件;provider 支持(virtualbox / libvirt)也靠插件提供vagrant plugin install vagrant-vbguest
vagrant plugin list确认已装插件,排查 provider 不可用时先看这里vagrant plugin list
vagrant package --output my-box.box把当前虚拟机打包成 box 供团队复用,等于团队的自定义基础镜像vagrant package --output my-box.box

易错点与避坑指南

现象vagrant up 报找不到 box,或用的 box 版本与预期不符。

原因Vagrantfile 里写的是浮动版本或短名,本地缓存的却是另一个版本,两者不匹配。

处置用 vagrant box list 看本地实际版本,再把 Vagrantfile 锁到该精确版本;需要时先 vagrant box add 补齐。

现象vagrant destroy 后再 vagrant up,耗时极长且装好的东西全没了。

原因destroy 销毁的是虚拟机磁盘,provision 的一切都不保留,只有 Vagrantfile 还在。

处置在装完依赖后执行 vagrant snapshot save my-snapshot,日后用 vagrant snapshot restore 回滚,而不是重装。

现象改了 setup.sh 里的命令,重新 vagrant up 却没有生效。

原因up 只是启动已存在的机器,provision 脚本内容不会因文件变化而自动重跑(即使重跑也依赖脚本自身幂等)。

处置改完脚本执行 vagrant provision 或 vagrant reload;并让脚本自身可重复执行(用 apt 的 state=present 思路而非裸安装)。

现象宿主机能 ping 通私有 IP,但虚拟机里连不上对方。

原因配置了 private_network 却没指定 ip 时地址不确定;宿主机防火墙与 Vagrant 允许的网段也可能不一致。

处置为每台机器固定 ip,并确认宿主机防火墙放行了 192.168.33.0/24。

现象同步目录在虚拟机里是空的,或者性能极卡。

原因宿主机路径写错、路径含中文/空格导致挂载失败;默认的共享文件夹在部分场景下 I/O 非常慢。

处置在虚拟机里 mount 检查挂载是否真的成功;Linux 宿主机上把 type 改成 "nfs"。

现象端口映射后宿主机访问不通,报 connection refused。

原因服务只监听了 127.0.0.1 而不是 0.0.0.0,端口转发进来的连接因此被拒;或端口已被占用。

处置让服务监听 0.0.0.0,并用 vagrant port 核对实际分配到的宿主端口。

现象vagrant box remove 报 box 仍在使用中。

原因有虚拟机仍在以该 box 创建,Vagrant 拒绝删除正在被引用的 box。

处置先 vagrant status 确认相关项目,把对应虚拟机 destroy 掉再移除 box。

现象多机项目里 vagrant ssh 总是登进同一台,停错了机器。

原因未指定机器名时 Vagrant 使用 Vagrantfile 里第一个 define 的机器。

处置始终显式写机器名(vagrant ssh web),并用 vagrant status 核对每台的当前状态。

排障路径

  1. 1看当前目录下每台机器的状态

    vagrant status

    区分 not created / poweroff / running,再决定该 up 还是 reload。

  2. 2看所有项目的机器状态

    vagrant global-status

    怀疑自己在别的目录操作时用它定位。

  3. 3核对本地缓存的 box 与版本

    vagrant box list

    版本错配是启动失败的第一嫌疑。

  4. 4检查是否有 box 可升级

    vagrant box outdated

    升级前先备份好 Vagrantfile 与 provision 脚本。

  5. 5确认已装插件与 provider 支持

    vagrant plugin list

    provider 不可用时先确认插件是否装上。

  6. 6查端口实际分配值

    vagrant port

    与 Vagrantfile 里写的 host 端口不一致时,说明发生了自动改分配。

命令示例

起一台带端口转发的开发机

vagrant init ubuntu/jammy64 vagrant box add ubuntu/jammy64 vagrant up vagrant port vagrant ssh

vagrant init 只写 Vagrantfile,不会下载镜像,所以必须单独 vagrant box add;Vagrantfile 里已经配了 provider 的同步目录时 add 会自动完成,但保险起见先 add 再 up。vagrant port 用来确认转发映射的真实结果,别假设配置里写了 8080 就一定是 8080——端口被占用时 VirtualBox 会自动往后顺延。

输出

==> web: 80 (guest) => 8080 (host)
==> default: Running (virtualbox)

Provision 是幂等入口,调试时反复重跑

vagrant provision vagrant provision --provision-with shell vagrant reload

改完 setup.sh 后不需要 destroy 再 up,用 vagrant provision 重跑脚本即可,省掉几分钟的重建时间。写 shell provision 时要自己处理幂等(apt-get update 每次都跑、无条件的 >> append 会把配置写重复),因为 Vagrant 只保证执行一次,不保证脚本本身可重复执行。

破坏性操作前先存快照

vagrant status vagrant snapshot save my-snapshot vagrant snapshot list vagrant snapshot restore my-snapshot

destroy 之前存一个快照,出问题时的恢复路径是 vagrant snapshot restore my-snapshot,而不是从零 vagrant init + up 再重跑所有 provision。快照存在 .vagrant 目录里,记得确认它没被 .gitignore 之外的清理脚本删掉——快照文件是可以随项目目录一起复制的。

多机器:define 定义,up 指定启动

vagrant status vagrant up web vagrant ssh web vagrant global-status

两个 config.vm.define 块存在同一个 Vagrantfile 里,vagrant up 不带名字会把所有机器都拉起来,内存和端口都会翻倍。日常只调试 web 时始终显式写 vagrant up web。vagrant global-status 能看到本机所有项目里各虚拟机的状态,是「这台机器明明 up 了但连不上」的第一排查点。

输出

==> web: machine => web
==> db: machine => db

禁用默认同步目录换成固定 IP 直连

config.vm.synced_folder "./data", "/data", disabled: true config.vm.network "private_network", ip: "192.168.33.10" vagrant reload

虚拟化 provider 的共享文件夹在 IO 密集构建下比宿主机原生速度慢很多,常见做法是 disabled: true 关掉默认 /vagrant 同步,改用 private_network 固定 IP,让宿主机直接读写虚拟机里的目录。改完必须 vagrant reload 才会重建网络配置。

常见坑与注意事项

  • vagrant destroy 不可撤销:虚拟磁盘、已 provision 的配置、装在里面的数据库和密钥全部消失。如果 Vagrantfile 里有 config.vm.synced_folder 的默认挂载,宿主机源码还在;但装在虚拟机内的 apt 包、数据库文件、手工创建的用户会一起没。destroy 前必须 vagrant snapshot save 或先 vagrant package --output backup.box 留一份。
  • vagrant halt 只是关机(状态为 poweroff),vagrant destroy 是删除。两者都「让机器不见了」,但 halt 可以 vagrant up 重新启动且数据还在,destroy 之后只能重新 provision。团队里有人把 halt 说成「关掉」时,要确认对方是否真的会执行 destroy。
  • Vagrantfile 里的 synced_folder 默认把宿主机整个项目目录以读写方式挂进虚拟机。虚拟机里运行的任何代码(含依赖里的 postinstall 脚本、Makefile)都能改写宿主机源码。共享给不受信任的环境或运行陌生项目时,先想清楚这个挂载方向。
  • 端口转发映射的宿主机端口被占用时不会报错,而是自动顺延到下一个可用端口,vagrant up 照样成功。CI 脚本里硬编码 http://localhost:8080 就会连到别的东西上或直接连不上。端口映射一律用 vagrant port 读取实际值,不要从 Vagrantfile 里硬编码。
  • vagrant box remove 删除的是全局 box 缓存(默认在 ~/.vagrant.d/boxes)。删掉团队公用镜像后,本地每台机器下次 vagrant up 都要重新下载几百 MB 到几 GB,离线环境直接卡死。删 box 前先用 vagrant box list 确认名字并和同事打招呼。
  • vagrant package 打包的是当前虚拟机的完整快照,包含里面的所有数据、token、.env 文件和 SSH 私钥(VirtualBox 无人值守时会在机器内生成 authorized_keys)。生成的 .box 文件不要传到公开位置或提交进 Git,发布前至少删掉敏感数据。

提示

  • vagrant up 首次运行会自动下载 Box 镜像,后续启动很快。
  • Vagrantfile 是 Ruby 语法,但只需要基础配置即可使用。
  • vagrant plugin install vagrant-vbguest 可以自动更新 VirtualBox Guest Additions。
  • vagrant snapshot save/restore 可以快速保存和恢复虚拟机状态。
  • NFS 同步目录比默认的 VirtualBox 共享文件夹性能更好,适合大项目。
  • vagrant package 可以将配置好的虚拟机打包成 Box,方便团队共享。
  • 在 Vagrantfile 里写 config.vm.box = "name:version" 锁定 box 版本,否则上游更新后同事 up 出来的环境可能和你不同。
  • provision 的 "once" 只在首次 up 执行,改了 provisioning 脚本要 vagrant provision --provision-with 单独重跑。
  • Windows 上默认共享文件夹在大量小文件项目里极慢,换 synced_folder type "rsync" 需 VirtualBox 4.0 以上并配合 vagrant-vbguest。

常见问题

Vagrant 虚拟机装完新依赖后想重来一遍,用 reload 还是 destroy?

优先 vagrant reload:它重启虚拟机并重新加载 Vagrantfile,但保留磁盘上的数据。若 Vagrantfile 里的 provision 脚本要重跑,用 vagrant provision;只想执行某一类 provision 加 --provision-with shell。vagrant suspend / resume 是挂起与恢复,速度最快,适合合上笔记本再回来。vagrant destroy 会销毁虚拟机、丢掉全部改动,只在确定要推倒重来时才用;日常只想看状态则用 vagrant status,用 vagrant global-status 一次看清本机所有环境。

为什么装好的虚拟机比基础镜像快那么多,代价是什么?

因为首次 vagrant up 会下载 Box 镜像并执行一次完整 provision(脚本装依赖、初始化等),之后每次启动直接复用磁盘上的既有状态,通常几秒就绪。代价是「首次很慢」和「本地脏」:模板改动后必须手动 reload 或重跑 provision 才生效。开发中反复重建代价太高时,可以用 vagrant snapshot save my-snapshot 存一个干净基线,之后 vagrant snapshot restore my-snapshot 一键回到那个状态;vagrant snapshot list 查看已有快照,delete 掉不用的。

本地开发要起多个服务(web、db),Vagrantfile 怎么写?

用 config.vm.define 给每台机器命名:config.vm.define "web" do |web| web.vm.box = "ubuntu/jammy64" end,config.vm.define "db" do |db| db.vm.box = "ubuntu/jammy64" end。之后 vagrant up web 只启动指定的机器,vagrant ssh web 登录对应实例,不带参数则全部启动。跨机访问靠网络配置:config.vm.network "forwarded_port", guest: 80, host: 8080 把 guest 端口映射到宿主机,vagrant port 可以查当前映射;需要固定 IP 互访用 config.vm.network "private_network", ip: "192.168.33.10"。

共享文件夹里装依赖特别慢,换成 NFS 有何讲究?

默认的 VirtualBox 共享文件夹在小文件密集的场景(npm install、pip install)性能很差。改成 config.vm.synced_folder "./src", "/var/www", type: "nfs" 走 NFS,速度通常明显改善。共享范围用 config.vm.synced_folder "./data", "/data", disabled: true 逐条禁用,不要把大目录都挂进去。目录与内存/资源一起在 config.vm.provider "virtualbox" do |vb| 里调:vb.memory = "2048"、vb.cpus = 2,装依赖前先确认资源给够。还可以 vagrant plugin install vagrant-vbguest 让 Guest Additions 自动更新。

怎么把调好环境的虚拟机分发给团队,而不是让每人重装一遍?

用 vagrant package --output my-box.box 把当前虚拟机打包成 Box,同事再执行 vagrant box add my-box ./package.box 就能从本地文件安装并用它初始化项目。分发前先清理 Box 镜像本身:vagrant box list 看已装了哪些,vagrant box outdated 检查有没有更新,vagrant box update --box ubuntu/jammy64 升级指定镜像,vagrant box remove 删除用不到的。保留 Vagrantfile 和 provision 脚本进版本库,打包产物只作为环境快照,二者配合才能保证别人拿到的是同一套环境。

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。

由 巧匠 维护

公开更新于 2026年7月21日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们