Try   HackMD

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 指令
    ​​lscpu | grep avx
    
    • 若沒有任何輸出,表示 MongoDB 是因為缺少 AVX 指令集而發生異常,請接著嘗試下面提出的解決方式
    • 若有輸出,表示 MongoDB 是因為其他原因才發生異常,建議先嘗試重啟 MongoDB,或是重新安裝 VM
      ​​​​# 重啟 MongoDB
      ​​​​sudo systemctl restart mongod.service
      

解決方法

MongoDB 官方提供的解決方式

  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,點右鍵選擇 以管理員身分執行
  • 執行下面指令,關閉虛擬機平台
    ​​bcdedit /set hypervisorlaunchtype off
    
  • 執行下面指令,關閉 Hyper-V Hypervisor
    ​​Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Hypervisor
    
  • 因為每台電腦上啟用的服務可能有差異
  • 上面的指令可能出現錯誤訊息
  • 請先忽略錯誤訊息,並繼續往下執行
  • 打開控制台
    • 打開 程式集
      image
    • 選擇 開啟或關閉 Windows 功能
      image
    • 關閉 Hyper-V 和虛擬機平台
      • 若這兩項功能未被列出,則可跳過此步驟
        image

啟動 Virtualbox 的虛擬化設定

  • 點選要使用的虛擬機,進入設定頁面 (虛擬機必須是電源關閉的狀態)
    image
  • 選擇 系統 > 處理器,勾選下方的兩個擴充功能後,按下確認
    image

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"
      
      image
  • 執行 ./VBoxManage.exe 強制開啟必要的虛擬化選項
    ​​./VBoxManage.exe modifyvm <VM_NAME> --nested-hw-virt on
    
    • :warning: <VM_NAME> 要替換成虛擬機的名稱 (<> 不要保留)
      • 以下面的截圖為例,使用的虛擬機名稱為 5GC
        image
      • 則啟動虛擬化的指令應為
        ​​​​​​./VBoxManage.exe modifyvm 5GC --nested-hw-virt on
        
  • 實際安裝路徑可能不同,手動確認正確的安裝路徑
    • 可以在 開始選單搜尋 VirtualBox點右鍵 > 開啟檔案位置
      image

    • 再對 VirtualBox 捷徑 點右鍵 > 開啟檔案位置
      image

Windows 11 需關閉 "記憶體完整性"

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

重啟虛擬機

  • 啟動虛擬機,並在虛擬機中執行以下指令
    ​​lscpu | grep avx
    
    • 若有以下輸出,代表設定成功
      image
  • 執行以下指令確認 MongoDB 正常執行
    ​​systemctl status mongod.service
    
    • 若顯示 active,代表 MongoDB 正常執行
      image
  • 重新執行 project1/run.sh 啟動 Free5GC
    ​​# 建議切換到 project1 底下執行 run.sj
    ​​# 會自動修改 Free5GC 的設定檔,以確保 IP address 設定正確
    ​​cd project1
    ​​./run.sh