Linux 虛擬化打機心得 Part 1

長久以來,遊戲市場對於 Linux 平台絕對是沒什麼競爭力。原生遊戲稀少之餘很多時都沒人會玩,一般遊戲開發商對個人電腦市場亦只會推出 Windows 或是 Mac 版本。因此有一段很長時間, Linux 使用者主要靠 Wine 程式模擬 Windows 環境來玩 Windows 遊戲。

近年發展可能漸趨成熟,遊戲產業出現些微變化。例如以 Wine 為底層的 PlayOnLinux 提供一鍵安裝介面簡化玩 Windows 遊戲的難度。知名遊戲平台 Stream 亦提供 Linux 客戶端;除此以外更進一步推出 Linux 發行版 StreamOS,為改善開源遊戲市場做出不少貢獻。

由於先天性的技術限制 ,Wine 效能不佳,能成功運行的遊戲並不多。Wine 開發進度緩慢目前只支援到 DirectX 9.0 c ,意味著過去數年推出的遊戲大部分都玩不了。 Value 在 Steam 上的努力確實帶動不少社群投入開源遊戲移植與開發。但相關工作有不少難度且非一朝一夕之事,要令全數遊戲支援 Linux 系統更是天方夜譚。

筆者主要使用 Linux 系統多年,工作上以至生活習慣經已無法脫離。解決辦法例如 Dual Boot 缺點是不能同時間享受兩個系統帶來的好處,另外再買一台電腦玩遊戲會太花錢又浪費空間。剛好最近家中多出一張顯示卡,如果花點時間弄弄就能在原有的 Linux 系統上玩不同的主流遊戲,Why not?

若果想法相同,下面的心得或者會適合你。

VGA Passthrough

VGA Passthrough 並非新事物,技術已經存在多年。簡單來說就是透過虛擬化技術把連接了顯示卡的插槽穿透虛擬層,直接將物理設置連接到虛擬機 (PCI Passthrough) ,實現與裸機系統相比接近零差距的效能表現。

再簡單一句話就是,在 Linux 系統上設一台 Windows 虛擬機打遊戲。

Linux 虛擬化技術

1_nFUPIlIUkFwETptGO4iFvA.png
KVM 架構圖

KVM (Kernel-Based Virtual Machine) 是一個 Linux 內核模組提供硬件全虛擬化,結合 QEMU 模擬器組成全虛擬機技術,利用 libvirt 進行虛擬設備管理。

以下是筆者的電腦規格,設備上可能有點舊,不過操作上絕無區別。唯一需要注意是使用新舊版 Ubuntu 指令是否會有不同。下面的內容主要是針對 Intel / NVIDIA 架構而設,除此以外的配備(如 AMD/ATI )在設定上會有些微不同,那部分就留待大家自行尋找。

Software
Host OS: Ubuntu 16.04.5 LTS
Hardware
CPU: Intel® Xeon(R) CPU E3–1245 V2 @ 3.40GHz × 8
Motherboard: Gigabyte GA-H77N-WIFI (LGA 1155, Intel® h77 chipset)
Memory: Kingston 16GB (2x8GB DDR3 1600Mhz)
Graphic: Gigabyte NVIDIA GTX 1050 Ti

硬件檢測

實現全虛擬化技術需要硬件支援,並非任何一台電腦都適合的,基本上查一下 CPU 和 主機板的規格就能斷定 。以 Intel 架構來說我們需要確認 VT-x VT-d 兩者有否支援。如果是知道處理器型號的話,比較簡單的就是到官方網站看規格:https://ark.intel.com/zh-tw

1_JRkKrusrd6MY3fF73raUdw.png
Intel 官方網頁會標示出 CPU 的 VT-x , VT-d 的支援狀況

至於主機板的支援情況比較模糊,還是直接在電腦上操作比較理想。

VT-x (Intel Virtualization Technology)

運行以下指令,若果回傳 vmx 則代表 CPU 支援 VT-x 技術。

> grep --color vmx /proc/cpuinfo

不過支援歸支援,能不能用有沒有打通是另一回事。

輸入下面指令,回傳 3 或 5 代表 VT-x 功能已經正常啟動:

> sudo apt-get install msr-tools -y 
> sudo modprobe msr          # load msr module
> sudo rdmsr 0x3a            # check if VT-x is enabled in UEFI

