macOS Catalina 上的 Vagrant 与 VirtualBox:但在我机器上运行良好!

Vagrant是什么?

Vagrant于2010年3月首次推出,由Hashicorp的Mitchell Hashimoto及其合作伙伴John Bender共同创立,Vagrant 是一款 开源的命令行工具,用于虚拟机(VM)生命周期管理。该工具旨在通过简化这一过程来提高开发效率。虽然Vagrant最初与Oracle VirtualBox绑定,但从1.1版本开始,它也支持VMware、KVM等其他虚拟化平台。尽管虚拟化在Web开发中非常有用,但使用Vagrant并非总是万无一失的选择。

为什么要使用Vagrant?它值得吗?

首先,Vagrant提供了基于虚拟机管理程序的不可变环境的更大灵活性。这使开发者能够构建需要其他系统特有功能的环境。

例如,如果您需要构建支持多种操作系统和内核的应用程序,可以轻松创建多个虚拟机,并利用Vagrant进行测试。同样,如果您想复制客户的运行环境(操作系统、资源等),结合使用虚拟机和Vagrant也可能特别有帮助。

在工作站上安装Vagrant

开始使用Vagrant前,请从官方Vagrant下载页面下载安装程序或合适的包。以下说明适用于Vagrant v2.3.3(截至2022年12月的最新版本)。

在Windows上安装Vagrant

要在Windows上安装Vagrant,首先需要下载MSI包。接着,只需运行该文件并按照常规安装流程进行安装。

注意:安装程序会自动将‘vagrant’添加到系统路径中,因此在终端中也可使用。如果Vagrant未被识别,尝试注销并重新登录系统,这在Windows上是一个常见问题。

在MacOS Catalina上安装Vagrant

假设你已安装了‘brew’包管理器,快速设置Mac上的Vagrant,可以使用以下单行命令进行安装:

 

```bash
$> brew install vagrant
```

或者,你可以从二进制文件安装Vagrant

在Linux上安装Vagrant

对于Linux系统,我们将演示在Ubuntu 20.04上安装Vagrant的过程:

安装密钥:

 

```bash
$> wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
```

添加仓库:

 

```bash
$> echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
```

拉取更新并执行安装:

 

```bash
$> sudo apt update && sudo apt install vagrant
```

就是这么简单!现在你需要做的就是打开终端并输入“vagrant”。不过值得注意的是,如果你单独运行Vagrant,你会得到一个包含可用子命令的列表。

安装Vagrant时可能遇到的主要问题

虽然Vagrant安装错误相对少见,但如果你的机器上安装了多个管理程序,这种情况发生的概率会显著增加。毕竟,管理程序通常不允许在已有多个管理程序运行时创建虚拟机。

以下是来自Vagrant官方文档的几个快速解决方案,可以帮助你在已有其他管理程序的情况下使用Vagrant和VirtualBox:

在Linux上

使用另一个管理程序时,你可能会遇到以下错误:

 

```bash
There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", <ID of the VM>, "--type", "headless"]

Stderr: VBoxManage: error: VT-x is being used by another hypervisor (VERR_VMX_IN_VMX_ROOT_MODE).
VBoxManage: error: VirtualBox can't operate in VMX root mode. Please disable the KVM kernel extension, recompile your kernel and reboot
(VERR_VMX_IN_VMX_ROOT_MODE)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component ConsoleWrap, interface IConsole
```

为了使VirtualBox正常运行,需要将任何额外的管理程序添加到系统的拒绝列表中。

首先,查明管理程序的名称:

 

```bash
$> lsmod | grep kvm
kvm_intel             204800  6
kvm                   593920  1 kvm_intel
irqbypass              16384  1 kvm
```

然后,简单地使用“blacklist”命令将管理程序添加到拒绝列表。

 

```bash
echo 'blacklist kvm-intel' >> /etc/modprobe.d/blacklist.conf
```

最后,重启你的机器,并再次使用“vagrant”命令。

在Windows上

在Windows系统中,若尝试启动VirtualBox虚拟机时遭遇突如其来的蓝屏,

为使VirtualBox恢复正常运行,需确保Hyper-V功能已关闭。以下是针对Windows 10的简单命令行操作:

 

```PowerShell
$> Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
```

对于Windows 11,亦可通过提升权限的Powershell执行:

 

```PowerShell
$> bcdedit /set hypervisorlaunchtype off
```

此外,还可从Windows系统设置中禁用Hyper-V。

  • 右键点击Windows按钮,选择“应用和功能”
  • 打开“启用或关闭Windows功能”
  • 取消勾选Hyper-V,最后点击确定

