仮想マシンでWindows専用ゲームをやりたい

2024年3月13日

背景

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をカスタマイズしないといけないので諦めました。

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

別の型のものであれば、すんなり導入可能でした。

ただし、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
  • 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のドライバを割り当てた

パススルーしてもカクカク!

Posted by ocarina