在MacOS Catalina上使用Vagrant+VirtualBox:但在我的機器上就是行得通!

什麼是Vagrant?

Vagrant最初於2010年3月由Hashicorp的Mitchell Hashimoto及其合作伙伴John Bender推出,Vagrant 是一個用於虛擬機器(VM)生命週期管理的開源命令行工具。該工具旨在通過使這一過程更加簡單來提高開發效率。雖然Vagrant最初與Oracle VirtualBox緊密相關,但自版本1.1起,它也增加了對VMware、KVM等的支持。儘管虛擬化在網頁開發中非常有用,但使用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 VM,可能會遇到令人困擾的藍屏問題。

為了正常使用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替代品。然而,如果你真的這麼做,很可能會發現許多網站將這項工具與容器(尤其是Docker)進行比較。但這樣的比較真的合理嗎?事實上,只要清楚兩者之間的差異,這樣的比較是合理的。

Docker相對於虛擬機管理程序的許多優勢,在某種程度上也可以被視為劣勢——這完全取決於你的需求。首先,讓我們來談談啟動時間。容器因為基本上只是一組進程,所以能夠快速啟動,但這也意味著它使用主機的核心。因此,容器不像虛擬機那樣依賴虛擬化硬件,而是直接使用主機的硬件。

虛擬機管理程序可以擁有專屬資源,如內存、CPU時間、硬盤空間等。相反,容器與主機電腦上的其他進程共享資源。同樣地,雖然Vagrant允許你創建一個完整的虛擬機——這將需要更多的時間和資源——但Docker的容器化方法使你能夠以更少的資源更快地部署。

因此,記住這不是一場競賽,而是關於你公司的需求。

結論

雖然Vagrant無疑是一個強大的工具,但它也不是沒有問題。如果你的公司缺乏專業知識或經驗,一支專門的軟件開發團隊或許能提供幫助。畢竟,即使只“在我的機器上運行”,每個問題都有解決方案。

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