[Linux折騰] Intel Xe Graphics架構內顯在Archlinux上開啓SR-IOV虛擬化的過程

2024 年 2 月 8 日
文章摘要
FakeGPT
加載中...
此內容由人工不智慧生成。

Introduction

衆所周知,Intel 在第五代到第十代 Core 處理器(代號 Broadwell 到 Comet Lake)上推出了 Intel GVT-g 技術,可以將內顯 GPU 切分爲幾個虛擬化 VF,從而將虛擬化的 VF 直通給 KVM 虛擬機,提升虛擬機的性能(雖然 Intel 內顯的圖形效能口碑巨爛,但是總比 QXL 和 VirtIO 強一點……)

然而,在11代之後,內顯的架構升級到了 Xe Graphics,竟然不支援 iGVT-g 技術了,取而代之的是 SR-IOV 特性。但是支援內顯 SR-IOV 特性的 Linux 核心至今沒有 merge 到 Linux 核心的主線,僅僅存在於 Intel 的 custom 核心。

然而,得益於 Github 大佬 strongtz 的努力,一款 DKMS 核心模組被提取了出來。雖然該模組之前是爲了 Proxmox VE 平臺準備的,但是對於 ArchLinux 仍然可以使用。這就讓我們這篇筆記成爲了可能。

主機配置

  • OS: ArchLinux
  • Display: Wayland
  • WM: Hyprland
  • CPU: 11th Gen Intel i5-11300H (8) @ 4.400GHz
  • GPU1: Intel TigerLake-LP GT2 [Iris Xe Graphics]
  • GPU2: NVIDIA GeForce MX450
  • Memory: 16GB

配置步驟

降級核心版本到6.6

截止到 113年2月8日,模組的作者聲稱該模組支援的核心版本從 6.1 到 6.5,但是在 issue 我找到了其他人 merge 到 main 分支的一個 PR,支援到了 6.6。我在 6.6 下測試透過,但是在 6.7 下編譯失敗。

在 ArchLinux 上,我採用的是將核心從 Stable 切換到 LTS 並鎖定 pacman 版本,因爲我在寫這篇筆記的時候 LTS 核心的版本恰好是 6.6。

當然,你也可以手動編譯核心。

首先安裝 LTS 核心:

Terminal window
$ sudo pacman -S linux-lts linux-lts-headers

然後卸載 Stable 核心:

Terminal window
$ sudo pacman -Rscn linux linux-headers

重新產生 grub.cfg

Terminal window
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

重啓電腦,你的核心版本應已經切換到了 6.6 LTS。

爲了鎖定核心版本,我們需要禁用核心隨 pacman 的更新:

Terminal window
$ sudo vim /etc/pacman.conf

修改 IgnorePkg:

/etc/pacman.conf
IgnorePkg = linux-lts, linux-lts-headers

然後執行:

Terminal window
$ sudo pacman -Syyu

安裝 dkms 模組

首先安裝 dkms:

Terminal window
$ sudo pacman -S dkms

然後 clone 模組倉庫:

Terminal window
$ git clone git@github.com:strongtz/i915-sriov-dkms.git

進入倉庫,修改 dkms.conf 檔案,修改 PACKAGE_NAMEi915-sriov-dkmsPACKAGE_VERSION6.1

將整個倉庫目錄遷移到 /usr/src/

Terminal window
$ sudo cp -r i915-sriov-dkms/ /usr/src/i915-sriov-dkms-6.1/

安裝這個模組:

Terminal window
$ sudo dkms install -m i915-sriov-dkms -v 6.1

核心將重新開始編譯。

啓用 immou

修改 /etc/default/grub,加入核心引數:

/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT = "intel_iommu=on i915.enable_guc=3 i915.max_vfs=7"

更新 grub:

Terminal window
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

更新 mkinitcpio:

Terminal window
$ sudo mkinitcpio -p linux-lts

重新啓動電腦。

建立VF

安裝 sysfsutils:

Terminal window
$ sudo pacman -S sysfsutils

將最大 VF 數量寫入檔案:

Terminal window
$ sudo echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf

注意,使用lspci指令來查看你的內顯是否掛載在 0.2.0Bus:

Terminal window
$ lspci |grep VGA

輸出應當如下:
00:02.0 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)

建立 VF:

Terminal window
$ sudo echo 7 > /sys/bus/pci/devices/0000\:00\:02.0/sriov_numvfs

然後重新使用 lspci

Terminal window
$ lspci |grep VGA

輸出應當如下:

00:02.0 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)
00:02.1 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)
00:02.2 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)
00:02.3 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)
00:02.4 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)
00:02.5 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)
00:02.6 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)
00:02.7 VGA compatible controller: Intel Corporation TigerLake-LP GT2 [Iris Xe Graphics] (rev 01)

完成。

Trouble Shooting

目前我遇到的最大的問題是:重新啓動電腦後 numvfs 的數量就被清零。目前沒有找到比較好的方法來解決。只好寫一個 script,讓它在啓動 Hyprland 的時候自動啓動。希望之後可以到到比較好的方法。

[Linux折騰] Intel Xe Graphics架構內顯在Archlinux上開啓SR-IOV虛擬化的過程
https://blog.kynix.tw/posts/1731033445664/
作者
Adrian Chen
建檔時間
2024 年 2 月 8 日
協議
BY-NC-SA 4.0
姓名標示-非商業性-相同方式分享 4.0 國際