MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
設定 - KVMのGPUパススルーのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
設定 - KVMのGPUパススルー
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == ここでは、Linuxホスト上にWindows10の仮想マシンを構築して、グラフィックボードやUSBポートを物理PCと同様に使用できるように設定する。<br> <br> Linuxの欠点の1つは、利用できるゲームがそれほど多くないことである。<br> 最近では、多くのゲームがLinuxに移植されたのは事実であるが、一般的には、ゲームはほぼWindows専用に開発されている。<br> Linuxユーザとして、これらのWindowsゲームをプレイするために、4つの方法がある。<br> * Wineを使用してプレイする(Wineは、通常、古いゲームで機能する) * デュアルブートセットアップを使用して、ゲームをプレイするたびにWindowsをブートする。(手間が掛かる) * Windowsの仮想マシンでプレイする。(グラフィック性能が活かせない) * GPUパススルーを備えたWindowsの仮想マシンを使用する。(ハードウェアの前提条件がいくつかあり、特定のCPUとGPUでのみ機能するが、適切なハードウェアがあれば可能である) <br> 基本的な設定の流れは、以下のようになる。<br> # CPUの仮想化支援機能(Intel VT-xまたはAMD-Vi)を有効にする # グラフィックボードのパススルー設定 ## IOMMUの有効化 ## Linuxホストのグラフィックボード無効化 # kvm / qemuのインストール # ゲストOS作成 ## チューニング -> インストール # グラフィックボードのパススルー # USBポートのパススルー設定 <br> <br> ここでは、実際に設定を行うPCの環境は、以下の通りである。<br> * 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) <br><br> == 前提条件 == # 2枚以上のグラフィックボード(マザーボード内蔵でも可)が必要である #: 1つはLinuxホストで使用され、もう1つはWindowsを実行している仮想マシン(以降、VMという)で使用される。 #: また、VMにIntel統合GPU(Intel UHD等)を使用することはできない。ATI製またはnVidia製のみ使用できる。 #: ただし、LinuxホストにIntel統合GPUを使用することはできる。 # グラフィックボードがUEFIに対応していること。<br>[https://www.techpowerup.com/vgabios/ こちらのWebサイト]に記載されているグラフィックボードであればよい。 # CPUの機能において、Intel VT-DまたはAMD-Viをサポートするマザーボードが必要である。 #: リストの一部は[https://en.wikipedia.org/wiki/List_of_IOMMU-supporting_hardware このWebサイト]にある。BIOS上で有効にする必要がある。 # PCIのルートポートは、VMで使用するGPUと同じIOMMUグループの一部であってはならない。(詳細は後述) # VMが使用するプライマリディスプレイの空き入力ポートまたはセカンダリディスプレイの空き入力ポートがあること。 <br><br> == BIOSの設定 == まず最初に、BIOSの設定画面を表示して、以下の項目の設定を変更する。<br> なお、以下の項目はマザーボードがGIGABYTE X570UDのものである。<br> * 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]に変更する。 <br><br> == KVM / QEMUのインストール == KVM / QEMUおよび依存関係のライブラリをインストールする。<br> # SUSE sudo zypper install libvirt libvirt-client libvirt-daemon virt-manager virt-install virt-viewer qemu qemu-kvm qemu-ovmf-x86_64 qemu-tools <br> [https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso こちらのWebサイト]から、VirtIOドライバをダウンロードする。<br> <br><br> == IOMMUの有効化 == Intel VT-xとAMD-Viは、一般的にIOMMUと呼ばれる。<br> IOMMUを有効にするには、/etc/default/grubファイル(ブートローダファイル)にあるGRUB_CMDLINE_LINUX_DEFAULTセクションに以下の設定を追記する。<br> # Intel CPU intel_iommu=on iommu=pt # AMD CPU amd_iommu=on iommu=pt <br> grubを再構築するために、以下のコマンドを実行する。<br> grub2-mkconfig -o /boot/grub2/grub.cfg <br> Linuxを再起動する。<br> 再起動後、IOMMUが有効になっているか確認するため、以下のコマンドを実行する。<br> # Intel CPU dmesg | grep -e DMAR -e IOMMU # AMD CPU dmesg | grep AMD-Vi <br> 有効化されている場合は、以下のようなメッセージが出力される。<br> # 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 <br> 次に、IOMMUグループが有効であることを確認する。<br> 以下のシェルスクリプトを作成して実行する。(ここでは、シェルスクリプトのファイル名をlsIOMMU.shとする)<br> <source lang="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; </source> <br> # 実行 chmod u+x lsIOMMU.sh sudo ./lsIOMMU.sh <br> 出力結果は下図のようになる。この図から、2つのことが分かる。<br> VMで使用するデバイスがどのIOMMUグループであるか(下図の場合は、グループ11)およびそのベンダー/モデルID(下図の場合は、1002:683fおよび1002:aab0)である。<br> この出力結果は、IOMMUグループ内で(関連付けられているオーディオデバイスを無視して)単独のデバイスに対してのみ機能する。<br> [[ファイル:GPU PassThrough 1.jpg|フレームなし|中央]] <br><br> == 複数のGPUの分離 == 2つ以上のGPUを分離する必要がある。<br> これは、異なるメーカーのGPUが2つある場合(ここでは、VMで使用するGPUをブラックリストに登録するだけ)は非常に簡単であるが、<br> 両方のGPUが同じベンダーのものである場合は少し複雑になる。<br> また、両方のGPUが同じモデルの場合、さらに複雑になる。<br> GPUが同じベンダーのものであったとしても、両方のGPUが完全に同じモデルでない限り、この設定に従うことができる。<br> また、グラフィックカードのHDMIオーディオデバイスもパススルーすること。<br> <br> <span style="color: #A00000><u>'''ただし、この設定では、2つの全く同一のGPUでは機能しないので注意すること。(Radeon RX550が2枚など)'''</u></span><br> <br> <u>'''2つのグラフィックボードがそれぞれ異なる場合(nVidia製とATI製)'''</u><br> /etc/modprobe.d/50-blacklist.confファイルを編集して、以下の内容を追記する。<br> # LinuxホストにATI製グラフィックボード、VMにnVidia製グラフィックボードを使用する場合 blacklist nouveau blacklist nvidia # LinuxホストにnVidia製グラフィックボード、VMにATI製グラフィックボードを使用する場合 blacklist amdgpu blacklist radeon <br> <u>'''2つのグラフィックボードが同じ場合(両方ともnVidia製または両方ともATI製)'''</u><br> まず、/etc/modprobe.d/gpu-passthrough.confファイルを作成して、以下のように編集する。<br> ここで、<VMで使用するGPUのベンダー>と<VMで使用するGPUのモデルID>は、上記セクションで実行したlsIOMMU.shの出力結果に記載されている。<br> options vfio-pci ids=<VMで使用するGPUのベンダー>,<VMで使用するGPUのモデルID> <br> 例えば、上記セクションの結果から、以下のように記述する。<br> options vfio-pci ids=1002:683f,1002:aab0 <br> 次に、/etc/default/grubファイルのGRUB_CMDLINE_LINUX_DEFAULTセクションに以下を追記する。<br> rd.driver.pre=vfio-pci <br><br> == initrdの再構築 == 必要な全てのモジュールを含めるには、initrdを再構築する必要がある。<br> /etc/dracut.conf.d/gpu-passthrough.confファイルを作成して、以下のように編集する。<br> (先頭と末尾にスペースが必要なので注意すること)<br> # 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 " <br> initrdを再構築するために、以下のコマンドを実行する。<br> sudo dracut -f /boot/initrd $(uname -r) <br> initrdの再構築の完了後、Linuxホストを再起動する。<br> 設定ミスで失敗すると、Linuxホストが起動できなくなる可能性があるので注意すること。<br> <br><br> == GPUが分離されていることを確認 == GPUが分離されているか確認する。<br> 以下のコマンドを実行して、使用中のカーネルドライバーを探す。<br> sudo lspci -nnk <br> 分離する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 <br><br> == 注意事項 == 別のHDD / SSDに仮想マシンを配置する場合、初期設定ではアクセス権限エラーになる。<br> そこで、/etc/libvirt/qemu.confファイルに以下の設定を追記する。<br> # /etc/libvirt/qemu.confファイル ・ ・ ・ user = "root" group = "root" <br> また、別のHDD / SSDに仮想マシンを配置する時は、配置先のディレクトリで以下のコマンドを実行する。<br> 以下では、<仮想マシン名>.qcow2ファイルを最大50[GB]の領域で仮想マシンを作成している。<br> qemu-img create -f qcow2 <仮想マシン名>.qcow2 50G <br><br> == ゲストOSの作成 == 予め、[https://www.microsoft.com/en-us/software-download/windows10ISO Microsoftの公式Webサイト]で、Windows10のisoファイルをダウンロードする。<br> <br> # まず、/etc/libvirt/qemu.confファイルを開いて、nvramセクションを以下のうように編集する。 #: nvram = ["/usr/share/qemu/ovmf-x86_64.bin:/usr/share/qemu/ovmf-x86_64-code.bin"] # libvirtデーモンを再起動する。 #: sudo systemctl restart libvirtd #: 必要であれば、以下のように、libvirtdを自動起動するように設定する。 #: sudo systemctl enable libvirtd # Virtual Machine Managerを起動して、新しいVMを作成する。<br>Architecture Optionには、Local Install Mediaとx86_64を選択する。 # Use ISO Imegeを選択して、WindowsのISOファイルを選択する。 # VMに割り当てるメモリとCPUコアの数を選択する。 # VMのディスクイメージを作成する。(既にに定義されている場合は選択する。また、ディスク全体でも構わない。パスをそこに配置して、ホストにマウントされていないことを確認する) # VMに名前を付けて、Customize configuration before installがチェックされていることを確認して、Finishボタンを押下する。 # VM構成画面(以降、メイン画面とする)に移動する。画面左の[Overview]で、UEFIファームウェアとi440FXチップセットを選択する。<br>i440FXよりQ35の方がより良いかもしれない。また、UEFIファームウェアを選択しなくともよい可能性がある。 # メイン画面左の[CPUs]で、[Configuration]項目の[Model: ]にhost-passthroughを設定する。(リストにない場合は、host-passthroughと入力する) # メイン画面左下の[Add Hardware]ボタンを押下すると、[Add New Virtual Hardware]画面が表示される。<br>この画面左の[Controller]を選択して、[Type: ]項目にSCSI、[Model: ]項目にVirtIO SCSIと入力する。<br>(パフォーマンスを向上させるために、タイプを必ずVirtIO SCSIに変更する) # メイン画面左の[SCSI Disk 1]を選択して、[Advanced Options]項目の[Disk bus]項目にSCSIを選択する。 # [Add New Virtual Hardware]画面左の[Storage]を選択して、[管理]ボタンを押下してvirtio-win-<バージョン名>.isoファイルを選択してマウントする。<br>[デバイスの種類]項目には、CD-ROMデバイスを選択する。 # [Add New Virtual Hardware]画面左の[PCI Host Device]を選択して、分離されたGPUを追加する。<br>サウンドデバイスがあり、ディスプレイに(HDMIまたはディスプレイポート経由で)サウンド出力がある場合は、サウンドカード(ここでは、PCIデバイス02:00.1)も追加する。 # [Add New Virtual Hardware]画面左の[USB Host Device]を選択して、キーボードとマウスを追加する。追加のペアがある場合は、VMが起動すると入力が取得されるため、より適切である。 # 同様に、不要なデバイス(タブレット、ディスプレイスパイス、コンソール、チャンネルスパイス、ビデオQXL等)を全て削除する。<br>ディスプレイにサウンド出力がない場合またはVGA経由で接続する場合は、サウンドカードが必要である。<br>1000円程度の安価なUSBサウンドカードを購入してPCに取り付けた場合、キーボードとマウスを追加したように追加する。 # VMに割り当てたばかりのグラフィックボードをディスプレイに接続し、[Begin Installation]ボタンを押下する。<br>全て正しく設定されていれば、そのディスプレイにVMが起動していることがわかる。 # Windowsをインストールする。<br>上記(2)でダウンロードしたVirtIOドライバーが必要である。(vioscsiディレクトリの下に存在する) # Windowsのインストール完了後、[https://symless.com/synergy Synergy(有償ソフトウェア)]をインストールできる。<br>これは、物理的なKVM(Keyboard-Video-Mouse)スイッチなしで、複数のPCで同じキーボードとマウスを使用できる。 <br><br> == エラー時の対処方法 == ===== 仮想マシンのGPUパススルーに関するエラー(error code 43) ===== 仮想マシンのデバイスマネージャでグラフィックボードを確認すると、"エラー43:ドライバーの読み込みに失敗しました"と表示されて、正常に機能しない場合がある。<br> この問題は、NVidia GeForceシリーズのみ起こり(QuadroやTeslaにはこの問題は無い)、ユーザが仮想マシンでそれらを使用しようとすると、機能を意図的に無効化する。<br> 理由としては、仮想マシンでグラフィックカードを実行できるようになると、自社の製品の売上に悪影響を与える可能性があるからである。<br> <br> GeforceのGPUパススルーを正常に動作させるには、ハイパーバイザがその存在を隠すことで出来る。<br> 具体的な手順は以下の通りである。<br> # まず、仮想マシンを停止する。 # GPUパススルーを行う仮想マシンのxmlファイルを、以下のように編集する。 #: sudo EDITOR=nano virsh edit <仮想マシン名> #: <br> #: 以下に示すように、<code>vendor_id</code>項目を<code><hyperv></code>セクション内に追記する。この時、<code>value=</code>の値はどんなものでもよい。 #: <vendor_id state='on' value='123456789ab'/> #: <br> #: 次に、状態を非表示にするようにkvmに指示するため、<code><hyperv></code>セクション外の直下に次のコードを追記する。 #: <kvm><br> <hidden state='on'/><br></kvm> #: <br> # また、QEMU 4.0上において、仮想マシンにQ35チップセットを使用する場合、<code>features</code>セクション内に<code><ioapic driver = 'kvm' /></code>も追記する必要がある。 # 最後に、libvirtdを再起動する。 #: sudo systemctl restart libvirtd <br> ===== ネットワーク ===== VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br> ERROR Requested operation is not valid: network 'default' is not active <br> まず、以下のコマンドを実行する。<br> sudo virsh net-list --all <br> この時、以下のメッセージが出力された場合は、sudo virsh net-start defaultを実行する。<br> 今後、このネットワークを自動起動するには、sudo virsh net-autostart --network defaultを実行する。<br> 名前 状態 自動起動 永続 ------------------------------------------------ default 停止状態 いいえ (no) はい (yes) <br> また、以下のようにネットワークが表示されない場合は、default.xmlファイルに次に示す内容を記述して、デフォルトネットワークを作成する。<br> Name State Autostart Persistent ---------------------------------------------------------- <br> # default.xmlファイル <source lang="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> </source> <br> 次に、そのネットワークをKVMホストに永続的に追加するには、以下のコマンドを実行する。<br> sudo virsh net-define --file default.xml <br> ===== ファイアーウォール ===== VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br> error: Failed to start network default error: internal error: Failed to initialize a valid firewall backend <br> この時、ファイアーウォールサービスをインストールする。<br> sudo zypper install firewalld <br> サービスを有効にして、ネットワークを再び機能させるために、次のコマンドを実行する。<br> sudo systemctl enable --now firewalld sudo systemctl restart libvirtd <br> ===== DNSマスカレード ===== VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br> error: Failed to start network default error: Cannot check dnsmasq binary /usr/sbin/dnsmasq: No such file or directory <br> この時、DNSマスカレードをインストールする。<br> sudo zypper install dnsmasq <br><br> __FORCETOC__ [[カテゴリ:CentOS]][[カテゴリ:SUSE]]
設定 - KVMのGPUパススルー
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse