# 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
- 因為每台電腦上啟用的服務可能有差異
- 上面的指令可能出現錯誤訊息
- 請先忽略錯誤訊息,並繼續往下執行
:::
- 打開控制台
- 打開 **程式集**

- 選擇 **開啟或關閉 Windows 功能**

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

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

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

:::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"
```

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

- 則啟動虛擬化的指令應為
```
./VBoxManage.exe modifyvm 5GC --nested-hw-virt on
```
:::warning
- 實際安裝路徑可能不同,手動確認正確的安裝路徑
- 可以在 **開始選單** 中 **搜尋 VirtualBox**,**點右鍵** > **開啟檔案位置**

- 再對 VirtualBox 捷徑 **點右鍵** > **開啟檔案位置**

:::
### Windows 11 需關閉 "記憶體完整性"
:::warning
- 若系統是 Windows 11,需要額外執行此步驟
- 若為 Windows 10 請跳過此步驟
:::
- 搜尋 "核心隔離"

- 關閉 "記憶體完整性"

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

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

- 重新執行 *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
-->