重启计算机以应用这些更改。

在MacOS环境下,

如遇到执行VBoxManage时出现以下错误信息:

failed to open /dev/vboxnetctl: No such file or directory

解决方法有二:彻底重新安装VirtualBox或执行以下命令:

 
sudo /Library/StartupItems/VirtualBox/VirtualBox restart

或者

 
sudo /Library/StartupItems/VirtualBox/VirtualBox start

注意,在较新版本中,文件/Library/StartupItems/VirtualBox/VirtualBox已不存在,需采用如下命令:

 
sudo launchctl load /Library/LaunchDaemons/org.virtualbox.startup.pl

针对MacOS Catalina:但本机运行正常现象

另一个在Mac上可能遇到的问题是,当某个应用声称“在我的机器上运行良好”,却无论如何也无法在其他任何地方复现相同效果。我的SPG团队此前也曾遭遇此难题。

设想你目前正在使用Vagrant + VirtualBox部署和测试本地环境。团队中有一位软件工程师使用的是定制版的VagrantBox,目前对他们来说运行良好,我们称其为开发者1。在他们的工作站上,VirtualBox v6.1.34、Vagrant 2.2以及Ubuntu均无问题运行。

另一方面,显然开发者2需要升级其本地环境。他们当前在自己的工作站上混合使用了MacOS、VirtualBox v6.1.24和Vagrant 2.1.x。

因此,至少乍看之下,开发者2的升级策略似乎很简单:

  • 步骤1:更新VirtualBox和Vagrant版本(使用统一版本至关重要)
  • 步骤2:安装所有额外的项目组件

这两个操作都成功完成,但结果却出乎意料——不知何故,安装在VirtualBox上的网站现在完全无法访问。这是怎么回事?

面对这样的谜题,关键是要集思广益找出解决方案,并采取如下明智的行动:

  • 检查日志文件
  • ;确认所有VirtualBox服务,如PHP、Nginx和MySQL是否正常运行
  • ;使用curl访问页面

然而,在这种情况下,一切似乎都在正常运作,VirtualBox实例内部并没有明显的问题。

随后,团队决定改变策略,尝试从外部访问VirtualBox主机。在执行了一个简单的ping命令后,他们意外地发现,所有数据包均丢失。尽管这一消息令人不安,但这也可能是整个问题的根源

沿着这条线索,他们最终发现,现在HostOnly适配器必须使用不同的IP地址范围。这一变化始于VirtualBox v6.1.30的更新(竟是一个补丁更新):

 

192.168.55.х prior to the update

192.168.56.х. after the update.

这一点在最近修订的VirtualBox用户手册中清晰地指出:

在Linux、Mac OS X和Solaris系统上,Oracle VM VirtualBox仅允许将192.168.56.0/21范围内的IP地址分配给host-only适配器。”

团队成员们集体松了一口气。在创建了一个新的HostOnly适配器并更改了VirtualBox实例中的适配器后,问题突然消失了。解决方案中关键的网络组件终于可以访问,开发者2也终于感到满意。

Vagrant还是其他?存在哪些替代方案?它们有何优势?

面对如此多的激动人心之事,你或许会寻找Vagrant的替代品。然而,若你真的这么做,很可能会遇到一些网站将Vagrant与容器(尤其是Docker)进行比较。但这样的比较真的恰当吗?事实证明,只要清楚两者间的差异,这种比较是合理的。

Docker相对于虚拟机管理器的许多优势,在特定情境下也可能成为劣势——这完全取决于你的需求。首先,我们来谈谈启动时间。容器因其本质上是一组进程,故启动迅速,但也因此直接使用宿主机的内核。这意味着,容器并非依赖虚拟化硬件,而是直接使用宿主机的硬件资源。

相比之下,虚拟机管理器可以为虚拟机分配专属的内存、CPU时间、磁盘空间等资源。而容器则需与其他宿主机上的进程共享这些资源。同样,Vagrant允许你创建完整的虚拟机,这虽需更多时间和资源,但Docker的容器化方法却能以更少的资源实现快速部署。

因此,记住这不是一场竞赛,而是关乎你公司需求的考量。

结论

尽管Vagrant无疑是一个强大的工具,但它并非没有问题。如果你的公司缺乏相关专业知识或经验,一支专业的软件开发团队或许能提供帮助。毕竟,即使问题仅限于“在我的机器上能运行”,每个问题都有其解决方案。

Source:
https://dzone.com/articles/vagrantvirtualbox-on-macos-catalina-but-it-works-o