仮想マシンでWindows専用ゲームをやりたい
背景
ubuntuにしてからwindowsアプリが使えなくなって色々と諦めていました。
ゲームはブラウザゲーか、steamで動くものしかできないと諦めていました。
しかし、一部、wineで動くゲームもありました。
- ドラゴンボールスーパーカードゲーム フージョンワールド デジタルカードゲーム版
ずっとやっていたアラド戦記は動かずだったので諦めていましたが、ふと仮想マシンで動かそうと考えました。
事前テスト
一応音も出て、コントローラーも認識しましたが、動きましたが、カクカクでした。
3,4年位遊んでなくて不慣れなのもありますが..
グラボを認識させたい
グラボのPCIホストデバイス パススルーに挑戦しようと思います。
条件として
- 既存のグラボはそのままホストマシン(Ubuntu22)で利用する。
- もう1枚グラボを搭載し、そちらをパススルーさせる。
- USBコントローラーもホストマシンとは別で認識させる。
導入前の構成
導入前のベンチマーク
導入
先に結果
導入後のベンチマーク
?数字が高いほうが、いいんですよね...?
環境
key | value |
---|---|
Host OS | Ubuntu 22.04 |
CPU | AMD |
Host GPU | NVIDIA GTX 1070 Ti |
Guest GPU | AMD RX470 |
Virtualization | QEMU/KVM,libvirtd |
Guest OS | Windows 11 |
仮想マシンマネージャ
apt install qemu-kvm qemu-utils libvirt-daemon-system libvirt-clients bridge-utils virt-manager ovmf
手順
結論
同じスペックのビデオカードだとNG
下記のサイトにて同一GPUまたは同一型番での方法がありましたがかなり手間となる+kernelをカスタマイズしないといけないので諦めました。
別の型のものであれば、すんなり導入可能でした。
ただし、Win11だとCPUが2個しか認識しない。ベンチの結果もGPUパススルー導入後はむしろ下がりゲームもかくかくでした。
ネタで終わってしまった感
異なるGPUでGPUパススルーした手順を以下に纏めます。
参考
事前準備
- PCI x 16にguest OS用のGPUを追加します。
- PCI番号が若いほうがディスプレイ出力されるスロットとなりますのでホスト機で利用するGPUを若い番号のスロットに挿します。
- M/Bによってはプライマリ出力をBIOSで変更出来るものもあるかと思いますが自分の環境ではできませんでした。
- ab350-pro4 は下のPCIx16スロットが00000000:01:00.0、上の方が00000000:26:00.0
- PCI番号が若いほうがディスプレイ出力されるスロットとなりますのでホスト機で利用するGPUを若い番号のスロットに挿します。
- BIOSでVirtualizationを有効にする。
- advance settingのCPUのところ
- BIOSでIOMMUを有効にする。
- advance settingのsouth bridgeのところ
- 起動後、2枚認識していることを確認する。
lspci | grep VGA
2枚共同じベンダのものであれば、
nvidia-smiなどでも認識されているか確認する。
IOMMUの有効化
cp -ip /etc/default/grub{,.org}
vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on iommu=pt"
intel cpuの場合は、intel_iommu=on
update-grub && reboot
dmesg |grep AMD-Vi
PCIバス番号調査
ocarina@ab350-pro4:~$ nvidia-smi |grep GTX
| 0 NVIDIA GeForce GTX 1070 Ti Off | 00000000:01:00.0 On | N/A |
| 1 NVIDIA GeForce GTX 1070 Ti Off | 00000000:26:00.0 On | N/A |
ocarina@ab350-pro4:~$ lspci -vv | grep -i msi -B 1
26:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] (rev a1) (prog-if 00 [VGA controller])
Subsystem: Micro-Star International Co., Ltd. [MSI] GP104 [GeForce GTX 1070 Ti]
--
26:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] GP104 High Definition Audio Controller
ocarina@ab350-pro4:~$
ocarina@ab350-pro4:~$
ocarina@ab350-pro4:~$
ocarina@ab350-pro4:~$
ocarina@ab350-pro4:~$ lspci -vv | grep -i zotac -B 1
01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] (rev a1) (prog-if 00 [VGA controller])
Subsystem: ZOTAC International (MCO) Ltd. GP104 [GeForce GTX 1070 Ti]
--
01:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)
Subsystem: ZOTAC International (MCO) Ltd. GP104 High Definition Audio Controller
ocarina@ab350-pro4:~$
root@ab350-pro4:/home/ocarina# lspci -nn|grep -i nvidia
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] [10de:1b82] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation GP104 High Definition Audio Controller [10de:10f0] (rev a1)
26:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] [10de:1b82] (rev a1)
26:00.1 Audio device [0403]: NVIDIA Corporation GP104 High Definition Audio Controller [10de:10f0] (rev a1)
root@ab350-pro4:/home/ocarina#
root@ab350-pro4:/home/ocarina# diff /etc/default/grub{,.org}
11,13c11
< #01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] [10de:1b82] (rev a1)
< #01:00.1 Audio device [0403]: NVIDIA Corporation GP104 High Definition Audio Controller [10de:10f0] (rev a1)
< GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt vfio-pci.ids=10de:1b82,10de:10f0"
---
> GRUB_CMDLINE_LINUX=""
vfid-pci.idsの値を調べたものに書き換え
仮想マシンに割り当てたいグラボ(zotac)がメイン扱いになってBIOSがどうしてもそっちに出力されるため、2枚のスロットを差し替えました。
ocarina@ab350-pro4:~$ lspci -vv | grep -i zotac -B 1
26:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] (rev a1) (prog-if 00 [VGA controller])
Subsystem: ZOTAC International (MCO) Ltd. GP104 [GeForce GTX 1070 Ti]
--
26:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)
Subsystem: ZOTAC International (MCO) Ltd. GP104 High Definition Audio Controller
ocarina@ab350-pro4:~$ lspci -vv | grep -i msi -B 1
01:00.0 VGA compatible controller: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] (rev a1) (prog-if 00 [VGA controller])
Subsystem: Micro-Star International Co., Ltd. [MSI] GP104 [GeForce GTX 1070 Ti]
--
01:00.1 Audio device: NVIDIA Corporation GP104 High Definition Audio Controller (rev a1)
Subsystem: Micro-Star International Co., Ltd. [MSI] GP104 High Definition Audio Controller
ocarina@ab350-pro4:~$
root@ab350-pro4:/home/ocarina# lspci -nnv -s 01:00.0
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] [10de:1b82] (rev a1) (prog-if 00 [VGA controller])
Subsystem: Micro-Star International Co., Ltd. [MSI] GP104 [GeForce GTX 1070 Ti] [1462:c303]
Flags: bus master, fast devsel, latency 0, IRQ 77, IOMMU group 13
Memory at f6000000 (32-bit, non-prefetchable) [size=16M]
Memory at e0000000 (64-bit, prefetchable) [size=256M]
Memory at f0000000 (64-bit, prefetchable) [size=32M]
I/O ports at f000 [size=128]
Expansion ROM at 000c0000 [virtual] [disabled] [size=128K]
Capabilities: [60] Power Management version 3
Capabilities: [68] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [78] Express Legacy Endpoint, MSI 00
Capabilities: [100] Virtual Channel
Capabilities: [128] Power Budgeting <?>
Capabilities: [420] Advanced Error Reporting
Capabilities: [600] Vendor Specific Information: ID=0001 Rev=1 Len=024 <?>
Capabilities: [900] Secondary PCI Express
Kernel driver in use: nvidia
Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia
root@ab350-pro4:/home/ocarina# lspci -nnv -s 26:00.0
26:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1070 Ti] [10de:1b82] (rev a1) (prog-if 00 [VGA controller])
Subsystem: ZOTAC International (MCO) Ltd. GP104 [GeForce GTX 1070 Ti] [19da:2445]
Flags: bus master, fast devsel, latency 0, IRQ 78, IOMMU group 15
Memory at f4000000 (32-bit, non-prefetchable) [size=16M]
Memory at c0000000 (64-bit, prefetchable) [size=256M]
Memory at d0000000 (64-bit, prefetchable) [size=32M]
I/O ports at e000 [size=128]
Expansion ROM at f5000000 [virtual] [disabled] [size=512K]
Capabilities: [60] Power Management version 3
Capabilities: [68] MSI: Enable+ Count=1/1 Maskable- 64bit+
Capabilities: [78] Express Legacy Endpoint, MSI 00
Capabilities: [100] Virtual Channel
Capabilities: [128] Power Budgeting <?>
Capabilities: [420] Advanced Error Reporting
Capabilities: [600] Vendor Specific Information: ID=0001 Rev=1 Len=024 <?>
Capabilities: [900] Secondary PCI Express
Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia
root@ab350-pro4:/home/ocarina# dmesg |grep AMD-Vi
[ 0.000000] AMD-Vi: Unknown option - 'on'
[ 0.000000] AMD-Vi: Using global IVHD EFR:0xf77ef22294ada, EFR2:0x0
[ 0.243367] pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported
[ 0.244408] pci 0000:00:00.2: AMD-Vi: Found IOMMU cap 0x40
[ 0.244410] AMD-Vi: Extended features (0xf77ef22294ada, 0x0): PPR NX GT IA GA PC GA_vAPIC
[ 0.244419] AMD-Vi: Interrupt remapping enabled
[ 0.244427] AMD-Vi: Virtual APIC enabled
root@ab350-pro4:/home/ocarina#
https://wiki.archlinux.jp/index.php/OVMF_%E3%81%AB%E3%82%88%E3%82%8B_PCI_%E3%83%91%E3%82%B9%E3%82%B9%E3%83%AB%E3%83%BC#.E3.82.B2.E3.82.B9.E3.83.88.E3.81.A8.E3.83.9B.E3.82.B9.E3.83.88.E3.81.A7.E5.90.8C.E3.81.98_GPU_.E3.82.92.E4.BD.BF.E3.81.86
https://qiita.com/tailriver/items/2021e48c136e803cce89
パススルー設定
zotacとMSIのnvidiaの型番が一緒のためNGだったから、中古でRX470を購入
ocarina@ab350-pro4:~$ lspci -nn |grep -i amd\/ati
26:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] [1002:67df] (rev cf)
26:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590] [1002:aaf0]
ocarina@ab350-pro4:~$
ocarina@ab350-pro4:~$ grep ^GRUB_CMDLINE_LINUX= /etc/default/grub
GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt vfio-pci.ids=1002:67df,1002:aaf0"
ocarina@ab350-pro4:~$
ocarina@ab350-pro4:~$ sudo update-grub
virt-manager
ハードウェアの追加からPCIホストデバイスで該当GPUのvideoとaudioを追加します
起動
起動してradeonのドライバを割り当てた
パススルーしてもカクカク!