「設定 - KVMのGPUパススルー」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
130行目: 130行目:
また、グラフィックカードのHDMIオーディオデバイスもパススルーすること。<br>
また、グラフィックカードのHDMIオーディオデバイスもパススルーすること。<br>
<br>
<br>
<span style="color: #A00000><u>'''ただし、この設定では、2つの全く同一のGPUでは機能しないので注意すること。'''</u></span><br>
<span style="color: #A00000><u>'''ただし、この設定では、2つの全く同一のGPUでは機能しないので注意すること。(Radeon RX550が2枚など)'''</u></span><br>
<br>
<br>
<u>'''2つのグラフィックボードがそれぞれ異なる場合(nVidia製とATI製)'''</u><br>
<u>'''2つのグラフィックボードがそれぞれ異なる場合(nVidia製とATI製)'''</u><br>
140行目: 140行目:
  # LinuxホストにnVidia製グラフィックボード、VMにATI製グラフィックボードを使用する場合
  # LinuxホストにnVidia製グラフィックボード、VMにATI製グラフィックボードを使用する場合
  blacklist amdgpu
  blacklist amdgpu
または
  blacklist radeon
  blacklist radeon
<br>
<br>

2020年7月16日 (木) 16:10時点における版

概要

ここでは、Linuxホスト上にWindows10の仮想マシンを構築して、グラフィックボードやUSBポートを物理PCと同様に使用できるように設定する。

Linuxの欠点の1つは、利用できるゲームがそれほど多くないことである。
最近では、多くのゲームがLinuxに移植されたのは事実であるが、一般的には、ゲームはほぼWindows専用に開発されている。
Linuxユーザとして、これらのWindowsゲームをプレイするために、4つの方法がある。

  • Wineを使用してプレイする(Wineは、通常、古いゲームで機能する)
  • デュアルブートセットアップを使用して、ゲームをプレイするたびにWindowsをブートする。(手間が掛かる)
  • Windowsの仮想マシンでプレイする。(グラフィック性能が活かせない)
  • GPUパススルーを備えたWindowsの仮想マシンを使用する。(ハードウェアの前提条件がいくつかあり、特定のCPUとGPUでのみ機能するが、適切なハードウェアがあれば可能である)


基本的な設定の流れは、以下のようになる。

  1. CPUの仮想化支援機能(Intel VT-xまたはAMD-Vi)を有効にする
  2. グラフィックボードのパススルー設定
    1. IOMMUの有効化
    2. Linuxホストのグラフィックボード無効化
  3. kvm / qemuのインストール
  4. ゲストOS作成
    1. チューニング -> インストール
  5. グラフィックボードのパススルー
  6. USBポートのパススルー設定



ここでは、実際に設定を行うPCの環境は、以下の通りである。

  • CPU : Ryzen 3900X
  • マザーボード : GIGABYTE X570 UD(BIOS F12e)
  • GPU1 : 玄人志向 Radeon RX550 LP
  • GPU2 : GIGABYTE GeForce GT1030
  • OS : SUSE(カーネル : 4.12.14-lp151.28.52-default)



前提条件

  1. 2枚以上のグラフィックボード(マザーボード内蔵でも可)が必要である
    1つはLinuxホストで使用され、もう1つはWindowsを実行している仮想マシン(以降、VMという)で使用される。
    また、VMにIntel統合GPU(Intel UHD等)を使用することはできない。ATI製またはnVidia製のみ使用できる。
    ただし、LinuxホストにIntel統合GPUを使用することはできる。
  2. グラフィックボードがUEFIに対応していること。
    こちらのWebサイトに記載されているグラフィックボードであればよい。
  3. CPUの機能において、Intel VT-DまたはAMD-Viをサポートするマザーボードが必要である。
    リストの一部はこのWebサイトにある。BIOS上で有効にする必要がある。
  4. PCIのルートポートは、VMで使用するGPUと同じIOMMUグループの一部であってはならない。(詳細は後述)
  5. VMが使用するプライマリディスプレイの空き入力ポートまたはセカンダリディスプレイの空き入力ポートがあること。



BIOSの設定

まず最初に、BIOSの設定画面を表示して、以下の項目の設定を変更する。
なお、以下の項目はマザーボードがGIGABYTE X570UDのものである。

  • AMD-Viの有効化
    [M.I.T.] - [高度な周波数設定] - [Advanced CPU Settings] - [SVM Mode]を[Enable]に変更する。
  • IOMMUの有効化
    [チップセット] - [IOMMU]を[Enable]に変更する。
  • ACSの有効化
    [周辺機器] - [AMD CBS] - [ACS Enable]を[Enable]に変更する。
  • AER Capの有効化
    [周辺機器] - [AMD CBS] - [Enable AER Cap]を[Enable]に変更する。



