dSPACE VEOS on Linux:
VMware + Ubuntu 模擬環境建置指南
在 Windows 主機以 VMware Workstation 承載 Ubuntu 24.04 LTS,建立可執行 VEOS Simulator 與 POSIX-based V-ECU 的模擬環境。本文涵蓋硬體與虛擬機需求、安裝包與授權準備、逐步安裝流程,以及 icount 與 idle-detect 兩種時間同步模式各自必須完成的調整與其技術原因。
dSPACE VEOS 自 Release 2026-A 起提供原生 Linux 版本,可在 Ubuntu 24.04 LTS 上執行離線模擬應用(OSA),並透過 VEOS QEMU Coupling 模擬 POSIX-based V-ECU(嵌入式 Linux 受測系統)。對多數以 Windows 為主的開發團隊而言,最務實的導入方式是在既有 Windows 工作站上以 VMware Workstation 建立一台 Ubuntu 虛擬機,讓 VEOS 執行於虛擬機內,而 ControlDesk、SystemDesk、MATLAB/Simulink 等工具仍留在 Windows 端。
這個架構本身可行且已被廣泛採用,但其中有兩個環節特別容易在建置階段被忽略:浮動授權的驗證層次,以及 idle-detect 模式所依賴的巢狀虛擬化授權鏈。兩者的共同特徵是「前段檢查全部通過,卻在真正啟動模擬時才失敗」。本文以逐步操作的形式說明完整流程,並在每個關鍵設定處說明其原因,而非僅列出指令。
本文適用範圍
- dSPACE Release 2026-A(套件代號
noble,對應 Ubuntu 24.04 LTS,amd64) - Hypervisor:VMware Workstation(Windows 主機,Type-2)
- Guest OS:Ubuntu 24.04 LTS(Server 或 Desktop)
- 模擬對象:VEOS 離線模擬應用,含 POSIX-based V-ECU(QEMU Coupling)
文中所有網路位址、使用者名稱與伺服器 IP 均以佔位符表示,請依貴司實際環境替換。指令以 dSPACE 官方文件與安裝腳本之行為為準;標註「工程實務」者為實際導入經驗補充。
目錄
1. 部署拓撲與三層巢狀執行環境
1.1 先確定拓撲,它決定後續兩項設定
建置前的第一個決策是「ControlDesk 與 VEOS 是否在同一個作業系統內」。這個答案會直接決定是否需要啟用 Simulator 遠端存取,以及虛擬機該用哪種網路模式。
| 部署拓撲 | ControlDesk | VEOS | 建議 VM 網路 | 需 --enable-remote-access |
|---|---|---|---|---|
| A. 同一 OS 內 | 同機 | 同機 | — | ❌ 不需要(localhost) |
| B. Windows 主機 + VMware Ubuntu Guest (本文情境) |
Windows 主機 | Ubuntu Guest | NAT | ✅ 需要 |
| C. 兩台獨立 VM | Windows VM | Ubuntu VM | Bridged 同子網 | ✅ 需要 |
判斷準則只有一條:只要 ControlDesk 不是以 127.0.0.1 連線至 VEOS,VEOS 對它而言就是「遠端 Simulator」,即需啟用遠端存取。dSPACE Real-Time Testing on Linux 手冊在「How to Register a Platform」一節亦明列,於虛擬機上執行 Linux 時建議將網路設為 NAT——該建議正是針對本文的拓撲 B。
常見誤解:官方使用情境表中「桌機 / 伺服器 / VM 不需要」那條註腳,掛的是 Container Tunnel (CTUN),而非 --enable-remote-access。兩者是不同機制:CTUN 僅用於雲端跨 NAT 穿隧,一般 VM 部署確實不需要;但跨機存取 Simulator 仍必須啟用遠端存取。
1.2 三層巢狀執行環境
若模擬對象包含 POSIX-based V-ECU,實際上會形成三層巢狀結構。理解這張圖,後續 idle-detect 的設定要求就會變得直觀——因為最內層的 guest 需要硬體虛擬化,而它位於一層虛擬機之內。
2. 環境需求:主機、虛擬機與作業系統
2.1 Windows 主機需求
| 項目 | 需求 | 說明 |
|---|---|---|
| CPU | x86-64,支援 VT-x/EPT 或 AMD-V/RVI | idle-detect 模式的硬性前提;BIOS/UEFI 必須啟用 |
| 記憶體 | 建議 ≥ 32 GB | Guest 配置 8–16 GB 即充裕,其餘留給 Windows 端工具 |
| 磁碟 | ≥ 200 GB 可用空間(SSD) | VM 磁碟檔加上記憶體交換檔(.vmem 與 memsize 同大小) |
| VMware | VMware Workstation 17.x 或 VMware ESXi | dSPACE 官方虛擬化支援聲明列出 ESXi;Workstation 為 Type-2,實務可用但屬支援聲明之外 |
| Hyper-V / VBS | 必須全部關閉 | idle-detect 能否運作的關鍵前提,詳見下方 |
為什麼 Hyper-V / VBS 必須關閉:當 Windows 啟用 Hyper-V、Virtualization-Based Security(記憶體完整性)、Credential Guard、WSL2 或 Windows Sandbox 任何一項時,VMware Workstation 會退回使用 Windows Hypervisor Platform(WHP)執行。在 WHP 模式下無法將 VT-x 透傳給 Guest,巢狀虛擬化即失效,Guest 內不會出現 /dev/kvm,idle-detect 模式無法啟動。
於 Windows 端以 PowerShell 確認(三項皆須符合):
2.2 Guest 作業系統需求
dSPACE 對 Release 2026-A 的 Linux 支援聲明極為明確,僅列出一個作業系統版本:
「Ubuntu 24.04 LTS with the General Availability Kernel in the Desktop, Server, and Cloud versions」
| 項目 | 要求與說明 |
|---|---|
| 發行版本 | Ubuntu 24.04 LTS 為唯一支援版本。22.04 LTS、26.04 LTS 與各 interim release 均不在清單內(所有 deb 套件皆為 noble) |
| Kernel 變體 | 必須為 GA kernel(linux-generic),非 HWE(linux-generic-hwe-24.04)。詳見 §4.2 |
| Locale | 原廠僅在 US English 環境測試過 |
| 路徑長度 | 不支援 Linux 的 4,096 字元;超過 260 字元行為未定義,工作目錄請置於淺層路徑 |
| 相依元件 | Microsoft .NET 8(VEOS 為 .NET 應用)、rpcbind 或 dSPACE portmapper |
| 權限 | 安裝過程需可用 sudo;但不可用 sudo 直接執行安裝腳本本身 |
3. VMware 虛擬機建立與參數設定
3.1 建議規格
| 裝置 | 建議值 | 理由 |
|---|---|---|
| Processors | 1 socket × 8 cores | 實體主機通常為單 socket;配置多個虛擬 socket 會讓 Guest 排程器依不存在的多路拓撲做快取局部性決策 |
| Memory | 8–16 GB | 雙 POSIX V-ECU 同時執行的實測峰值約 1.7 GB;過度配置會佔用主機磁碟(.vmem 與設定值同大小) |
| Hard Disk | SCSI,100–128 GB(growable) | VEOS 本體約 700 MB;主要空間消耗來自模擬工作目錄 /tmp/veos-*(單次執行可達數百 MB) |
| Network Adapter | NAT(拓撲 B) | Windows 主機經 VMnet8 可連入 Guest;Guest 亦可出網。若需外部機器連入 Guest 則須改 Bridged |
| Virtualization Engine | ☑ Virtualize Intel VT-x/EPT 或 AMD-V/RVI | idle-detect 模式必須勾選;等同 .vmx 中的 vhv.enable = "TRUE" |
| Virtualize CPU performance counters | 建議勾選 | Guest 內可使用 perf 分析效能;使用 dSPACE NMI Profiler 前建議先啟用以排除變數 |
| Virtualize IOMMU | 預設不需要 | 僅在需要將實體裝置(如 GPU)passthrough 至最內層 POSIX V-ECU 時才啟用 |
| Sound / USB / CD-DVD | 可移除 | 模擬主機不需要,減少模擬裝置面 |
| 快照(Snapshot) | 建議不使用 | 巢狀虛擬化與快照併用時,還原後 Guest 內的 KVM 狀態可能出現非預期行為;備份請整個目錄複製 |
3.2 逐步設定
主機端前置
於 BIOS/UEFI 啟用 VT-x / AMD-V;於 Windows 關閉 Hyper-V、記憶體完整性、Credential Guard、WSL2 與 Windows Sandbox,並重新開機。
建立虛擬機
Guest OS 選 Ubuntu 64-bit,依 §3.1 配置處理器、記憶體、磁碟與網路,並移除不需要的裝置。
啟用巢狀虛擬化
VM Settings → Processors → 勾選 Virtualize Intel VT-x/EPT。此區在 VM 執行或暫停時為唯讀,須先完整關機。
關鍵細節:必須完整 power-cycle,Guest 內 reboot 無效。vhv.enable 這類設定只在虛擬機由關機狀態重新開機時才會被重新讀取。若僅在 Guest 內執行 reboot,即使 VMware 介面已顯示勾選、.vmx 也已寫入,Guest 內仍然看不到 vmx 旗標。這是實際導入時最常見的誤判來源之一——設定看起來正確,行為卻不正確。
Guest 內驗證(應大於 0):
對應的 .vmx 關鍵欄位
4. Ubuntu 24.04 安裝要點與 kernel 變體
4.1 Server 版或 Desktop 版
原廠對 Desktop、Server、Cloud 三種版本均明文支援。就 VEOS 模擬主機的用途而言,建議選用 Server 版,理由有三:
-
自動落在原廠支援的 kernel 組態Server ISO 預設安裝 GA kernel,Desktop ISO 預設安裝 HWE kernel(見 §4.2)。
-
釋放主機 CPU 資源icount 模式是純 TCG 單執行緒模擬,主機 CPU 被桌面環境與背景服務佔用時會直接反映在模擬加速比上。
-
整條工作流程不需要 GUIVEOS Simulator / Build / Model Console 均為 CLI;ControlDesk 由 Windows 端連入;XIL API 為網路服務;GDB 與 NMI Profiler 亦皆可經由 CLI 操作。
選 Server 版時必須配套處理一件事:/dev/kvm 的存取權限。Ubuntu 預設是由 systemd 的 uaccess 機制,將 ACL 授予「持有本機 seat session 的使用者」。Server 沒有圖形登入 session,這條 ACL 不會被授予,idle-detect 會以 Permission denied 失敗。解法是執行 dSPACE 隨附的權限腳本,見 §11.3。
4.2 GA kernel 與 HWE kernel
這是一個不會產生任何症狀的偏離,也正因如此特別容易被忽略。
| Kernel 變體 | 套件名稱 | 版本序列 | 原廠支援 |
|---|---|---|---|
| GA(General Availability) | linux-generic | 6.8.0-x | ✅ 原廠明文要求;Server ISO 預設 |
| HWE(Hardware Enablement) | linux-generic-hwe-24.04 | 較新序列 | ❌ 不在支援聲明內;Desktop ISO 預設 |
實務上,HWE kernel 通常可正常執行全部功能。真正的風險出現在需要向 dSPACE 開立技術支援案件時——原廠可能要求先換回 GA kernel 重現問題。因此建議在安裝 dSPACE 產品之前先確認:
若結果出現 linux-generic-hwe-24.04,代表使用的是 HWE。變更 kernel 屬系統層級調整,須一併處理 GRUB 預設開機項,並在變更後確認 kvm_intel 模組仍能正常載入——idle-detect 完全依賴它。
5. 安裝包需求與軟體清單
5.1 產品安裝包
dSPACE Linux 版產品以 tar.gz 形式提供,可自 dSPACE 官方網站的 Products for Linux 頁面下載。每個壓縮包內含 packages.tar(deb 套件集合)與 install-*.sh 安裝腳本;實際安裝邏輯以腳本為準。
| 產品 | 安裝包 | 必要性 | 用途 |
|---|---|---|---|
| VEOS | dspace-veos-2026a.tar.gz | 必要 | Simulator、Build/Model Console、veos-qemu、VEOS Linux kernel、NMI Profiler |
| Bus API | dspace-busapi-2026a.tar.gz | 選用 | 匯流排存取 API;另附 configure-ms-package-server.sh 可自動設定 Microsoft 套件源以取得 .NET 相依 |
| XIL API .NET | dspace-xilapi-2026a.tar.gz | 選用 | ASAM XIL 標準介面,可程式化讀寫模擬內部變數;含 dSPACE Python 3.12 與 pythonnet |
| Real-Time Testing | dspace-rtt-2026a.tar.gz | 選用 | 自動化測試腳本執行環境;含 dSPACE Python 3.12 |
5.2 VEOS 的 deb 套件組成
了解套件組成有助於依需求裁剪安裝範圍——尤其是是否需要 idle-detect 與 POSIX V-ECU 支援。
| 套件 | 功能 | 可省略嗎 |
|---|---|---|
dspace-veos-2026adspace-veos-2026a-all | VEOS 主體與 meta package | 否 |
dspace-veos-simulator-2026a | Simulator 執行核心(64-bit) | 否 |
dspace-veos-simulator-x86-2026a | 32-bit 模擬支援 | 可(INSTALL_VEOS_SIMULATOR_x86=0) |
dspace-veos-linux-2026a | VEOS Linux kernel(idle-detect 模式的 Guest kernel)與 NMI Profiler | 僅在不需 idle-detect 時(INSTALL_VEOS_LINUX_KERNEL=0) |
dspace-veos-qemu-2026a | veos-qemu(POSIX-based V-ECU 執行環境,含 x86_64 / i386 / arm / aarch64) | 僅在不需 POSIX V-ECU 時(INSTALL_VEOS_QEMU=0) |
dspace-veos-servicedspace-veos-service-systemd | VEOS Service:讓遠端 dSPACE 產品(ControlDesk)連入的服務 | 本文拓撲請務必保留,切勿設 INSTALL_VEOS_SERVICE=0 |
共用元件方面,所有 dSPACE Linux 產品皆共用 dspace-base、dspace-installationmanager 與 CodeMeter。這代表授權伺服器只需設定一次,四項產品一體適用。
5.3 安裝結果的目錄配置
| 路徑 | 內容 |
|---|---|
/opt/dspace/veos2026a/bin | VEOS 執行檔與函式庫(veos、veoskernel) |
/opt/dspace/veos2026a/tools/shell | 環境啟用腳本 veos-env.sh |
.../simulator/extensions/qemu/util | 以非 root 執行 idle-detect 所需的權限設定腳本 |
.../simulator/extensions/veos-linux | VEOS Linux kernel 與 dSPACE NMI Profiler |
/tmp/veos-<xy>/ftp/logs | 模擬日誌(位於 /opt/dspace 之外,重開機後清除) |
6. VEOS 逐步安裝流程
官方提供安裝腳本與手動 apt 兩種方法,建議採用安裝腳本。以下為完整步驟。
步驟 1 — 安裝 .NET 8
VEOS 為 .NET 應用,須先具備 .NET 8 執行環境。
套件源衝突警告:若系統已安裝 PowerShell 等微軟產品並設定了 Microsoft 官方套件源,可能與 Ubuntu 內建的 .NET 套件產生衝突,導致 VEOS 安裝失敗。dSPACE 官方文件明確指向 Microsoft 的「linux-package-mixup」說明以釐清此問題。Bus API 安裝包內另附 configure-ms-package-server.sh,可在尚未設定 Microsoft 套件源時自動完成設定。
步驟 2 — 解壓安裝包並設定權限
步驟 3 — 依情境設定環境變數
安裝腳本以環境變數控制安裝範圍與初始設定。在執行腳本前 export,可省去安裝後的補設定作業。
| 環境變數 | 作用 | 本文建議 |
|---|---|---|
CONFIG_LICENSE_SERVERS | 安裝時直接寫入 CodeMeter 的授權伺服器搜尋清單(多台以逗號分隔,可用 IP 或 FQDN) | 建議設定 |
ENABLE_VEOS_REMOTE_ACCESS=1 | 安裝時即啟用 Simulator 遠端存取(等同事後執行 veoskernel config --enable-remote-access) | 拓撲 B 建議設定 |
CONFIG_CLEAR_SERVER_SEARCHLIST=1 | 清除既有的授權伺服器搜尋清單 | 環境變動時使用 |
INSTALL_NON_INTERACTIVE=1 | 非互動安裝,所有詢問視為 yes(須先接受 EULA,見步驟 4) | 自動化部署時 |
INSTALL_CODEMETER_FULL=1 | 安裝完整 CodeMeter(含圖形設定介面)而非 codemeter-lite | Server 版不要設定 |
INSTALL_DSPACE_PORTMAPPER=1 | 改用 dSPACE portmapper 取代系統的 rpcbind | rpcbind 不可用時 |
INSTALL_VEOS_SERVICE=0 | 不安裝 VEOS Service(僅本機使用) | 切勿設定,否則 ControlDesk 無法連入 |
INSTALL_CTUN=1 | 安裝 Container Tunnel(雲端跨 NAT 穿隧) | 桌機 / VM 環境不需要 |
步驟 4 —(非互動模式才需要)預先接受 EULA
步驟 5 — 執行安裝腳本
不要用 sudo 執行安裝腳本本身。腳本會在需要時自行要求提權。若以 sudo 整支執行,安裝過程建立的使用者相關設定會歸屬於 root,可能導致其他使用者無法啟動 VEOS Simulator。這是官方文件明列的注意事項。
步驟 6 — 安裝其他選用產品
Bus API、XIL API、RTT 的安裝流程與 VEOS 相同(解壓 → 權限 → 環境變數 → 執行腳本),建議安裝於同一台機器以共用基礎套件與 CodeMeter。
步驟 7 — 啟用 VEOS 環境(選用但建議)
啟用後可在任何目錄直接使用 veos 指令並支援 Tab 補全,提示字元會出現 (dspace-veos) 前綴。
7. 授權準備:CodeMeter 與浮動授權
dSPACE Linux 產品的授權由 CodeMeter(WIBU-SYSTEMS) 管理。浮動網路授權的運作核心是:讓 VEOS 主機透過網路連到授權伺服器的 TCP 22350 埠,並將該伺服器加入 CodeMeter 的 server search list。
7.1 授權需求盤點
| 授權項目 | 用於 | 說明 |
|---|---|---|
| VEOS 基本授權 | Ubuntu Guest | 載入與執行離線模擬應用 |
VEOS_AAP | Ubuntu Guest | VEOS QEMU Coupling(POSIX-based V-ECU)的必要模組授權。未授權時,veos sim load 會在啟動 QEMU 擴充階段失敗 |
| ControlDesk | Windows 主機 | Windows 端需自行取得授權,並同樣將授權伺服器加入其 CodeMeter 搜尋清單 |
| Bus API / XIL API / RTT | Ubuntu Guest | 依實際使用的產品而定 |
7.2 設定授權伺服器(三選一)
安裝時設定
執行任一 dSPACE 安裝腳本前設定 CONFIG_LICENSE_SERVERS。最省事,適合新機部署。
cmu 指令
安裝後以 cmu --add-server 加入。最常用,也適合事後調整。
WebAdmin
瀏覽器開啟 http://localhost:22350 → Settings → Server Search List。可視化程度最高。
務必使用明確 IP,不要依賴廣播搜尋。dSPACE 安裝腳本預設會執行 disable_license_broadcast,移除廣播位址——這個方向是正確的:廣播(UDP 22350)無法跨越路由網段或 VPN 通道。若授權伺服器位於 VPN 對端或不同網段,必須以明確 IP 加入。
若授權伺服器需經 VPN 存取,請先確認通道已建立且埠可達;並建議將 VPN 用戶端設為常駐服務,避免長時間測試期間通道中斷導致授權失效。
7.3 授權驗證四層法
授權問題之所以難以定位,是因為前面幾層全部通過,仍然可能借不到授權。建議依下列層次逐層確認,可快速判斷問題落在哪一段。
| 層 | 檢查 | 指令 | 通過代表 |
|---|---|---|---|
| 1 | 伺服器在搜尋清單內 | cmu --show-serversearchlist | 設定正確(不代表連得到) |
| 2 | 網路可達 | nc -vz <IP> 22350 | CodeMeter 埠可通 |
| 3 | 看得到網路授權 | cmu --list-servercmu --list-network --all-servers --show-expiration | 伺服器與授權項目可見 |
| 4 | 產品實際借到授權 | veos sim up 不報授權錯誤 | ✅ 授權真正生效 |
兩個高頻誤判,值得單獨記住:
codemeter.service顯示 running 不代表有授權。它只代表授權服務程式已啟動、準備好去尋找授權——如同電表通電不等於本月已繳費。cmu --list顯示0 CmContainer(s)是正常的。該指令只列出本機連接的容器(如 USB dongle);浮動網路授權不會出現在這裡。查網路授權請一律使用--list-server與--list-network。
7.4 授權席位的佔用與釋放
浮動授權是「借用制」。實務上有三點需要納入日常作業流程:
-
被掃描到 ≠ 佔用授權ControlDesk 的「Scan Local Network for Platforms」走的是同子網探測,不需授權;真正借用授權的是載入並執行模擬的那一刻。
-
測試結束務必執行
veos sim down否則授權席位會持續被佔用。共用授權池時,關閉後建議於 License Monitoring 頁面確認席位已釋放。 -
以 WebAdmin 的 License Monitoring 判斷可用量顯示每個授權的總數 / 使用中 / 剩餘。即使網路連得到,
0 free時仍然借不到授權。
8. 安裝後驗證與最小啟動測試
8.1 服務狀態
未啟動時以 sudo systemctl start <service> 啟動。若採用 dSPACE portmapper,改以 /opt/dspace/common/portmapper/bin/portmapper -d 執行。
8.2 啟用 Simulator 遠端存取
順序很重要:必須在啟動 Simulator「之前」啟用。若 Simulator 已在執行中才變更設定,必須依序執行 sim down → veoskernel config → sim up,設定才會生效。
安全提醒:啟用後,同網段任何電腦皆可存取此 Simulator 且無連線驗證。請僅在受信任網段使用;如需限制,可用防火牆規則僅允許 ControlDesk 主機的來源位址。關閉使用 --disable-remote-access。
8.3 最小啟動測試
這一步同時驗證兩件事:授權是否真正可用,以及 Windows 端能否探測到此 Simulator。
| 檢查點 | 通過代表 |
|---|---|
veos sim up 無 license 錯誤 | 授權鏈路可用 |
veos sim info 正常回覆 | Simulator 已啟動 |
veos sim scan 列出本機 | 同子網探測機制正常 |
| ControlDesk 掃描到並可連線 online | ✅ 授權與遠端存取整體貫通 |
9. ControlDesk 從 Windows 端連入
| 用途 | 協定 / 埠 | 備註 |
|---|---|---|
| RPC portmapper | TCP 111 | rpcbind 或 dSPACE portmapper,必須開放 |
| VEOS 模擬服務 | 由 portmapper 動態指派 | 需嚴格防火牆規則時,請向 dSPACE Support 索取該版本的埠清單 |
| CodeMeter 授權 | TCP 22350 | Guest 與 Windows 端各自都要能連到授權伺服器 |
Windows 端操作步驟(實際 UI 以所使用的 ControlDesk 版本為準):
- 於 Windows 端 CodeMeter 加入相同的授權伺服器。
- 確認網路可達 Guest:
Test-NetConnection <GUEST-IP> -Port 111,應回報TcpTestSucceeded : True。Guest 的 IP 可於 Guest 內以hostname -I取得(NAT 模式下取 VMnet8 網段位址)。 - ControlDesk → Platform Manager → Register Platforms → Scan Local Network for Platforms,選取該 VEOS 平台並套用。
- 若掃描不到,回頭確認:Simulator 遠端存取是否已啟用、
rpcbind是否運作、Guest 防火牆是否放行。
多網卡環境的選擇原則:平台探測是「同子網掃描」,因此應選擇與 ControlDesk 同子網的那個 IP,並將該網卡設為固定 IP——ControlDesk 註冊的是 IP,位址變動後平台即失聯。多網卡回報的 hostname 相同,無法據以區分。
10. icount 模式所需的調整與原因
icount 是 VEOS QEMU Coupling 的預設時間同步模式。它以 QEMU 的 TCG(Tiny Code Generator)進行純軟體指令模擬,並依指令計數推進模擬時間:VEOS 每個同步步長內,讓 Guest 執行完該區間應執行的指令數。
10.1 環境層面:幾乎不需要調整
icount 模式不需要 KVM,也不需要巢狀虛擬化。這是它最重要的實務價值——在無法開啟巢狀虛擬化的環境(例如受管制的公司筆電、雲端執行個體、或啟用了 VBS 的 Windows 主機)中,icount 是唯一可用的模式。因此,本文 §3 中與虛擬化相關的設定對 icount 而言均非必要。
| 項目 | icount 是否需要 | 原因 |
|---|---|---|
巢狀虛擬化 vhv.enable | ❌ 不需要 | 全程軟體模擬,不觸及 KVM |
/dev/kvm 權限 | ❌ 不需要 | 同上 |
dspace-veos-linux-2026a | ❌ 可省略 | icount 使用自備的 Guest kernel,不使用 VEOS Linux kernel |
| 虛擬機 CPU 配置 | ⚠ 影響效能 | TCG 為單執行緒,模擬速度取決於單核效能。主機 CPU 被其他負載搶佔會直接反映在加速比上 |
10.2 Guest 映像層面:必須完成的調整
雖然 icount 對主機環境要求寬鬆,但對 Guest 映像(bzImage + rootfs)仍有明確要求。這些調整的共同原因是:VEOS 會接管命令列的一部分參數,且模擬時間由 VEOS 控制。
| 調整項目 | 做法 | 原因 |
|---|---|---|
| 網卡型號 | 明確指定 model=virtio-net-pci | 半虛擬化網卡效率較高;且若日後要切換至 idle-detect,VEOS Linux kernel 不含 e1000 驅動,屆時 Guest 將看不到網卡 |
| 磁碟介面 | if=virtio,format=raw | 與網卡同理,並確保 rootfs 以 /dev/vda 掛載 |
| Console | kernel cmdline 只保留 console=ttyS0,移除 tty1 | VEOS 會自動附加 -nographic;保留 tty1 無實際輸出,且可能造成 getty 卡住 |
| 使用者網路 | 移除原生的 -net user | 虛擬 Ethernet 由 VEOS 接上其 Bus Cluster,不應與 QEMU 預設網路設定衝突 |
| 靜態 IP | Guest 內設定固定位址,停用 DHCP | VEOS 的虛擬 Ethernet cluster 內沒有 DHCP 伺服器;DHCP 會一路等到 timeout,在 icount 下這段等待特別漫長 |
| 時間同步服務 | 全部停用(NTP、chrony、systemd-timesyncd、hwclock --hctosys) | 模擬時間由 VEOS 注入。任何校時動作都會破壞時間同步的一致性 |
| CPU 數 | 建議 -smp 1 | TCG 單執行緒,多核心對模擬速度助益有限,反而增加同步複雜度 |
| 省電與看門狗 | 關閉 watchdog、CPU governor 等機制 | 會干擾時間推進與 idle 行為判定 |
10.3 VEOS 自動接管的參數
撰寫 POSIX-based V-ECU 的 JSON 設定檔時,需要知道哪些參數由 VEOS 控制。重複設定會造成衝突並被拒絕。
| 類別 | icount 模式下的參數 |
|---|---|
| 未指定時自動加入 | -nographic(除非自行提供 -display)、網路裝置參數 |
| 由 VEOS 控制 | -icount、-rtc clock=vm、-accel tcg,thread=single |
| 禁止自訂 | -veos |
11. idle-detect 模式所需的調整與原因
idle-detect 以 KVM 硬體虛擬化執行 Guest,並透過偵測 Guest 進入 idle 狀態來推進模擬時間。其結果是完整的時間同步:Guest 時間與 VEOS 模擬時間一致,多個 Guest 之間處於 lockstep。代價是它對執行環境有一連串硬性要求。
11.1 虛擬化授權鏈:五個環節缺一不可
在 VMware 上執行 idle-detect,本質上是在虛擬機內再執行一層 hypervisor。VT-x 必須從實體 CPU 一路透傳到 Guest 內的 KVM。任一環節斷裂,結果都是 idle-detect 無法啟動——但錯誤訊息會因斷點位置不同而不同,這正是快速定位的關鍵。
BIOS / UEFI 啟用 VT-x
實體 CPU 的虛擬化功能必須在韌體層啟用。
驗證(Windows):HyperVRequirementVirtualizationFirmwareEnabled = True
關閉 Hyper-V 與 VBS
否則 VMware 退回 WHP 模式,無法透傳 VT-x。
驗證:HypervisorPresent = False、VirtualizationBasedSecurityStatus = 0
VM 啟用巢狀虛擬化
勾選 Virtualize Intel VT-x/EPT(vhv.enable = "TRUE"),並執行完整 power-cycle。
驗證(Guest):grep -c ' vmx' /proc/cpuinfo > 0
KVM 模組載入
Guest 內 kvm 與 kvm_intel(或 kvm_amd)須成功載入,並產生 /dev/kvm。
驗證:lsmod | grep kvm、ls -l /dev/kvm
使用者對 /dev/kvm 的存取權限
最容易被忽略的一環。/dev/kvm 存在,不代表執行 VEOS 的使用者開得起來——詳見 §11.3。
11.2 安裝層面的要求
| 項目 | 要求與原因 |
|---|---|
dspace-veos-linux-2026a | 必須安裝。idle-detect 模式下,Guest kernel 由 VEOS 指定為其內附的 VEOS Linux kernel,而非使用者自備的 kernel。切勿設定 INSTALL_VEOS_LINUX_KERNEL=0 |
dspace-veos-qemu-2026a | 必須安裝。提供 veos-qemu 執行檔 |
VEOS_AAP 授權 | 必要。缺少時 veos sim load 會在啟動 QEMU 擴充階段失敗 |
11.3 /dev/kvm 權限:本模式最常見的失敗點
Ubuntu 預設情況下,/dev/kvm 帶有 uaccess 標籤,其存取權是由 systemd-logind 以 ACL 的形式授予「持有本機 seat 上 active session 的使用者」。這代表:在有圖形登入的桌面環境下,一切正常;但一旦離開該情境,權限就會消失。
以下情境會導致權限失效:
- 真正的 headless 執行(無本機登入 session)
- 以另一個使用者身分執行 VEOS
- 由 systemd service、cron 或 CI 排程啟動模擬
- 本機 session 登出之後
- 安裝 Ubuntu Server 版(無圖形 session)
正確且與 session 無關的做法,是執行 dSPACE 隨附的權限設定腳本:
該腳本會依序呼叫三個子腳本,其作用如下:
| 子腳本 | 作用 | 必要性 |
|---|---|---|
configureKvm.sh | 建立 kvm 群組、將使用者加入、安裝 udev 規則並觸發生效 | 必要 |
configureLoop.sh | 建立 loop-control 群組與對應 udev 規則(掛載磁碟映像用) | 建議 |
configureLimits.sh | 於 /etc/security/limits.d 解除 locked RAM 限制 | 僅 GPU passthrough 需要,會互動詢問 |
上述腳本會變更系統設定(群組成員與 udev 規則),請依貴司的系統變更管理程序執行。
11.4 Guest 映像層面的額外要求
idle-detect 對 Guest 映像的要求比 icount 更嚴格,根本原因只有一個:Guest kernel 被替換成 VEOS Linux kernel。使用者自備 rootfs 內的 /lib/modules 版本與之不符,因此無法載入任何核心模組。
| 要求 | 原因 |
|---|---|
| virtio 驅動必須為 built-in,不可為模組 | Guest kernel 已被替換,rootfs 內的模組版本不符而無法 insmod。若 virtio-blk / virtio-net 為模組,Guest 將無磁碟、無網卡 |
網卡必須是 virtio-net-pci | VEOS Linux kernel 不含 e1000 / e1000e 驅動,指定 e1000 時 Guest 內看不到任何網卡 |
| rootfs 須為單一 ext2/ext4 raw 磁碟映像 | VEOS Linux kernel 未啟用 SquashFS 與 OverlayFS |
| init 系統建議採 BusyBox init 或 sysvinit | VEOS Linux kernel 未啟用 CONFIG_MEMCG,systemd 的 cgroup 記憶體控制器不可用,可能導致啟動異常 |
sysfs 必須掛載 | VEOS 的時鐘介面經由 sysfs 提供;pre-start initialization 亦依賴它 |
確認 /dev 已被填充 | 依 rootfs 的建置方式,開機早期可能尚未掛載 devtmpfs,導致無法開啟 /dev/null 與 /dev/console。建議在 init 的第一個動作即掛載 devtmpfs,或於映像內建立靜態裝置節點 |
11.5 VEOS 自動接管的參數
idle-detect 下 VEOS 接管的參數比 icount 更多,撰寫 JSON 設定時不應自行指定 -kernel、-cpu、-smp、-enable-kvm 與 -rtc。
| 類別 | idle-detect 模式下的參數 |
|---|---|
| 未指定時自動加入 | -nographic、-no-reboot、-nodefaults |
| 由 VEOS 控制 | -kernel <VEOS Linux kernel>、-cpu host、-rtc base=epoch,clock=vm,以及 hpet=disable tsc=reliable nohz=off 等 kernel cmdline |
| 禁止自訂 | -veos、-S、-enable-kvm、-smp 1 |
實務提醒:由於 idle-detect 會加入 -nodefaults,QEMU 的預設序列裝置會被取消。若需要在日誌中觀察 Guest 的開機訊息與應用輸出,必須自行於設定中補上序列裝置(例如 -serial stdio),否則 Guest console 將完全沒有輸出——而模擬本身仍會正常執行,容易誤判為 Guest 未開機。
12. 兩種模式的對照與選用建議
| 面向 | icount | idle-detect |
|---|---|---|
| 執行方式 | TCG 軟體模擬(單執行緒) | KVM 硬體虛擬化 |
| Guest kernel | 使用者自備 | 由 VEOS 指定(VEOS Linux kernel) |
| 是否需要 KVM | ❌ 不需要 | ✅ 必須(含巢狀虛擬化) |
| 時間同步程度 | 部分同步(依指令數截斷) | 完全同步(偵測 idle 才推進) |
| 多節點時間一致性 | 各節點時間各自獨立 | lockstep,各節點時間相同 |
| 典型加速比 | 約 0.95(模擬時間略慢於實時) | 約 1.000 |
| Guest 開機速度 | 較慢(純軟體模擬) | 顯著較快(原生執行) |
| Guest 核心模組 | 可正常使用 | ❌ 版本不符,無法載入 |
| GDB 中斷點凍結模擬時間 | ❌ 不支援 | ✅ 支援 |
| NMI Profiler | ❌ 不支援 | ✅ 支援 |
| Pre-start initialization | ❌ | ✅ |
選擇 icount 的情境
- 環境無法開啟巢狀虛擬化(受管制主機、部分雲端執行個體、Windows 已啟用 VBS)
- 需要使用自備的 Guest kernel驗證特定 kernel 設定或驅動
- Guest 內需要載入自行編譯的核心模組
- 建置與導入階段:先以 icount 打通完整流程,再評估是否升級至 idle-detect
選擇 idle-detect 的情境
- 需要多節點之間嚴格的時間一致性(lockstep)
- 需要接近實時的模擬速度與較短的迭代週期
- 需要 GDB 除錯且要求中斷點凍結模擬時間
- 需要使用 dSPACE NMI Profiler 分析 Guest 內的執行熱點
導入建議:兩種模式並非二選一。實務上建議先以 icount 打通「映像 → JSON 設定 → 匯入 OSA → 執行 → 觀測」的完整鏈路,此時環境變數最少、失敗點最容易定位;待流程穩定後,再處理巢狀虛擬化與 /dev/kvm 權限,切換至 idle-detect 取得時間同步精度。由於兩者對 Guest 映像的要求高度重疊(virtio、靜態 IP、停用校時、單一 raw rootfs),依本文 §10.2 建置的映像通常可直接沿用於 idle-detect。
13. 錯誤訊息判讀對照表
建置階段最耗時的往往不是修正本身,而是定位。下表整理實務上高頻出現的訊息與其對應斷點。
| 訊息 / 現象 | 斷點位置 | 處理方向 |
|---|---|---|
Could not access KVM kernel module: | /dev/kvm 不存在 | 巢狀虛擬化未生效。檢查 §11.1 的環節 1–3,特別是是否已完整 power-cycle |
Could not access KVM kernel module: | /dev/kvm 存在但無權存取 | 執行 §11.3 的 configure.sh 並登出再登入 |
CodeMeter License Server not found | 授權伺服器不可達 | 確認網路 / VPN 通道與 TCP 22350;依 §7.3 逐層驗證 |
user maximum ... reached | 授權席位已被佔用 | 不是伺服器故障。多為前一次模擬未關閉,執行 veos sim down 釋放 |
找不到 VEOS_AAP 授權 | 模組授權未涵蓋 | QEMU Coupling 需獨立的模組授權,請確認授權範圍 |
| ControlDesk 掃描不到平台 | 遠端存取或 RPC | 確認遠端存取已於 sim up 之前啟用、rpcbind 運作中、防火牆放行 TCP 111 |
| Guest console 完全沒有輸出, 但模擬正常執行 | 序列裝置未設定 | idle-detect 會加入 -nodefaults,須自行補上序列裝置(§11.5) |
| Guest 開機後看不到網卡 | 網卡型號不相容 | idle-detect 下必須使用 virtio-net-pci;VEOS Linux kernel 不含 e1000 驅動 |
| Guest 開機停滯數十秒後才繼續 | DHCP 逾時 | 虛擬 Ethernet cluster 內無 DHCP 伺服器,請改為靜態 IP(§10.2) |
| VEOS 指令透過 SSH 或腳本呼叫時無回應 | CLI 等待標準輸入 | veos model 系列指令會讀取 stdin,非互動呼叫時請附加 < /dev/null |
14. 上線前檢查清單
主機與虛擬機
- ☐ BIOS/UEFI 已啟用 VT-x / AMD-V
- ☐ Hyper-V、VBS、Credential Guard、WSL2 均已關閉
- ☐ VM 已勾選 Virtualize VT-x/EPT 並完整 power-cycle
- ☐ CPU 拓撲為 1 socket × N cores
- ☐ 網路模式符合部署拓撲(拓撲 B 用 NAT)
- ☐ 未建立快照
作業系統
- ☐ Ubuntu 24.04 LTS
- ☐ Kernel 為 GA(
linux-generic) - ☐ Locale 為 US English
- ☐ .NET 8 已安裝且無套件源衝突
- ☐
codemeter與rpcbind服務運作中 - ☐ Guest 內
grep -c ' vmx' /proc/cpuinfo> 0(idle-detect)
授權
- ☐ 授權伺服器已在搜尋清單內
- ☐ TCP 22350 可達
- ☐
cmu --list-server看得到伺服器 - ☐ License Monitoring 顯示有可借席位
- ☐
VEOS_AAP已涵蓋(QEMU Coupling) - ☐ Windows 端 ControlDesk 授權已設定
功能驗證
- ☐
veos sim up無授權錯誤 - ☐
veos sim info/scan正常 - ☐ ControlDesk 掃描並連線成功
- ☐ idle-detect:
id | grep kvm有結果 - ☐ idle-detect:模擬加速比接近 1.000
- ☐ 測試結束執行
veos sim down
結語
以 VMware 搭配 Ubuntu 24.04 建置 dSPACE VEOS 模擬環境,技術上並不困難,但其中幾個環節具有「設定看似正確、行為卻不正確」的特性——巢狀虛擬化需要完整 power-cycle 才生效、/dev/kvm 的權限可能綁定於登入 session、codemeter.service 運作不等於已取得授權、遠端存取必須在啟動 Simulator 之前啟用。這些環節無法透過單一檢查涵蓋,需要依層次逐一驗證。
建議的導入路徑是:先以 icount 模式打通完整鏈路,此時環境依賴最少、問題最容易定位;待流程穩定後再處理虛擬化授權鏈,切換至 idle-detect 以取得完整的時間同步與除錯能力。由於兩種模式對 Guest 映像的要求高度重疊,這條路徑不會造成重工。
關於本文
本文依據 dSPACE Release 2026-A 官方文件(VEOS Manual、How to Install VEOS 2026-A on Ubuntu Linux、Basics on VEOS QEMU Coupling、Real-Time Testing on Linux)與安裝腳本之實際行為整理,並補充 Jotactic 捷策動能於實際導入專案中累積的工程實務經驗。文中所有網路位址與使用者名稱均為佔位符,請依實際環境替換。
若貴司正在評估或導入 VEOS on Linux、POSIX-based V-ECU 模擬,或需要將既有 Buildroot / Yocto 映像整合至 VEOS 模擬環境,歡迎與我們聯繫,我們可提供環境建置、映像調整與整合測試的完整技術協助。