簡單 3 行指令看似複雜,背後意思其實是在查閱 CPU MSR 寄存器的值; 地址 0x3a (IA32_FEATURE_CONTROL) 控制 Intel VT-x 功能的開關。

注意 VT-x 功能必需在 BIOS 設成啟用,若果以上指令回傳其他數值不妨到這𥚃檢查一下再重試。

1__QnQncTIdhLgtWyBM2jJ3Q
BIOS VTx 設定

IOMMU

 

1_lYWkCsMmqqVPgYmFT1zTbw.png
IOMMU功能啟動後系統的運作結構

IOMMU(Input/Output Memory Management Unit)是北橋技術的一部分,實現例子有 VT-d (Intel Virtualization Technology for Directed I/O) 或是 AMD-Vi (AMD’s I/O Virtualization Technology),其作用是實踐I/O虛擬化,能夠將不同的物理I/O設備分配到虛擬機或與虛擬機群共用。上面提到的 VGA Passthrough 技巧就是透過 IOMMU 達成。

同樣地,Vt-d 功能需要在 BIOS 中啟用 ,預設是關閉的。若果你找不到這個設定,很大可能代表這張主機板沒有 Vt-d 功能。必須換一張有 Vt-d 功能的主機板才能繼續下面各部分。

1_rYSFxUAk82flWJuRHoC_tg.jpeg
BIOS VT-d 設定

在 Ubuntu 中啟用 IOMMU

打開 /etc/default/grub 尋找下面這個變數,在引號最後位置添加intel_iommu=on

GRUB_CMDLINE_LINUX_DEFAULT="…"

例子:

# 添加前
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
# 添加後
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on"

輸入 update-grub 更新 grub 設置後重啟電腦。

檢查 IOMMU 啟用狀態

網上普遍方法是查閱系統啟動訊息,筆者發現很多教學都是用下面這個方法來確認,但其實不準確甚至可以說是錯誤的。

> dmesg | grep -i iommu
DMAR: IOMMU enabled …

這個方法實際上只是在系統啟動時檢查 grub 是否帶有 “intel_iommu=” 參數,除此以外別無其它用意。正確的做法應該是這樣:

dmesg | grep "Directed I/O"
0_-48j7vu0WA_KBgp4

無法成功打開的朋友們很抱歉,這代表該設備不具備全虛擬化能力,你可以嘗試更換一下處理器或者主機板。重點是必需通過這一關才能繼續下一個部分。

開機模式

近代電腦的開機模式 (Boot Mode) 通常是用 UEFI 模式而非舊有的 Legacy BIOS。除非特別原因,否則安裝主流 Linux Distros 例如 Ubuntu,在一般情況下預設會以 UEFI 模式安裝。

驗證方法相當簡單,如果以 UEFI 啟動系統會掛載 efi 目錄,否則就是以 Legacy BIOS 啟動。用下面指令查一下該目錄是否存在:

ls /sys/firmware/efi

在接下來的內容會以 UEFI 模式進行,若發現系統用的是 Legacy BIOS,你可能需要找方法設成 UEFI。
事實上顯示卡亦需確認是否 UEFI-Ready。由於驗證方法比較麻煩,而且近年大部分的都支援 UEFI,選用主流顯示卡應該沒有問題,超過八年以上的才有需要核實一下。

上面提到的兩種啟動模式,其實都有機會達成目的。如果你的顯示卡太舊不妨嘗試以 Legacy BIOS 方式操作,設定上有些微不同且步驟較多,詳細要自行到網上搜索。

圖像處理器

要成功 VGA Passthrough,電腦設備必需要有至少 2 個圖像處理器,簡單達成方法有:

  1. 2張外置顯示卡
  2. 1張外置顯示卡,1個內置顯示的處理器

用指令確認系統是不是偵測到 2 個 VGA :

lspci | grep VGA

0_dB7y_lv8ax7Nx2ll.png
偵測出 2 個圖像控制器

(1)憑肉眼相信已經可以確認,所以上面方法是為(2)而設。這一步主要是了解正在使用的處理器是否具有內置顯示能力。除了可以從官方網站確認之外,在電腦上直接操作也行。另外這個方法對 (1) 亦適用。

如果 CPU 內置圖像處理器,Intel 官方網站會列出其規格

到這𥚃硬件檢測的部分就結束了。如果上面沒問題代表硬件已經準備就緒,剩下的都是軟件問題。

待續 –

Advertisements