KVM / QEMUのインストール

KVM / QEMUおよび依存関係のライブラリをインストールする。

# SUSE
sudo zypper install libvirt libvirt-client libvirt-daemon virt-manager virt-install virt-viewer qemu qemu-kvm qemu-ovmf-x86_64 qemu-tools


こちらのWebサイトから、VirtIOドライバをダウンロードする。


IOMMUの有効化

Intel VT-xとAMD-Viは、一般的にIOMMUと呼ばれる。
IOMMUを有効にするには、/etc/default/grubファイル(ブートローダファイル)にあるGRUB_CMDLINE_LINUX_DEFAULTセクションに以下の設定を追記する。

# Intel CPU
intel_iommu=on iommu=pt 

# AMD CPU
amd_iommu=on iommu=pt


grubを再構築するために、以下のコマンドを実行する。

grub2-mkconfig -o /boot/grub2/grub.cfg


Linuxを再起動する。
再起動後、IOMMUが有効になっているか確認するため、以下のコマンドを実行する。

# Intel CPU
dmesg | grep -e DMAR -e IOMMU

# AMD CPU
dmesg | grep AMD-Vi


有効化されている場合は、以下のようなメッセージが出力される。

# Intel CPU
DMAR: IOMMU enabled
・
・
・

# AMD CPU
[    2.192533] pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported
[    2.194012] pci 0000:00:00.2: AMD-Vi: Found IOMMU cap 0x40
[    2.194012] pci 0000:00:00.2: AMD-Vi: Extended features (0x58f77ef22294ade):
[    2.194014] AMD-Vi: Interrupt remapping enabled
[    2.194014] AMD-Vi: Virtual APIC enabled
[    2.194014] AMD-Vi: X2APIC enabled
[    2.194123] AMD-Vi: Lazy IO/TLB flushing enabled


次に、IOMMUグループが有効であることを確認する。
以下のシェルスクリプトを作成して実行する。(ここでは、シェルスクリプトのファイル名をlsIOMMU.shとする)

 #!/bin/bash
 
 shopt -s nullglob
 for d in /sys/kernel/iommu_groups/*/devices/*; do
    n=${d#*/iommu_groups/*}; n=${n%%/*}
    printf 'IOMMU Group %s ' "$n"
    lspci -nns "${d##*/}"
 done;


# 実行
chmod u+x lsIOMMU.sh
sudo ./lsIOMMU.sh


出力結果は下図のようになる。この図から、2つのことが分かる。
VMで使用するデバイスがどのIOMMUグループであるか(下図の場合は、グループ11)およびそのベンダー/モデルID(下図の場合は、1002:683fおよび1002:aab0)である。
この出力結果は、IOMMUグループ内で(関連付けられているオーディオデバイスを無視して)単独のデバイスに対してのみ機能する。

GPU PassThrough 1.jpg



複数のGPUの分離

2つ以上のGPUを分離する必要がある。
これは、異なるメーカーのGPUが2つある場合(ここでは、VMで使用するGPUをブラックリストに登録するだけ)は非常に簡単であるが、
両方のGPUが同じベンダーのものである場合は少し複雑になる。
また、両方のGPUが同じモデルの場合、さらに複雑になる。
GPUが同じベンダーのものであったとしても、両方のGPUが完全に同じモデルでない限り、この設定に従うことができる。
また、グラフィックカードのHDMIオーディオデバイスもパススルーすること。

ただし、この設定では、2つの全く同一のGPUでは機能しないので注意すること。(Radeon RX550が2枚など)

2つのグラフィックボードがそれぞれ異なる場合(nVidia製とATI製)
/etc/modprobe.d/50-blacklist.confファイルを編集して、以下の内容を追記する。

# LinuxホストにATI製グラフィックボード、VMにnVidia製グラフィックボードを使用する場合
blacklist nouveau
blacklist nvidia

# LinuxホストにnVidia製グラフィックボード、VMにATI製グラフィックボードを使用する場合
blacklist amdgpu
blacklist radeon


