Windows 執行模組 6-3 錯誤排除
錯誤描述
- 環境: Windows 10/11 搭配 Virtualbox
- 問題: 跟著講義步驟操作,確認設定檔正確的情況下,Free5GC 的其中一個程式會出現執行錯誤
錯誤原因
- Free5GC 本身使用了 MongoDB;模組 6-3 提供的 VM,使用的 MongoDB 是 5.0 之後的版本
- MongoDB 5.0 開始,使用了 AVX 指令集 (一種 SIMD 的 CPU 指令)
- 因為 Windows 的環境不同,可能導致在 Virtualbox 中無法使用該指令集,從而造成 MongoDB 無法正常執行
- 進而導致 Free5GC 無法正常啟動
確認是否同為此錯誤
- 本文提供的解決方式只針對上面提出的問題
- 請先按照下列步驟,檢驗自己遇到的錯誤是否和本文描述的相同
- 下列指令請在 虛擬機中操作
- 使用
systemctl
確認 MongoDB 是否異常
sudo systemctl status mongod.service
- 若錯誤訊息顯示 Core Dump,請接著嘗試下面步驟
- 使用下面指令,確認 CPU 是否支援 AVX 指令
- 若沒有任何輸出,表示 MongoDB 是因為缺少 AVX 指令集而發生異常,請接著嘗試下面提出的解決方式
- 若有輸出,表示 MongoDB 是因為其他原因才發生異常,建議先嘗試重啟 MongoDB,或是重新安裝 VM
sudo systemctl restart mongod.service
解決方法
MongoDB 官方提供的解決方式
- 使用 MongoDB 4.XX
- 自行重新編譯 MongoDB 5.XX,避免出現不支援的 CPU 指令
- 使用支援 AVX 的 CPU (使 VM 環境可以支援 AVX 指令)
因為不確定 MongoDB 是否已有必要的資料,重新安裝 MongoDB 可能會有其他問題,所以本文提供的方法,將嘗試讓 Virtualbox 的 VM 可以使用 AVX 指令集
在 Virtualbox 啟用 AVX
在 Virtualbox 啟動 AVX 需要以下條件
- 停用 Windows 上的 Hyper-V、Windows 虛擬化平台
- VM 必須啟動 PNE/NX、AMD-V
- Windows 11 需要關閉 核心隔離 中的 記憶體完整性 功能
關閉 Windows 上的虛擬機平台
- 下列指令請在 主機 (Windows) 上操作
- 找到 Powershell,點右鍵選擇 以管理員身分執行
- 執行下面指令,關閉虛擬機平台
bcdedit /set hypervisorlaunchtype off
- 執行下面指令,關閉 Hyper-V Hypervisor
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Hypervisor
- 因為每台電腦上啟用的服務可能有差異
- 上面的指令可能出現錯誤訊息
- 請先忽略錯誤訊息,並繼續往下執行
- 打開控制台
- 打開 程式集

- 選擇 開啟或關閉 Windows 功能

- 關閉 Hyper-V 和虛擬機平台
- 若這兩項功能未被列出,則可跳過此步驟

啟動 Virtualbox 的虛擬化設定
- 點選要使用的虛擬機,進入設定頁面 (虛擬機必須是電源關閉的狀態)

- 選擇 系統 > 處理器,勾選下方的兩個擴充功能後,按下確認

Nested VT-x/AMD-V 可能無法勾選
- 此情況需要透過 Virtual Box 的管理工具指令強制開啟
- 請繼續執行 強制啟動虛擬化設定 中的操作
強制啟動虛擬化設定
若上個步驟 啟動 Virtualbox 的虛擬化設定 已經成功,請跳過這一個章節
- 打開任意的終端機(Power Shell, cmd, git bash …),切換到 Virtual Box 的安裝路徑 (預設為 C:\Program Files\Oracle\VirtualBox)
- 可以直接使用
cd
指令切換目錄,由於路徑中有空白字元,需要加上雙引號 ""
cd "C:\Program Files\Oracle\VirtualBox"

- 執行
./VBoxManage.exe
強制開啟必要的虛擬化選項
./VBoxManage.exe modifyvm <VM_NAME> --nested-hw-virt on
- :warning:
<VM_NAME>
要替換成虛擬機的名稱 (<>
不要保留)
- 以下面的截圖為例,使用的虛擬機名稱為 5GC

- 則啟動虛擬化的指令應為
./VBoxManage.exe modifyvm 5GC --nested-hw-virt on
Windows 11 需關閉 "記憶體完整性"
- 若系統是 Windows 11,需要額外執行此步驟
- 若為 Windows 10 請跳過此步驟
- 搜尋 "核心隔離"

- 關閉 "記憶體完整性"

重啟虛擬機
- 啟動虛擬機,並在虛擬機中執行以下指令
- 若有以下輸出,代表設定成功

- 執行以下指令確認 MongoDB 正常執行
systemctl status mongod.service
- 若顯示 active,代表 MongoDB 正常執行

- 重新執行 project1/run.sh 啟動 Free5GC
cd project1
./run.sh