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

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核心:

1
$ sudo pacman -S linux-lts linux-lts-headers

然後卸載Stable核心:

1
$ sudo pacman -Rscn linux linux-headers

重新產生grub.cfg:

1
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

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

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

1
$ sudo vim /etc/pacman.conf

修改IgnorePkg:

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

然後執行:

1
$ sudo pacman -Syyu

安裝dkms模組

首先安裝dkms:

1
$ sudo pacman -S dkms

然後clone模組倉庫:

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

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

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

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

安裝這個模組:

1
$ sudo dkms install -m i915-sriov-dkms -v 6.1

核心將重新開始編譯。

啓用immou

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

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

更新grub:

1
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

更新mkinitcpio:

1
$ sudo mkinitcpio -p linux-lts

重新啓動電腦。

建立VF

安裝sysfsutils:

1
$ sudo pacman -S sysfsutils

將最大VF數量寫入檔案:

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

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

1
$ lspci |grep VGA

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

建立VF:

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

然後重新使用lspci

1
$ lspci |grep VGA

輸出應當如下:

1
2
3
4
5
6
7
8
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的時候自動啓動。希望之後可以到到比較好的方法。