2つのグラフィックボードが同じ場合(両方ともnVidia製または両方ともATI製)
まず、/etc/modprobe.d/gpu-passthrough.confファイルを作成して、以下のように編集する。
ここで、<VMで使用するGPUのベンダー>と<VMで使用するGPUのモデルID>は、上記セクションで実行したlsIOMMU.shの出力結果に記載されている。

options vfio-pci ids=<VMで使用するGPUのベンダー>,<VMで使用するGPUのモデルID>


例えば、上記セクションの結果から、以下のように記述する。

options vfio-pci ids=1002:683f,1002:aab0


次に、/etc/default/grubファイルのGRUB_CMDLINE_LINUX_DEFAULTセクションに以下を追記する。

rd.driver.pre=vfio-pci 



initrdの再構築

必要な全てのモジュールを含めるには、initrdを再構築する必要がある。
/etc/dracut.conf.d/gpu-passthrough.confファイルを作成して、以下のように編集する。
(先頭と末尾にスペースが必要なので注意すること)

# Intel CPU
add_drivers+=" pci_stub vfio vfio_iommu_type1 vfio_pci vfio_virqfd kvm kvm_intel "

# AMD CPU
add_drivers+=" pci_stub vfio vfio_iommu_type1 vfio_pci vfio_virqfd kvm kvm_amd "


initrdを再構築するために、以下のコマンドを実行する。

sudo dracut -f /boot/initrd $(uname -r)


initrdの再構築の完了後、Linuxホストを再起動する。
設定ミスで失敗すると、Linuxホストが起動できなくなる可能性があるので注意すること。


GPUが分離されていることを確認

GPUが分離されているか確認する。
以下のコマンドを実行して、使用中のカーネルドライバーを探す。

sudo lspci -nnk


分離するGPU(VMで使用するGPU)を確認するには、Kernel driver in use:と記載されいている箇所を探す。 正常に分離されていれば、vfio-pciと記載される。

02:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Cape Verde PRO [Radeon HD 7750/8740 / R7 250E]
Subsystem: PC Partner Limited / Sapphire Technology Device a001
Kernel driver in use: vfio-pci
Kernel modules: radeon
02:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Cape Verde/Pitcairn HDMI Audio [Radeon HD 7700/7800 Series]
Subsystem: PC Partner Limited / Sapphire Technology Device aab0
Kernel driver in use: vfio-pci
Kernel modules: snd_hda_intel



注意事項

別のHDD / SSDに仮想マシンを配置する場合、初期設定ではアクセス権限エラーになる。
そこで、/etc/libvirt/qemu.confファイルに以下の設定を追記する。

# /etc/libvirt/qemu.confファイル
・
・
・
user = "root"
group = "root"


また、別のHDD / SSDに仮想マシンを配置する時は、配置先のディレクトリで以下のコマンドを実行する。
以下では、<仮想マシン名>.qcow2ファイルを最大50[GB]の領域で仮想マシンを作成している。

qemu-img create -f qcow2 <仮想マシン名>.qcow2 50G



ゲストOSの作成

