# 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 無法正常啟動 ### 確認是否同為此錯誤 :::warning - 本文提供的解決方式只針對上面提出的問題 - 請先按照下列步驟,檢驗自己遇到的錯誤是否和本文描述的相同 ::: - 下列指令請在 **虛擬機中操作** - 使用 `systemctl` 確認 MongoDB 是否異常 ```bash sudo systemctl status mongod.service ``` - 若錯誤訊息顯示 <font color=red>**Core Dump**</font>,請接著嘗試下面步驟 - 使用下面指令,確認 CPU 是否支援 AVX 指令 ```bash lscpu | grep avx ``` - **若沒有任何輸出**,表示 MongoDB 是因為缺少 AVX 指令集而發生異常,請接著嘗試下面提出的解決方式 - 若有輸出,表示 MongoDB 是因為其他原因才發生異常,建議先嘗試重啟 MongoDB,或是重新安裝 VM ```bash # 重啟 MongoDB sudo systemctl restart mongod.service ``` ## 解決方法 MongoDB [官方提供的解決方式](https://www.mongodb.com/community/forums/t/setting-up-mongodb-v5-0-on-ubuntu-20-core-dump-status-4-ill/120705/4) 1. 使用 MongoDB 4.XX 2. 自行重新編譯 MongoDB 5.XX,避免出現不支援的 CPU 指令 3. 使用支援 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**,點右鍵選擇 **以管理員身分執行** - 執行下面指令,關閉虛擬機平台 ```bash bcdedit /set hypervisorlaunchtype off ``` - 執行下面指令,關閉 Hyper-V Hypervisor ```bash Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Hypervisor ``` <!-- - 執行下面指令,關閉 Hyper V ``` DISM /Online /Disable-Feature:Microsoft-Hyper-V ``` --> :::info - 因為每台電腦上啟用的服務可能有差異 - 上面的指令可能出現錯誤訊息 - 請先忽略錯誤訊息,並繼續往下執行 ::: - 打開控制台 - 打開 **程式集** ![image](https://hackmd.io/_uploads/HJS6qmBPa.png) - 選擇 **開啟或關閉 Windows 功能** ![image](https://hackmd.io/_uploads/SJTxsmHDT.png) - 關閉 Hyper-V 和虛擬機平台 - 若這兩項功能未被列出,則可跳過此步驟 ![image](https://hackmd.io/_uploads/rk4sX6RrT.png) ### 啟動 Virtualbox 的虛擬化設定 - 點選要使用的虛擬機,進入設定頁面 (虛擬機必須是電源關閉的狀態) ![image](https://hackmd.io/_uploads/H1EkAmSDT.png) - 選擇 **系統** > **處理器**,勾選下方的兩個擴充功能後,按下確認 ![image](https://hackmd.io/_uploads/S1c9AQBDp.png) :::danger **Nested VT-x/AMD-V 可能無法勾選** - 此情況需要透過 Virtual Box 的管理工具指令強制開啟 - 請繼續執行 **強制啟動虛擬化設定** 中的操作 ::: ### 強制啟動虛擬化設定 :::success 若上個步驟 **啟動 Virtualbox 的虛擬化設定** 已經成功,請跳過這一個章節 ::: - 打開任意的終端機(Power Shell, cmd, git bash ...),切換到 Virtual Box 的安裝路徑 (預設為 *C:\Program Files\Oracle\VirtualBox*) - 可以直接使用 `cd` 指令切換目錄,由於路徑中有空白字元,需要加上雙引號 `""` ``` cd "C:\Program Files\Oracle\VirtualBox" ``` ![image](https://hackmd.io/_uploads/BkcosmHwp.png) - 執行 `./VBoxManage.exe` 強制開啟必要的虛擬化選項 ``` ./VBoxManage.exe modifyvm <VM_NAME> --nested-hw-virt on ``` - :warning: `<VM_NAME>` 要替換成虛擬機的名稱 (`<>` 不要保留) - 以下面的截圖為例,使用的虛擬機名稱為 **5GC** ![image](https://hackmd.io/_uploads/rkzL27SwT.png) - 則啟動虛擬化的指令應為 ``` ./VBoxManage.exe modifyvm 5GC --nested-hw-virt on ``` :::warning - 實際安裝路徑可能不同,手動確認正確的安裝路徑 - 可以在 **開始選單** 中 **搜尋 VirtualBox**,**點右鍵** > **開啟檔案位置** ![image](https://hackmd.io/_uploads/B1aAfEHvp.png) - 再對 VirtualBox 捷徑 **點右鍵** > **開啟檔案位置** ![image](https://hackmd.io/_uploads/H1tFbEHva.png) ::: ### Windows 11 需關閉 "記憶體完整性" :::warning - 若系統是 Windows 11,需要額外執行此步驟 - 若為 Windows 10 請跳過此步驟 ::: - 搜尋 "核心隔離" ![image](https://hackmd.io/_uploads/rJiOqY9va.png) - 關閉 "記憶體完整性" ![image](https://hackmd.io/_uploads/H1ui9K9P6.png) ### 重啟虛擬機 - 啟動虛擬機,並在虛擬機中執行以下指令 ``` lscpu | grep avx ``` - 若有以下輸出,代表設定成功 ![image](https://hackmd.io/_uploads/HJl6PBBva.png) - 執行以下指令確認 MongoDB 正常執行 ``` systemctl status mongod.service ``` - 若顯示 **active**,代表 MongoDB 正常執行 ![image](https://hackmd.io/_uploads/H180DSSwp.png) - 重新執行 *project1/run.sh* 啟動 Free5GC ```bash # 建議切換到 project1 底下執行 run.sj # 會自動修改 Free5GC 的設定檔,以確保 IP address 設定正確 cd project1 ./run.sh ``` <!-- ## 分析原因 ### 觀察 Free5GC Log - 運行一段時間後發現是 (左上角) 會出現錯誤並導致其他三個 processes 跟著出錯 - 觀察其 config,發現它會使用 MongoDB ### 查看 MongoDB Log - 使用 `systemctl status mongod.service` 查看其 log - 發現錯誤是 `core dump`,初步判斷是 binary package 中使用了不支援的 CPU instruction - 進一步搜尋其 error code,發現有 MongoDB 5.X 版有使用 AVX 指令集,導致無法啟動的災情 - 使用 `dpkg -l | grep mongo` 確認目前版本確實是 5.X -->