ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Vagrant多虚拟机环境搭建实战:CentOS 8与Ubuntu踩坑全记录

Vagrant多虚拟机环境搭建实战:CentOS 8与Ubuntu踩坑全记录 这阵子接了个跨版本兼容性测试的活儿需要在本地同时维护 CentOS 8、Ubuntu 22.04 和 Ubuntu 24.04 三套虚拟机环境。一开始我想得很简单不就是三台虚拟机嘛VirtualBox 一台台建、系统一个个装半天应该搞定。结果真的动起手来才发现手动装系统的效率实在太低了——每台机器光是选择镜像、分区、配置网络、装完 SSH、再调整资源限制一整套流程下来半小时就没了三台机器就是小半天而且过段时间环境被我搞坏了还得重新再装一轮。后来我改用 Vagrant 统一管理这三台虚拟机环境通过一份 Vagrantfile 代码化声明执行一条 vagrant up 就能把三台机器全部拉起来配置和软件栈统一管理、随时销毁重建。这个转变确实解决了很多痛点但过程中也踩了不少坑——CentOS 8 生命周期结束导致的 yum 源失效、Ubuntu 24.04 的镜像下载缓慢、SSH 远程连接超时、网络模式选错导致各虚拟机之间无法互通等等每一个问题都让我花了不少时间去排查。这篇记录就把我这几天的经验写下来把遇到的问题、排查的过程、最终的解决方案都整理出来希望能帮到准备用 Vagrant 搭多虚拟机环境的同学尤其是跟我一样需要同时管理 CentOS 8 和多个 Ubuntu 版本的人。1. 环境规划与工具选型1.1 为什么我在 2024 年还在用 Vagrant很多人觉得 Vagrant 是上个时代的玩具现在有 Docker 谁还用虚拟机。这话对一半Docker 解决的是应用层的一致性它共享宿主机内核跑不了另一个内核版本、另一个 init 系统、另一套内核模块。我这边要验证的是不同操作系统版本上的安装脚本、服务配置和兼容性行为必须用真正的虚拟机。Vagrant 最大的价值不是启动一台虚拟机而是把虚拟机的整个生命周期变成代码。手工装系统你需要记住这个机器当时分区是怎么分的那个机器的网卡是怎么配的哪些包是我后来手动装的时间一长全忘光。Vagrant 则是通过一份 Vagrantfile 把所有关键参数固定下来用哪个镜像、多大内存、几个 CPU、什么网络、要跑哪些初始化脚本全部写在明面上。环境坏了不用修直接 vagrant destroy vagrant up几分钟拉回一个干净环境。我的场景比较典型项目上需要同时验证 CentOS 8、Ubuntu 22.04、Ubuntu 24.04 三个平台的兼容性。三个系统在包管理器、systemd 服务文件、网络配置工具上差异很大代码得分别跑、分别调。如果每次都用 VirtualBox 手动建光是切换上下文就够呛。提示如果你只需要一个干净的 Linux 跑命令优先考虑 Docker如果必须要完整的操作系统级隔离或者测试跨内核版本行为再上 Vagrant。两个工具不是替代关系。1.2 三台虚拟机的硬件与网络规划在写代码之前先把需求捋清楚三台虚拟机各跑什么、需要多少资源、彼此之间以及和宿主机之间怎么通信。虚拟机名操作系统镜像BoxCPU内存磁盘用途centos8CentOS 8.5generic/centos82核2G25G老版本兼容测试、遗留服务部署ubuntu22Ubuntu 22.04.4ubuntu/jammy642核2G25GLTS 主力开发与测试环境ubuntu24Ubuntu 24.04.1ubuntu/noble642核2G25G新内核、新工具链验证宿主机我是一台 Windows 笔记本16G 内存。三台虚拟机各分配 2G剩余 10G 留给宿主机跑 IDE、浏览器和 Docker Desktop压力不算小但日常操作还能扛住。如果你只有 8G 内存建议把每台虚拟机的内存压到 1G或者一次只启动两台。磁盘方面Vagrant 默认创建的是 10G~25G 动态分配的 VDI 虚拟磁盘实际占用的物理空间按需增长不用一开始就预留巨大空间。不过要留意 VirtualBox 的动态分配特性磁盘文件会随着使用越涨越大即使你在虚拟机里删了文件宿主机上的 .vdi 文件也不会自动缩回去。想回收空间得在虚拟机内做 fstrim 或 zero-free 后用 VBoxManage modifymedium 压缩。1.3 各软件版本与插件安装版本问题在第一台机器启动时就教训过我Vagrant 和 VirtualBox 的版本如果差距太大Vagrant 会直接报Vagrant reported an error with VirtualBox version之类的错误。我这边最后确定的版本组合是VirtualBox 7.0.18Vagrant 2.4.1vagrant-vbguest 插件安装 vagrant-vbguest 几乎是必须的尤其要挂载同步目录时。它能在虚拟机启动后自动安装/更新 VirtualBox Guest Additions否则 vagrant 的同步目录功能经常报mount: unknown filesystem type vboxsf。安装命令vagrant plugin install vagrant-vbguest如果你的网络环境访问 Vagrant 插件源比较慢可以提前配置好本地的 RubyGems 镜像或者直接多试几次。这个插件本身没有复杂的依赖大多数时候一条命令就能装好。2. Vagrantfile 编写一次拉起三台机器2.1 Vagrantfile 核心结构Vagrant 的灵魂是 Vagrantfile。多虚拟机场景下最清晰的组织方式是在一个 Vagrant.configure(2) 块里用三个 config.vm.define 分别定义虚拟机。下面是这次使用的完整配置你可以直接复制改改就能用Vagrant.configure(2) do |config| # 全局配置启动时不要频繁检查 box 更新时间 config.vm.box_check_update false # ---------- CentOS 8 ---------- config.vm.define centos8 do |node| node.vm.box generic/centos8 node.vm.hostname centos8 node.vm.network private_network, ip: 192.168.56.11 node.vm.synced_folder ./www/centos8, /var/www/html node.vm.provider virtualbox do |vb| vb.name vagrant-centos8 vb.memory 2048 vb.cpus 2 end end # ---------- Ubuntu 22.04 ---------- config.vm.define ubuntu22 do |node| node.vm.box ubuntu/jammy64 node.vm.hostname ubuntu22 node.vm.network private_network, ip: 192.168.56.12 node.vm.synced_folder ./www/ubuntu22, /var/www/html node.vm.provider virtualbox do |vb| vb.name vagrant-ubuntu22 vb.memory 2048 vb.cpus 2 end end # ---------- Ubuntu 24.04 ---------- config.vm.define ubuntu24 do |node| node.vm.box ubuntu/noble64 node.vm.hostname ubuntu24 node.vm.network private_network, ip: 192.168.56.13 node.vm.synced_folder ./www/ubuntu24, /var/www/html node.vm.provider virtualbox do |vb| vb.name vagrant-ubuntu24 vb.memory 2048 vb.cpus 2 end end end从这段配置能看出几件事每台机器有自己的名字、镜像、IP、同步目录和 VirtualBox 名称。同步目录我一开始就建好了三个子目录 www/centos8、www/ubuntu22、www/ubuntu24宿主机代码直接丢进去虚拟机里挂到 /var/www/html 下面方便后面配 Nginx 多站点。2.2 网络模式选型为什么我用 private_networkVagrant 支持三种网络方式forwarded_port 端口转发、private_network 私有网络、public_network 公有网络。第一次用 Vagrant 的人习惯直接配 forwarded_port把虚拟机的 80 端口映射到宿主机的 8080确实能通但三台虚拟机就有端口冲突的问题——比如 80 端口只有一个宿主 8080 能用第二台就得 8081、第三台 8082越往后越乱。private_network 的思路更干净给每台虚拟机分配一个固定的私网 IP宿主机和虚拟机之间通过 VirtualBox 的 Host-Only 网卡通信。默认情况下Host-Only 网段的宿主机端 IP 是 192.168.56.1我就把三台机器分别设为 .11、.12、.13以后不管是 SSH 还是访问网站直接对着 IP 来完全避开端口冲突。public_network 相当于桥接到物理网卡让虚拟机直接从路由器拿 IP局域网里的其他设备也能访问。看着挺方便但有两个问题一是 DHCP 给的 IP 不确定Vagrant 每次 up 都可能变不适合需要固定地址的配置二是在很多办公网络里交换机会做端口安全限制桥接出来的虚拟机经常上不了网排查起来特别费劲。所以我最终选择了 private_network 同步目录的方案既满足互访又不影响局域网环境。2.3 资源配置、hostname、同步目录技巧每个 define 块的 provider 配置里vb.memory 和 vb.cpus 分别设置内存和 CPU 核数。这里不建议分配得太满VirtualBox 的虚拟机内存是启动时就全额占用的三台 2G 就是 6G再加系统缓存很容易把宿主机拖垮。如果只是跑跑 Nginx、PHP、MySQL 这种常规服务1.5G 其实也够用。hostname 设置也要注意尤其是 Ubuntu 官方 box如果你不给它明确设置 hostname它默认会根据 cloud-init 生成的实例 ID 来命名导致主机名是一串无规律的 hash排查日志的时候分不清是哪台机器。我统一用操作系统名作为 hostname简单直白。同步目录是 Vagrant 很实用的功能宿主机改代码虚拟机直接看到。默认情况下 Vagrant 会把项目目录挂载到虚拟机的 /vagrant这里我额外挂载了各自的网站目录。能挂载的前提是虚拟机里装了 VirtualBox Guest Additions并且 vboxsf 模块能加载。如果你在启动日志里看到mount: unknown filesystem type vboxsf绝大多数情况是 Guest Additions 没装好装好 vagrant-vbguest 插件后重新 vagrant reload 即可。3. 镜像与 Box 下载那些看不到进度条的时刻3.1 Box 下载速度慢的应对方案用 Vagrant 第一次启动虚拟机它要先从 Vagrant Cloud 拉取对应的 box 镜像。官方源在海外体验就是进度条卡在 0%或者几 KB/s 的速度下载几百 MB 的镜像等半天也不动。 我试过的可行思路是先把 box 文件下载到本地再用 vagrant box add 离线导入。具体做法是从镜像站或已有的下载链接拿到扩展名为 .box 的文件然后执行vagrant box add --name generic/centos8 D:/downloads/generic-centos8.box vagrant box add --name ubuntu/jammy64 D:/downloads/ubuntu-jammy64.box vagrant box add --name ubuntu/noble64 D:/downloads/ubuntu-noble64.box导入完成后Vagrantfile 里的 node.vm.box 配置会直接命中本地已存在的 box不会再尝试联网下载。用 vagrant box list 可以确认本地有哪些 box。需要注意版本一致性如果本地 box 版本和 Vagrantfile 里指定的版本不匹配Vagrant 偶尔会自动去拉更新。为了避免意外可以在 Vagrantfile 开头设置 config.vm.box_check_update false或者在 box 名称后面用版本号精确锁定。3.2 版本不匹配Provider 与 VirtualBox 的坑另一个让我摸不着头脑的问题是启动时报The provider virtualbox that was requested is not installed. 明明 VirtualBox 装得好好的。后来发现是 Vagrant 找不到可用的 VirtualBox 驱动。原因一般是两种情况VirtualBox 不是通过官方安装包安装的比如用了解压版或绿色版注册表里没有写入 VirtualBox 的安装信息。解决办法用官方安装包重新安装一遍哪怕装到非默认路径官方安装程序也会写入必要的注册表项。PATH 环境变量里没有 VirtualBox 的安装目录。检查一下系统环境的 PATH 是否包含 VBoxManage.exe 所在路径通常需要手动添加。还有一类报错是 VirtualBox 版本过新Vagrant 还不认识。我在某次升级 VirtualBox 到 7.1 时遇到过Vagrant 2.4.1 直接提示版本不被支持。处理方式要么升级 Vagrant 到新版要么把 VirtualBox 退回到稳定匹配的版本版本。这件事上我建议Vagrant 跟随官方更新VirtualBox 保持 LTS 或广泛使用的稳定版如果两个都是最新反而容易撞到兼容性问题。3.3 先单台验证再批量启动我还犯过一个低级错误第一次三台机器全部写进 Vagrantfile然后直接 vagrant up结果三台同时开始下载 box、并发创建虚拟磁盘、抢占 SSH 端口日志刷得飞快然后一台启动成功两台报 SSH 超时最后我根本分不清是哪个环节出了问题。之后的经验是先在 Vagrantfile 里只保留一台机器跑通一台后把剩下的逐台添加上去或者用命令指定启动某台vagrant up centos8等 centos8 完全起来、SSH 能连、同步目录挂载正常再 vagrant up ubuntu22以此类推。这样做的好处是每个机器的输出日志都独立、干净出问题时能快速定位到具体机器的配置。4. 三台机器启动过程中的闪退与卡死排查4.1 卡在 Waiting for SSH to become available...第一次启动时报这个错非常常见Vagrant 创建了虚拟机但迟迟连不上 SSH。很多人第一反应是SSH 配置错了但大多数情况是虚拟机内部还在启动系统、cloud-init 还在初始化网络SSH 服务根本没起来。排查路径我整理了一下用 VBoxManage list runningvms 确认虚拟机进程是真活着还是在反复重启打开 VirtualBox 图形界面直接看虚拟机的控制台屏幕能直观看到系统启动到哪一步了如果控制台显示停在了登录界面试试手动登录默认用户名/密码通常在 box 的说明文档里如果控制台也卡住考虑是不是系统引导有问题。常见解决办法包括config.vm.boot_timeout 600把默认的 300 秒超时加长到 600 秒给慢机器多一点时间。另外某些 box 默认 SSH 用户不是 vagrant比如 generic/centos8 默认就是 vagrant但 centos/8 这个官方 box 默认用户是 centos。如果 SSH 用户不匹配Vagrant 会一直重试直到超时。可以在 Vagrantfile 里显式指定config.ssh.username vagrant config.ssh.password vagrant在本地开发环境这样配置简单直接不会出问题。提示如果卡住的位置在Waiting for machine to boot先用 VirtualBox 打开界面看看控制台输出。多数时候不是 Vagrant 的问题而是 Linux 初始化阶段比较慢。4.2 蓝屏与无法启用虚拟机平台的真相这次踩的坑里最让我血压升高的是宿主机 Windows 上启动了 VirtualBox结果还没进系统就蓝屏。查下来原因是 Windows 自带的 Hyper-V 和内核隔离VBS与 VirtualBox 的硬件虚拟化产生冲突。现代 Windows 默认开启基于虚拟化的安全功能Virtualization-Based SecurityVBS这会占用了 Hyper-V 的管理程序接口导致 VirtualBox 这类第三方虚拟化软件无法正常使用。现象有二一是启动虚拟机直接蓝屏二是 VirtualBox 提示无法启用虚拟机平台但 Intel VT-x 明明是开启的。解决办法是关闭 Hyper-V 相关功能。以管理员身份打开命令提示符执行bcdedit /set hypervisorlaunchtype off然后重启电脑。注意关闭 Hyper-V 会影响 WSL2、Docker Desktop 的 Windows 容器模式等依赖 Hyper-V 的组件我这边 WSL2 暂时不用所以没有影响。如果你需要同时用 WSL2 和 VirtualBox那就要评估好替代方案比如把 VirtualBox 换成 Hyper-V 虚拟机或者反过来。总之先把冲突解除再说。4.3 同步目录挂载失败与 Guest Additions启动成功的机器有时候会报Mounting shared folders failed常见场景是第一次 up 时 Guest Additions 还没装上vagrant-vbguest 插件自动装到一半被系统更新打断。解决步骤在 Vagrantfile 里确认三台机器都定义了 synced_folder执行 vagrant reload 重新加载如果还不行手动进入虚拟机执行sudo /sbin/rcvboxadd setupCentOS 上可能还需要安装 kernel-devel 和 gcc。实际上用 vagrant-vbguest 插件自动处理比手动装省心很多。我还遇到过一个比较隐蔽的问题系统更新内核后vboxsf 模块没有跟着重新编译导致原本好好的同步目录突然挂载失败。这种情况只要重新执行一遍 Guest Additions 的设置命令即可不需要重建虚拟机。5. CentOS 8 深度踩坑生命周期结束后的连环坑5.1 yum/dnf 源全部失效CentOS 8 在 2024 年 5 月 31 日正式 EOL官方源相关的所有 mirrorlist 和 mirror.centos.org 路径全部下线之后你在 CentOS 8 上执行 dnf install 任何软件都会报 404 或者 Cannot find a valid baseurl for repo: baseos。这个问题在我启动 centos8 虚拟机后立刻遇到因为我要装 Nginx、vim、git 等基础工具结果一个都装不上。解决办法是把源切换到 vault 归档源。先备份再修改sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.bak sudo sed -i s|^mirrorlist|#mirrorlist|g /etc/yum.repos.d/CentOS-*.repo sudo sed -i s|^#baseurlhttp://mirror.centos.org/$contentdir/$releasever|baseurlhttps://mirrors.aliyun.com/centos-vault/8.5.2111|g /etc/yum.repos.d/CentOS-*.repo sudo dnf clean all sudo dnf makecache注意如果你的 CentOS 8 是其他小版本比如 8.2、8.4需要把上面命令里的 8.5.2111 替换成对应的版本号否则路径不存在。改完之后 dnf makecache 能跑通就说明源恢复正常了。5.2 网络配置NetworkManager 和默认网卡CentOS 8 默认使用 NetworkManager 管理网络这一点和 Ubuntu 很不一样。Vagrant 创建的虚拟机有两个逻辑网卡一个是 NAT 网卡用于外网访问一个是 Host-Only 网卡用于私网通信。但我在 centos8 上执行 ip addr 时发现私有网卡没有拿到 IP原因是 Host-Only 网卡没有开启自动连接ONBOOT 或 NM_CONTROLLED。解决方式有两个一个是改配置文件另一个直接用 nmcli 命令sudo nmcli connection show # 找到对应连接名例如 System eth1 sudo nmcli connection modify System eth1 ipv4.addresses 192.168.56.11/24 ipv4.method manual sudo nmcli connection up System eth1这个方法比编辑 ifcfg 文件直观改完立即生效还不用重启网络服务。5.3 cloud-init 与默认用户generic/centos8 这个 box 默认会带 cloud-initVagrant 启动时会自动注入 SSH 公钥和用户配置。大部分情况它工作得很好但在某些网络环境下cloud-init 的 datasource 识别会卡住表现是系统启动后等 1-2 分钟才能 SSH。原因往往是 cloud-init 在等 DHCP 或者 metadata 服务超时。问题不大但很烦等得人着急。解决办法是把 cloud-init 的 datasource 强制指定为 None也就是不让它尝试从我这里拿元数据sudo sh -c echo datasource_list: [ None ] /etc/cloud/cloud.cfg.d/99_fake_cloud.cfg sudo systemctl restart cloud-init或者如果这台机器以后不再需要 cloud-init 的自动配置能力也可以直接禁用sudo systemctl disable --now cloud-init.service对于纯 Vagrant 使用场景禁用 cloud-init 反而能减少很多不确定性机器启动速度也会变快。6. Ubuntu 22.04 与 24.04 踩坑全记录6.1 Ubuntu 官方 Box 的网络适配差异Ubuntu 官方 boxubuntu/jammy64 和 ubuntu/noble64的网络配置和 CentOS 完全是两套体系。它们默认使用 netplan 管理网络并且把网卡命名成了 enp0s3 和 enp0s8 这样的可预测命名。第一次 vagrant up ubuntu22 时我发现私网 IP 没有生效ping 192.168.56.12 通不了检查 netplan 配置文件才发现网卡名称和 Vagrantfile 里的 IP 没有绑定。确认网卡名称的方法是ip addr然后在 /etc/netplan 下找到类似 50-vagrant.yaml 的文件把 IP 配置到正确的网卡上。修改示例network: version: 2 renderer: networkd ethernets: enp0s8: addresses: - 192.168.56.12/24 routes: - to: default via: 192.168.56.1 nameservers: addresses: - 8.8.8.8 - 223.5.5.5改完后执行 sudo netplan apply 即可生效。Ubuntu 24.04 的 netplan 底层不再默认使用 networkd而是迁移到了 Netplan 的 systemd-networkd 后端配置文件写法变化不大但如果你是从网上抄来的旧教程注意确认 renderer 那一行不要写错。24.04 上最常见的问题是 cloud-init 每次都重置 netplan 配置要么把 cloud-init 关掉要么把自定义配置文件放在 /etc/netplan/ 下面并且不要和 cloud-init 生成的配置冲突。保险起见我在 ubuntu24 上也禁用了 cloud-initsudo systemctl disable --now cloud-init.service sudo rm -f /etc/netplan/50-cloud-init.yaml sudo netplan apply6.2 中文输入法配置虚拟机里也要能打中文既然要在虚拟机里写代码、改文档中文输入法必须得有。Ubuntu 22.04 和 24.04 上我统一使用 fcitx5配置很简单sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons装完之后设置环境变量写到 /etc/environment 或 ~/.profileexport GTK_IM_MODULEfcitx export QT_IM_MODULEfcitx export XMODIFIERSimfcitx然后执行 im-config 选择 fcitx5重启会话或重启虚拟机后生效。需要注意如果你运行的是无桌面版的 Vagrant 虚拟机只是 SSH 远程登录那输入法根本用不上。如果是安装了桌面环境的虚拟机这一步就很有必要。6.3 不要乱装显卡驱动很多从 Windows 转过来的同学在 Ubuntu 虚拟机里下意识想去装 NVIDIA 驱动结果折腾半天还把自己系统搞坏。虚拟机里的显卡是 VirtualBox 模拟出来的虚拟显卡不是真实硬件应该装的是 VirtualBox 提供的 Guest Addition 工具sudo apt install virtualbox-guest-utils virtualbox-guest-x11装完重启桌面分辨率会自适应剪贴板共享也正常。千万不要去下载什么显卡驱动安装包它只会让你的虚拟机黑屏、掉驱动、起不来。这台 Ubuntu 22 我就因为手贱装过一次 N 卡驱动导致 X 服务起不来最后只能重建。6.4 Ubuntu 24.04 新内核带来的连锁反应Ubuntu 24.04 用的是 6.8 内核VirtualBox 7.0 的 Guest Additions 在编译 vboxsf 模块时一开始没通过。现象是同步目录挂载失败报错还特别隐蔽。我的解决方法是更新 vagrant-vbguest 插件然后在虚拟机里手动执行sudo apt install build-essential dkms linux-headers-$(uname -r) sudo /sbin/rcvboxadd setup sudo modprobe vboxsf如果之后系统更新内核需要重新编译模块。这也是我后面把 Box 版本和内核版本记录到一个版本说明文档里的原因不然过一个月再回来就全忘了。7. 多虚拟机与宿主机连通Nginx 多站点开发环境7.1 设计一套多站点自定义域名方案三台虚拟机都跑起来之后下一步就是让它们真正干活。我的需求是本地开发多个 Web 项目每个项目对应一个自定义域名不同域名落到不同虚拟机上的 Nginx 站点目录。这样做的好处是彻底模拟生产环境的域名隔离不依赖端口区分。规划如下自定义域名虚拟机 IP虚拟机系统站点根目录app1.test192.168.56.11CentOS 8/var/www/html/app1app2.test192.168.56.12Ubuntu 22.04/var/www/html/app2app3.test192.168.56.13Ubuntu 24.04/var/www/html/app3宿主机在 Windows 上打开 C:\Windows\System32\drivers\etc\hosts加入192.168.56.11 app1.test 192.168.56.12 app2.test 192.168.56.13 app3.test这样宿主机浏览器里访问 app1.test 就会直接指向 centos8 的私网 IP。7.2 每台虚拟机的 Nginx 配置以 CentOS 8 为例源修复后安装 Nginxsudo dnf install -y nginx sudo systemctl enable --now nginx然后创建站点配置 /etc/nginx/conf.d/app1.confserver { listen 80; server_name app1.test; root /var/www/html/app1; index index.html index.php; location / { try_files $uri $uri/ /index.php?$query_string; } }Ubuntu 22/24 上安装 Nginx 的方式类似改用 aptsudo apt install -y nginx站点配置文件放在 /etc/nginx/sites-available/app2.conf然后软链到 sites-enabled。因为之前已经在 Vagrantfile 里挂载了同步目录所以只需在宿主机上的 www/ubuntu22/app2 目录放一个 index.html虚拟机里的 /var/www/html/app2 就能看到刷新页面立即生效。7.3 端口冲突和访问细节用私网 IP 自定义域名方案后完全不需要配置 forwarded_port也就没有三台虚拟机抢 80 端口的问题。三台虚拟机的 80 端口各自独立互不干扰。如果某个项目需要调试 HTTPS可以在每台虚拟机里加一个 443 监听配置好证书路径即可。有一点需要提醒private_network 的 IP 只在宿主机和这几台虚拟机之间可达。也就是说同一局域网里其他人的电脑访问不了你的 app1.test除非你把网络模式改成 public_network。对本地开发来说不能跨机器访问反而是好事不会影响到其他人。8. 常见问题速查表与最终经验8.1 问题速查表最后把这次踩的所有坑汇总成一张表方便以后对照排查。现象可能原因解决方案vagrant up 卡在 Waiting for SSH虚拟机启动慢 / SSH用户不对 / cloud-init耗时加大 boot_timeout显式设置 config.ssh.usernameVirtualBox 启动虚拟机直接蓝屏Windows VBS/Hyper-V 占用虚拟化接口以管理员执行 bcdedit /set hypervisorlaunchtype off 后重启同步目录挂载失败 vboxsfGuest Additions 未安装或内核更新后未重编安装 vagrant-vbguest执行 /sbin/rcvboxadd setupCentOS 8 dnf 装不了包CentOS 8 已 EOL默认源失效切换 vault 源域名改 mirrors.aliyun.com/centos-vaultUbuntu 私网 IP 不生效netplan 网卡名称不匹配 / cloud-init 覆盖配置修改对应网卡的 netplan yaml必要时禁用 cloud-init三台虚拟机的 80 端口不好区分用了 forwarded_port 导致冲突改用 private_network hosts 自定义域名不用端口转发主机名是一串 hash没设置 hostname依赖 cloud-init在 Vagrantfile 的 define 块里显式指定 hostname8.2 我踩坑后的几个体会这几天的经历给我最大的教训是不要一口气做完所有事情。刚开始图快Vagrantfile 一次性写完三台机器结果报错时连定位都费劲。后来改成一台一台起每台机器起来后先验证 SSH、再验证同步目录、再装基础软件走完一遍才接着下一台整个过程顺畅了非常多。另外一个受用的习惯是把 Vagrantfile、初始化脚本、源修复命令、网络配置模板全部存到 git 仓库里每台机器的启动步骤写成 shell 脚本或者 Ansible playbook。之后哪怕虚拟机全删了也能一条命令恢复整套环境。我现在把这个仓库命名为dev-env里面记录了每一台机器的 box 版本、VirtualBox 版本、Vagrant 版本连当时踩坑后修改的 repo 文件都留了备份。项目回归测试时直接把仓库拉到新机器上执行一遍环境就复原了。如果说还有什么要提醒的那就是虚拟机这东西越早把不可变基础设施的理念用起来后面越省心。别把虚拟机当宠物养坏了就去修要当牲畜用坏了就重新造。Vagrant 的设计哲学正好是后者。等到三台机器都能正常起来我做的第一件事是 vagrant snapshot push 保存了一个干净基线之后无论环境怎么被我折腾坏一条 vagrant snapshot pop 就能回滚到初始状态。这种任意造、秒级恢复的开发体验手动建虚拟机给不了这也是我以后会继续用 Vagrant 管理多虚拟机环境的核心理由。
返回列表