予め、Microsoftの公式Webサイトで、Windows10のisoファイルをダウンロードする。

  1. まず、/etc/libvirt/qemu.confファイルを開いて、nvramセクションを以下のうように編集する。
    nvram = ["/usr/share/qemu/ovmf-x86_64.bin:/usr/share/qemu/ovmf-x86_64-code.bin"]
  2. libvirtデーモンを再起動する。
    sudo systemctl restart libvirtd
    必要であれば、以下のように、libvirtdを自動起動するように設定する。
    sudo systemctl enable libvirtd
  3. Virtual Machine Managerを起動して、新しいVMを作成する。
    Architecture Optionには、Local Install Mediaとx86_64を選択する。
  4. Use ISO Imegeを選択して、WindowsのISOファイルを選択する。
  5. VMに割り当てるメモリとCPUコアの数を選択する。
  6. VMのディスクイメージを作成する。(既にに定義されている場合は選択する。また、ディスク全体でも構わない。パスをそこに配置して、ホストにマウントされていないことを確認する)
  7. VMに名前を付けて、Customize configuration before installがチェックされていることを確認して、Finishボタンを押下する。
  8. VM構成画面(以降、メイン画面とする)に移動する。画面左の[Overview]で、UEFIファームウェアとi440FXチップセットを選択する。
    i440FXよりQ35の方がより良いかもしれない。また、UEFIファームウェアを選択しなくともよい可能性がある。
  9. メイン画面左の[CPUs]で、[Configuration]項目の[Model: ]にhost-passthroughを設定する。(リストにない場合は、host-passthroughと入力する)
  10. メイン画面左下の[Add Hardware]ボタンを押下すると、[Add New Virtual Hardware]画面が表示される。
    この画面左の[Controller]を選択して、[Type: ]項目にSCSI、[Model: ]項目にVirtIO SCSIと入力する。
    (パフォーマンスを向上させるために、タイプを必ずVirtIO SCSIに変更する)
  11. メイン画面左の[SCSI Disk 1]を選択して、[Advanced Options]項目の[Disk bus]項目にSCSIを選択する。
  12. [Add New Virtual Hardware]画面左の[Storage]を選択して、[管理]ボタンを押下してvirtio-win-<バージョン名>.isoファイルを選択してマウントする。
    [デバイスの種類]項目には、CD-ROMデバイスを選択する。
  13. [Add New Virtual Hardware]画面左の[PCI Host Device]を選択して、分離されたGPUを追加する。
    サウンドデバイスがあり、ディスプレイに(HDMIまたはディスプレイポート経由で)サウンド出力がある場合は、サウンドカード(ここでは、PCIデバイス02:00.1)も追加する。
  14. [Add New Virtual Hardware]画面左の[USB Host Device]を選択して、キーボードとマウスを追加する。追加のペアがある場合は、VMが起動すると入力が取得されるため、より適切である。
  15. 同様に、不要なデバイス(タブレット、ディスプレイスパイス、コンソール、チャンネルスパイス、ビデオQXL等)を全て削除する。
    ディスプレイにサウンド出力がない場合またはVGA経由で接続する場合は、サウンドカードが必要である。
    1000円程度の安価なUSBサウンドカードを購入してPCに取り付けた場合、キーボードとマウスを追加したように追加する。
  16. VMに割り当てたばかりのグラフィックボードをディスプレイに接続し、[Begin Installation]ボタンを押下する。
    全て正しく設定されていれば、そのディスプレイにVMが起動していることがわかる。
  17. Windowsをインストールする。
    上記(2)でダウンロードしたVirtIOドライバーが必要である。(vioscsiディレクトリの下に存在する)
  18. Windowsのインストール完了後、Synergy(有償ソフトウェア)をインストールできる。
    これは、物理的なKVM(Keyboard-Video-Mouse)スイッチなしで、複数のPCで同じキーボードとマウスを使用できる。



エラー時の対処方法

ネットワーク

VM起動時に下記のエラーが出力されて、VMが起動できないことがある。

ERROR    Requested operation is not valid: network 'default' is not active


まず、以下のコマンドを実行する。

sudo virsh net-list --all


この時、以下のメッセージが出力された場合は、sudo virsh net-start defaultを実行する。
今後、このネットワークを自動起動するには、sudo virsh net-autostart --network defaultを実行する。

名前      状態       自動起動      永続
------------------------------------------------
default   停止状態   いいえ (no)   はい (yes)


また、以下のようにネットワークが表示されない場合は、default.xmlファイルに次に示す内容を記述して、デフォルトネットワークを作成する。

Name                 State      Autostart     Persistent
----------------------------------------------------------


# default.xmlファイル
 <network>
   <name>default</name>
   <uuid>9a05da11-e96b-47f3-8253-a3a482e445f5</uuid>
   <forward mode='nat'/>
   <bridge name='virbr0' stp='on' delay='0'/>
   <mac address='52:54:00:0a:cd:21'/>
   <ip address='192.168.122.1' netmask='255.255.255.0'>
     <dhcp>
       <range start='192.168.122.2' end='192.168.122.254'/>
     </dhcp>
   </ip>
 </network>


次に、そのネットワークをKVMホストに永続的に追加するには、以下のコマンドを実行する。

sudo virsh net-define --file default.xml


ファイアーウォール

VM起動時に下記のエラーが出力されて、VMが起動できないことがある。

error: Failed to start network default
error: internal error: Failed to initialize a valid firewall backend


この時、ファイアーウォールサービスをインストールする。

sudo zypper install firewalld


サービスを有効にして、ネットワークを再び機能させるために、次のコマンドを実行する。

sudo systemctl enable --now firewalld
sudo systemctl restart libvirtd


DNSマスカレード

VM起動時に下記のエラーが出力されて、VMが起動できないことがある。

error: Failed to start network default
error: Cannot check dnsmasq binary /usr/sbin/dnsmasq: No such file or directory


この時、DNSマスカレードをインストールする。

sudo zypper install dnsmasq