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> ==== F12までのBIOS ==== * 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> ==== F12より新しいBIOS ==== * AMD-Viの有効化 *: [M.I.T.] - [高度な周波数設定] - [Advanced CPU Settings] - [SVM Mode]を[Enable]に変更する。 * IOMMUの有効化 *: [チップセット] - [IOMMU]を[Enable]に変更する。 * IOMMUの有効化 *: [周辺機器] - [AMD CBS] - [NBIO Common Options] - [IOMMU]を[Enable]に変更する。 * ACSの有効化 *: [周辺機器] - [AMD CBS] - [NBIO Common Options] - [ACS Enable]を[Enable]に変更する。 * AER Capの有効化 *: [周辺機器] - [AMD CBS] - [NBIO Common Options] - [Enable AER Cap]を[Enable]に変更する。 <br><br> == GPUパススルーの自動設定 == もし、下記のセクションの手動設定が面倒と考える場合、以下の自動設定を行うシェルスクリプトをダウンロードする。<br> [[ファイル:GPU-PassThrough.zip|フレームなし|中央]] <br> まず、gpu-passthrough.shをスーパーユーザ権限で実行する。<br> これは、必要なソフトウェアをインストールして、GPUパススルーに必要な設定を行った後、initrdを再構築するシェルスクリプトである。<br> sudo ./gpu-passthrough.sh <br> SUSEを再起動する。<br> <br> 次に、分離するGPU(VMで使用するGPU)を確認する。<br> Kernel driver in use:と記載されいている箇所を探す。正常に分離されていれば、<code>vfio-pci</code>と記載される。 sudo lspci -nnk <br> KVMを起動して、[QEMU/KVM]にフォーカスを当てて[編集]メニュー - [接続の詳細]を選択する。<br> [接続の詳細]画面が起動するので、[仮想ネットワーク]タブを選択して、[Autostart:]項目の[On Boot]チェックボックスにチェックを入力する。<br> <br> 後は、下記の[ゲストOSの作成]セクションに移動して、VMの作成および設定を行う。<br> <br> なお、この方法は、https://www.youtube.com/watch?v=Nu2bHV8mA6c を参考にしている。<br> <br><br> == KVM / QEMUのインストール == KVM / QEMUおよび依存関係のライブラリをインストールする。<br> * SLES / openSUSE *: <code>sudo zypper install libvirt libvirt-client libvirt-daemon virt-manager virt-install virt-viewer \</code> *: <code>qemu qemu-kvm qemu-ovmf-x86_64 qemu-tools \</code> *: <code>biosdevname</code> *: <br> * SLED *: ソースコードからKVMとQEMUをインストールする場合、[[インストール - KVM#ソースコードからインストール]]を参照する。 *: <br> *: または、以下のパッケージをダウンロードして、~/.profileファイル等に環境変数PATHおよびLD_LIBRARY_PATHを追記する。 *: libvirt : https://software.opensuse.org/package/libvirt *: libvirt-client : https://software.opensuse.org/package/libvirt-client *: libvirt-daemon : https://software.opensuse.org/package/libvirt-daemon *: virt-manager : https://software.opensuse.org/package/virt-manager *: virt-install : https://software.opensuse.org/package/virt-install *: virt-viewer : https://software.opensuse.org/package/virt-viewer?search_term=virt-viewer *: qemu : https://software.opensuse.org/package/qemu *: qemu-kvm : https://software.opensuse.org/package/qemu-kvm *: qemu-ovmf-x86_64 : https://software.opensuse.org/package/qemu-ovmf-x86_64 *: qemu-tools : https://software.opensuse.org/package/qemu-tools?search_term=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> <code>iommu=pt</code>は、カーネルにDMA変換をメモリにバイパスするように指示する。これにより、パフォーマンスが向上する場合がある。<br> # Intel CPU intel_iommu=on iommu=pt # AMD CPU amd_iommu=on iommu=pt <br> grubを再構築するために、以下のコマンドを実行する。<br> sudo 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 [ 1.643621] pci 0000:00:00.2: AMD-Vi: IOMMU performance counters supported [ 1.645069] pci 0000:00:00.2: AMD-Vi: Found IOMMU cap 0x40 [ 1.645069] pci 0000:00:00.2: AMD-Vi: Extended features (0x58f77ef22294ade): [ 1.645071] AMD-Vi: Interrupt remapping enabled [ 1.645072] AMD-Vi: Virtual APIC enabled [ 1.645072] AMD-Vi: X2APIC enabled [ 1.645153] AMD-Vi: Lazy IO/TLB flushing enabled [ 2.486602] AMD-Vi: AMD IOMMUv2 driver by Joerg Roedel <jroedel@suse.de> <br> 次に、IOMMUグループが有効であることを確認する。<br> 以下のシェルスクリプトを作成して実行する。(ここでは、シェルスクリプトのファイル名をlsIOMMU.shとする)<br> <syntaxhighlight 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; </syntaxhighlight> <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> # /etc/modprobe.d/gpu-passthrough.confファイル options vfio-pci ids=<VMで使用するGPUのベンダー>,<VMで使用するGPUのモデルID> <br> 例えば、上記セクションの結果から、以下のように記述する。<br> また、<code>options vfio-pci disable_vga=1</code>は、ホストPCが4.1以降のカーネルかつゲストOSがUEFIの場合のみ有効である。<br> VGAアービトレーションがホストデバイスに干渉するのを防ぐのに役立つ。<br> # /etc/modprobe.d/gpu-passthrough.confファイル options vfio-pci ids=10de:1d01,10de:0fb8 options vfio-pci disable_vga=1 <br> また、Windows10 1803以降をインストールする場合は、以下の設定も追記する。<br> しかし、Linuxカーネル 5.9.1以降はこのオプションが問題を引き起こすという報告がある。<br> 個人的には、<code>kvm.ignore_msrs=1</code>オプションを付加して、問題が発生する場合は当オプションを削除する方法を推奨する。<br> # /etc/modprobe.d/gpu-passthrough.confファイル options kvm ignore_msrs=1 <br> 自動ロードするモジュールのリストにドライバを追加するため、/etc/modules-load.d/vfio-pci.confファイルを作成して、以下の内容を記述する。<br> sudo vi /etc/modules-load.d/vfio-pci.conf <br> # /etc/modules-load.d/vfio-pci.confファイル # Intel CPUの場合 pci_stub vfio vfio_iommu_type1 vfio_pci kvm kvm_intel # AMD CPUの場合 pci_stub vfio vfio_iommu_type1 vfio_pci kvm kvm_amd <br> 次に、/etc/default/grubファイルを開く。<br> vfio-pciをパススルーするGPUにバインドするため、GRUB_CMDLINE_LINUX_DEFAULTに<code>rd.driver.pre=vfio-pci</code>を追記する。<br> # /etc/default/grubファイル GRUB_CMDLINE_LINUX_DEFAULT="〜 rd.driver.pre=vfio-pci" <br><br> == vfio-pciドライバの先読み設定 == vfio-pciドライバの先読み設定を行う。<br> <br> SUSEおよびRedHat系は、/etc/sysconfig/kernelファイルを作成して設定する。<br> Ubuntuでは、/etc/dracut.conf.d/gpu-passthrough.confファイルを作成して設定する。<br> <u>ただし、SUSEでは、上記のどちらの手順でも正常にvfio-pciドライバの先読み設定を行うことができた。</u><br> <br> <u>'''※調査中'''</u><br> <code>pci_stub</code>オプションは不要の可能性がある。<br> sudo vi /etc/dracut.conf.d/gpu-passthrough.conf <br> # /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 " # または # Intel CPUの場合 add_drivers+=" vfio vfio_iommu_type1 vfio_pci vfio_virqfd " # AMD CPUの場合 add_drivers+=" vfio vfio_iommu_type1 vfio_pci vfio_virqfd " <br> 上記の設定を有効化するため、initrdを再構築する。<br> sudo dracut -f /boot/initrd $(uname -r) <br> initrdの再構築の完了後、Linuxホストを再起動する。<br> 設定ミスで失敗すると、Linuxホストが起動できなくなる可能性があるので注意すること。<br> <br><br> == GPUが分離されていることを確認 == GPUが分離されているか確認する。<br> 以下のコマンドを実行して、使用中のカーネルドライバーを探す。<br> sudo lspci -nnv <br> 分離するGPU(VMで使用するGPU)を確認するには、Kernel driver in use:と記載されいている箇所を探す。 正常に分離されていれば、vfio-pciと記載される。 03:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP108 [GeForce GT 1030] [10de:1d01] (rev a1) Subsystem: Gigabyte Technology Co., Ltd Device [1458:375d] Kernel driver in use: vfio-pci Kernel modules: nouveau 03:00.1 Audio device [0403]: NVIDIA Corporation GP108 High Definition Audio Controller [10de:0fb8] (rev a1) Subsystem: Gigabyte Technology Co., Ltd Device [1458:375d] Kernel driver in use: vfio-pci Kernel modules: snd_hda_intel <br><br> == QEMUのアクセス権限の付与 == 別のHDD / SSDに仮想マシンを配置する場合、初期設定ではアクセス権限エラーになる。<br> そこで、/etc/libvirt/qemu.confファイルに以下の設定を追記する。<br> # /etc/libvirt/qemu.confファイル ・ ・ ・ user = "root" group = "root" <br> また、別のHDD / SSDに仮想マシンを配置する時は、配置先のディレクトリで以下のコマンドを実行する。<br> 以下では、<仮想マシン名>.qcow2ファイルを最大100[GB]の領域で仮想マシンを作成している。<br> qemu-img create -f qcow2 <仮想マシン名>.qcow2 100G <br><br> == X11の設定 == 上記の設定の状態では、PC起動時においてパススルーしたGPUを先に読み込むため、ホストOSの画面が表示されない。<br> ホストOS向けのGPUを先に読む込む必要があるため、/etc/X11/xorg.conf.installファイルに以下の設定を追記する。<br> sudo vi /etc/X11/xorg.conf.install <br> # /etc/X11/xorg.conf.installファイル # ...略 # 以下の設定を追記 Section "Device" Identifier "amdgpu" Driver "amdgpu" EndSection # 以下の設定を追記 Section "Screen" Identifier "amdgpu" Device "amdgpu" EndSection # Screen "amdgpu"を追記 Section "ServerLayout" # ...略 Screen "amdgpu" # 追加 EndSection <br><br> == ゲストOSの作成 == あらかじめ、[https://www.microsoft.com/en-us/software-download/windows10ISO Microsoftの公式Webサイト]で、Windows10のisoファイルをダウンロードする。<br> 併せて、[https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md virtio-winのGithub]または[https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/ Fedoraの公式Webサイト]にアクセスして、virtio-win-<バージョン>.isoファイルもダウンロードする。<br> <br> # まず、<u>'''SUSE 15.1'''</u>を使用している場合は、<code>/etc/libvirt/qemu.conf</code>ファイルを開いて、nvramセクションを以下のように編集する。 #: <code>nvram = ["/usr/share/qemu/ovmf-x86_64.bin:/usr/share/qemu/ovmf-x86_64-code.bin"]</code> # libvirtデーモンを再起動する。 #: <code>sudo systemctl restart libvirtd</code> #: <br> #: 必要であれば、以下のように、libvirtdを自動起動するように設定する。 #: <code>sudo systemctl enable libvirtd</code> #: <br> # Virtual Machine Managerを起動して、新しいVMを作成する。<br>[Architecture Option]画面では、[Local Install Media]と[x86_64]を選択する。 # [Use ISO Imege]項目を選択して、Windows10のISOファイルを選択する。 # VMに割り当てるメモリ容量とCPUのコア数を選択する。 # VMのディスクイメージを作成する。(既に定義されている場合は選択する。また、ディスク全体でも構わない。パスをそこに配置して、ホストにマウントされていないことを確認する) # VMに名前を付けて、[Customize configuration before install]チェックボックスにチェックが入力されていることを確認して、[Finish]ボタンを押下する。 # VM構成画面(以降、メイン画面という)に移動する。<br>メイン画面左の[Overview]を選択して、[Chipset:]プルダウンおよび[Firmware:]プルダウンを以下の値に設定する。 #: <br> #: ホストOSがSUSE 15.1の場合 #: [Chipset:] : i440FX #: [Firmware:] : BIOS または UEFI #: <br> #: ホストOSがSUSE 15.2以降かつゲストOSがWindows XPの場合 #: [Chipset:] : i440FX #: [Firmware:] : BIOS または UEFI #: <br> #: ホストOSがSUSE 15.2以降かつゲストOSがWindows 7の場合 #: [Chipset:] : Q35 #: [Firmware:]は、以下のいずれかを選択する。 #: [Firmware:] : UEFI X86_64: ovmf-x86_64-smm-code.bin #: [Firmware:] : UEFI X86_64: ovmf-x86_64-code.bin #: [Firmware:] : UEFI X86_64: ovmf-x86_64-4m-code.bin #: <br> #: ホストOSがSUSE 15.2以降かつ上記以外のゲストOSの場合 #: [Chipset:] : Q35 #: [Firmware:]は、以下のいずれかを選択する。 #: [Firmware:] : UEFI X86_64: ovmf-x86_64-smm-ms-code.bin #: [Firmware:] : UEFI X86_64: ovmf-x86_64-opensuse-code.bin #: <br> # メイン画面左の[CPUs]で、[Configuration]項目の[Model: ]プルダウンから、[host-passthrough]を選択する。(プルダウンに存在しない場合は、<code>host-passthrough</code>と入力する) # メイン画面左下の[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]を選択して、[管理]ボタンを押下して、<br>"KVM / QEMUのインストール"セクションでダウンロードしたvirtio-win-<バージョン名>.isoファイルを選択する。<br>[デバイスの種類]項目には、[CD-ROMデバイス]を選択する。 # [Add New Virtual Hardware]画面左の[PCI Host Device]を選択して、分離されたGPUとサウンドカード(ここでは、PCIデバイス02:00.0とPCIデバイス02:00.1)を追加する。 # [Add New Virtual Hardware]画面左の[USB Host Device]を選択して、キーボードとマウスを追加する。 # 同様に、不要なデバイス(タブレット、ディスプレイスパイス、コンソール、チャンネルスパイス、ビデオQXL等)を全て削除する。<br>ディスプレイにサウンド出力がない場合またはVGA経由で接続する場合は、サウンドカードが必要である。<br>1000円程度の安価なUSBサウンドカードを購入してPCに取り付けた場合、キーボードとマウスを追加した際と同様にして追加する。 # VMに割り当てたばかりのグラフィックボードをディスプレイに接続し、[Begin Installation]ボタンを押下する。<br>全て正しく設定されていれば、そのディスプレイにVMが起動していることがわかる。 # Windows10をインストール画面の手順に従ってインストールする。<br>インストール完了後、Windows10のデバイスマネージャーを起動して、マウントされているvirtio-win-<バージョン名>.isoファイルから各種ドライバをインストールする。 <br><br> == 仮想マシンの設定 == ==== ゲストOSがopenSUSEの場合 ==== ゲストOSがopenSUSEの場合、/etc/default/grubファイルの<code>GRUB_CMDLINE_LINUX_DEFAULT</code>項目に、<code>pci=noaer</code>オプションを追記する。<br> GRUB_CMDLINE_LINUX_DEFAULT="... pci=noaer" <br> ==== AMD CPUのパフォーマンスの改善 ==== 以前、AMD CPUでは、Nested Page Tables(NPT)を無効化することでKVMのGPU性能を引き上げることができた。<br> これは、バグが原因で、トレードオフとしてCPUの性能が落ちて、がたつきが発生することがあった。<br> <br> Linuxカーネル 4.9以降からこの問題を解決するカーネルパッチがマージされている。<br> LinuxカーネルまたはLinux-LTSカーネルを使用している場合、パッチは既に適用されている。<br> <br> <u>※注意</u><br> <u>QEMU 3.1以降、TOPOEXTフラグは標準で無効化されており、</u><br> <u>AMD CPUでハイパースレッディングを使用するには、以下のように、手動で有効にする必要がある。</u><br> <u>cache passthroughの設定は、実際のCPUキャッシュ情報を仮想マシンに渡す。</u><br> <syntaxhighlight lang="xml"> <!-- ゲストOSがWindows 10またはSUSEの場合 --> <cpu mode="host-passthrough" check="none"> <topology sockets="1" cores="4" threads="2"/> <cache mode="passthrough"/> <feature policy="require" name="topoext"/> </cpu> <!-- ゲストOSがWindows 7の場合 --> <cpu mode="host-passthrough" check="none"> <topology sockets="1" cores="4" threads="2"/> <cache mode="passthrough"/> <feature policy='disable' name='hypervisor'/> </cpu> <!-- ゲストOSがWindows XPの場合 --> <cpu mode="host-passthrough" check='none'> <topology sockets='1' cores='2' threads='2'/> <feature policy='require' name='topoext'/> <!-- ←この設定は不要の可能性あり --> </cpu> </syntaxhighlight> <br> 更にパフォーマンスを向上させるため、以下のように、hypervエレメントを設定する。<br> <syntaxhighlight lang="xml"> <!-- ゲストOSがWindows 10の場合 --> <hyperv> <relaxed state="on"/> <vapic state="on"/> <spinlocks state="on" retries="8191"/> <vendor_id state="on" value="0123456789ab"/> <vpindex state="on"/> <synic state="on"/> <stimer state="on"/> <frequencies state="on"/> </hyperv> <!-- ゲストOSがopenSUSEの場合 --> <hyperv> <relaxed state='on'/> <vapic state='on'/> <spinlocks state='on' retries='8191'/> <vendor_id state='on' value='0123456789ab'/> </hyperv> <!-- ゲストOSがWindows 7の場合 --> <hyperv> <relaxed state='on'/> <vapic state='on'/> <spinlocks state='on' retries='8191'/> <vendor_id state='on' value='0123456789ab'/> </hyperv> <!-- ゲストOSがWindows XPの場合 --> <hyperv> <relaxed state='on'/> <vapic state='on'/> <spinlocks state='on' retries='8191'/> <vendor_id state='on' value='none'/> </hyperv> </syntaxhighlight> <br> ==== GPUがNVIDIA Geforceの場合 (error code 43) ==== 仮想マシンのデバイスマネージャでグラフィックボードを確認すると、"エラー43:ドライバーの読み込みに失敗しました"と表示されて、正常に機能しない場合がある。<br> この問題は、NVidia GeForceシリーズのみ起こり(QuadroやTeslaにはこの問題は無い)、ユーザが仮想マシンでそれらを使用しようとすると、機能を意図的に無効化する。<br> 理由としては、仮想マシンでグラフィックカードを実行できるようになると、自社の製品の売上に悪影響を与える可能性があるからである。<br> <br> GeforceのGPUパススルーを正常に動作させるには、ハイパーバイザがその存在を隠すことで出来る。<br> 具体的な手順は以下の通りである。<br> <br> ===== 手動での設定 ===== まず、KVMを開始する。<br> sudo systemctl start libvirtd <br> GPUパススルーを行う仮想マシンのxmlファイルを編集する。<br> sudo EDITOR=nano virsh edit <仮想マシン名> <br> <code><hyperv></code>タグ内に<code>vendor_id</code>タグを記述する。<br> この時、<code>value</code>属性はどのような値でもよい。<br> <span style="color:#C00000"><u>ただし、vendor_idタグの設定は、Quadro 2000以降のQuadroカードでは不要である。</u></span><br> <syntaxhighlight lang="xml"> <features> ...略 <hyperv> ...略 <vendor_id state="on" value="123456789ab"/> </hyperv> ...略 </features> </syntaxhighlight> <br> 次に、状態を非表示にするようにKVMに指示するため、<code><hyperv></code>タグ外の直下に、<code>kvm</code>タグと<code>hidden</code>タグを記述する。<br> <span style="color:#C00000"><u>ただし、hiddenタグの設定も、Quadro 2000以降のQuadroカードでは不要である。</u></span><br> <syntaxhighlight lang="xml"> <features> ...略 <hyperv> ...略 </hyperv> ...略 <kvm> <hidden state='on'/> </kvm> </features> </syntaxhighlight> <br> QEMU 4.0以降で仮想マシンにQ35チップセットを使用する場合、<code>features</code>タグ内に<code>ioapic</code>タグを記述する。<br> <syntaxhighlight lang="xml"> <features> ...略 <ioapic driver="kvm"/> </features> </syntaxhighlight> <br> 最後に、KVMを再起動する。 sudo systemctl restart libvirtd <br> ===== 自動での設定 ===== GitHubにあるvirsh-patcherパッケージは、簡単に上記の方法を行うことができる。<br> git clone https://github.com/PassthroughPOST/virsh-patcher virsh-patcher <br> 以下のコマンドを実行して修正を適用する。<br> sudo virshpatcher --error43 --vendor-id 123456789ab <仮想マシン名> <br><br> == SynergyまたはBarrierのインストール == Windows10のインストール完了後、[https://symless.com/synergy Synergy(有償ソフトウェア)]または[https://github.com/debauchee/barrier/releases Barrier]をインストールできる。<br> これらは、物理的なKVM(Keyboard-Video-Mouse)スイッチなしで、複数のPCで同じキーボードとマウスを使用できる。<br> <br> 以下に、SynergyとBarrierのインストール手順を記載する。<br> <br> ==== Synergy ==== Synergyは有償ソフトウェアであるが、一部の機能(通信の暗号化機能)を除いて、無償でも使用することができる。<br> <br> まず、以下のコマンドを実行して、LinuxにSynergyをインストールする。<br> * パッケージ管理システムからインストール (非推奨 : Synergyのパッケージが古いため) *: <code>sudo zypper install libdns_sd qsynergy synergy</code> *: <br> * ソースコードからインストール *: まず、Synergyのビルドに必要な依存関係のライブラリをインストールする。 *: <code>sudo zypper install glib2-devel gdk-pixbuf-devel avahi-compat-mDNSResponder-devel dbus-1-devel libnotify-devel fixesproto-devel \</code> *: <code>libXrandr-devel libXext-devel libXfixes-devel libXinerama-devel libXi-devel libXtst-devel xextproto-devel libxkbfile-devel \</code> *: <code>inputproto-devel recordproto-devel libSM-devel libcurl-devel libopenssl-1_1-devel libopenssl-devel libavahi-devel \</code> *: <code>libQt5Core-devel libQt5Gui-devel libQt5Network-devel libqt5-qtbase-common-devel libQt5Widgets-devel libQt5DBus-devel libqt5-linguist-devel</code> *: <br> *: 次に、Synergyのソースコードをダウンロードする。 *: <code>git clone https://github.com/symless/synergy-core.git</code> *: <code>cd synergy-core</code> *: 最新安定版 : <code>git checkout master</code> *: 最新開発版 : <code>git checkout vX.Y.Z</code> *: <br> *: Synergyのビルドディレクトリを作成して、Synergyをビルドおよびインストールする。 *: <code>cd synergy-core && mkdir build && cd build</code> *: <code>cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=<Synergyのインストールディレクトリ> ..</code> *: <code>make -j $(nproc) または cmake --build . -j $(nproc)</code> *: <code>make install または cmake --install .</code> <br> Synergyの実行ファイルが存在するディレクトリに、以下のようなシェルスクリプトを作成する。<br> vi /<Synergyの実行ファイルがあるディレクトリ>/bin/synergy.sh <br> <syntaxhighlight lang="sh"> # /<Synergyの実行ファイルがあるディレクトリ>/bin/synergy.shファイル #!/usr/bin/env sh appname="synergy" # use -f to make the readlink path absolute dirname="$(dirname -- "$(readlink -f -- "${0}")" )" if [ "$dirname" = "." ]; then dirname="${PWD}/${dirname}" fi cd ${dirname} # Initialize interpreter path export PATH="${dirname}:${PATH}" export LD_LIBRARY_PATH="/<Qtのインストールディレクトリ>/<Qtのバージョン>/gcc_64/lib:${LD_LIBRARY_PATH}" # Run Synergy binary "${dirname}/${appname}" "$@" </syntaxhighlight> <br> 次に、Windows用のSynergyをダウンロードしてインストールする。<br> インストール後、Synergyの設定を行う。<br> <br> * Synergyのアンインストール ** Windowsの場合 **# [プログラムの追加と削除](または[アプリと機能])で、Synergyをアンインストールする。<br>この時、"アプリとその関連情報がアンインストールされます"というメッセージが表示されるので、再度、[アンインストール]ボタンを押下する。 **# [アプリを終了する必要があります]メッセージ、および、アプリを自動的に終了させるかどうかを尋ねられるので、これを選択する。 **# 次に、regeditを実行して、以下に示すレジストリキーを削除する。(存在する場合) **#* HKEY_CURRENT_USER\Software\Symless **#* HKEY_CURRENT_USER\Software\Synergy **#* HKEY_LOCAL_MACHINE\SOFTWARE\Synergy **#: <br> **# 以下のディレクトリが存在する場合は、削除する。 **#* C:\ProgramData\Symless **#* C:\ProgramData\Synergy **#* C:\ProgramData\Synergy v2 **#* %USERPROFILE%\AppData\Local\Synergy **#* %USERPROFILE%\AppData\Local\Symless **#: <br> **# 次に、SystemConfig.iniファイルを削除する。<br>この時、以前に保存した設定は失われる。 **#: C:\Program Files\Synergy\SystemConfig.ini **#: <br> **# 最後に、Windowsを再起動する。 **: <br> ** Linuxの場合 **# パッケージ管理システムを使用して、Synergyを削除する。 **# 次に、以下のコマンドを実行して、Synergyの設定を削除する。 **#* <code>rm -rf ~/.config/Symless/</code> **#* <code>rm -rf ~/.config/Synergy/</code> **#* <code>rm -rf ~/.synergy/</code> **#* <code>rm -rf ~/.symless/</code> **#: <br> **# 次に、SystemConfig.iniファイルを削除する。<br>この時、以前に保存した設定は失われる。 **#: <code>sudo rm -rf /usr/local/etc/Symless/SystemConfig.ini</code> <br> ==== Barrier (推奨) ==== ===== パッケージ管理システムからインストール ===== まず、以下のコマンドを実行して、LinuxにBarrierをインストールする。<br> sudo zypper install barrier <br> 次に、[https://github.com/debauchee/barrier/releases BarrierのGiHub]にアクセスして、Windows向けのBarrierの実行ファイルをダウンロードしてインストールする。<br> インストール後、Barrierの設定を行う。<br> <br> ===== ソースコードからインストール ===== まず、Barrierをビルドするため、依存関係のライブラリをインストールする。<br> # CentOS (EPELリポジトリの追加が必要) sudo yum groupinstall "Development Tools" sudo yum install 'dnf-command(config-manager)' sudo yum config-manager --set-enabled PowerTools sudo yum install cmake3 libcurl-devel avahi-compat-libdns_sd-devel libX11-devel libXtst-devel desktop-file-utils openssl-devel \ qt5-qtbase-devel # SUSE sudo zypper install --type pattern devel_basis sudo zypper install libdrm-devel libglvnd-devel libICE-devel \ libcurl-devel avahi-compat-mDNSResponder-devel libXtst-devel libopenssl-devel \ libSM-devel libXinerama-devel libXrandr-devel Mesa-devel \ libQt5Core-devel libQt5Gui-devel libQt5Network-devel libqt5-qtbase-common-devel libQt5Widgets-devel <br> 次に、[https://github.com/debauchee/barrier/releases BarrierのGiHub]にアクセスして、Barrierのソースコードをダウンロードする。<br> ダウンロードしたファイルを解凍して、ビルド向けディレクトリを作成する。<br> # Tarballからビルドする場合 tar xf barrier-<バージョン>-release.tar.gz cd barrier-<バージョン>-release && mkdir build && cd build # Gitからビルドする場合 git clone https://github.com/debauchee/barrier.git barrier && cd barrier git submodule update --init --recursive ./clean_build.sh cd build <br> <u>※注意</u><br> <u>Tarballをダウンロードした時、Barrierディレクトリのext/gmockディレクトリ、ext/gtestディレクトリ、ext/gulrak-filesystemディレクトリが空の場合、</u><br> <u>以下のモジュールのソースコードをダウンロードする必要がある。</u><br> # Tarballのモジュールをダウンロードする場合 wget https://github.com/google/googletest/archive/refs/tags/release-<バージョン>.tar.gz wget https://github.com/gulrak/filesystem/archive/refs/tags/<バージョン>.tar.gz tar xf googletest-release-<バージョン>.tar.gz tar xf filesystem-<バージョン>.tar.gz # Gitを使用してモジュールをダウンロードする場合 git clone https://github.com/google/googletest.git git clone https://github.com/gulrak/filesystem <br> <u>Barrierのビルドに必要なソースコードを、Barrierディレクトリのext/gmockディレクトリ、ext/gtestディレクトリ、ext/gulrak-filesystemディレクトリにコピーする。</u><br> # Tarballのモジュールをダウンロードした場合 cp -r googletest-release-<バージョン>/googlemock <Barrierディレクトリ>/ext/gmock cp -r googletest-release-<バージョン>/googletest <Barrierディレクトリ>/ext/gtest cp -r filesystem-<バージョン>/* <Barrierディレクトリ>/ext/gulrak-filesystem # Gitを使用してモジュールをダウンロードした場合 cp -r googletest/googlemock/* <Barrierディレクトリ>/ext/gmock cp -r googletest/googletest/* <Barrierディレクトリ>/ext/gtest cp -r filesystem/* <Barrierディレクトリ>/ext/gulrak-filesystem <br> Barrierをビルドおよびインストールする。<br> # Tarballからインストールする場合 cmake -DCMAKE_INSTALL_PREFIX=${HOME}/InstallSoftware/Barrier -DCMAKE_BUILD_TYPE=Release .. make -j $(nproc) make install # Gitからインストールする場合 make DESTDIR=${HOME}/InstallSoftware/Barrier install <br> Barrierの起動スクリプトを作成する。<br> vi ~/InstallSoftware/Barrier/barrier.sh <br> <syntaxhighlight lang="sh"> # ~/InstallSoftware/Barrier/barrier.sh #!/usr/bin/env sh appname="barrier" # use -f to make the readlink path absolute dirname="$(dirname -- "$(readlink -f -- "${0}")" )" if [ "$dirname" = "." ]; then dirname="${PWD}/${dirname}" fi cd ${dirname} # Initialize interpreter path export PATH="${dirname}:${PATH}" export LD_LIBRARY_PATH="/<Qtのインストールディレクトリ>/<Qtのバージョン>/gcc_64/lib:${LD_LIBRARY_PATH}" # Run Barrier binary "${dirname}/${appname}" "$@" </syntaxhighlight> <br> Barrierの起動スクリプトに実行権限を付加する。<br> chmod u+x ~/InstallSoftware/Barrier/barrier.sh <br> Barrierの実行に必要な依存関係のパッケージをインストールする。<br> sudo zypper install libdns_sd <br> Barrierのデスクトップエントリファイルを、~/.local/share/applicationsディレクトリに作成する。<br> # ~/.local/share/applications/Barrier.desktop [Desktop Entry] Type=Application Name=Barrier <バージョン> GenericName=Barrier Comment=Keyboard and mouse sharing solution Exec=/home/<ユーザ名>/InstallSoftware/Barrier/bin/barrier.sh Icon=/home/<ユーザ名>/InstallSoftware/Barrier/barrier Terminal=false Categories=Utility; Keywords=keyboard;mouse;sharing;network;share; <br> 次に、[https://github.com/debauchee/barrier/releases BarrierのGiHub]にアクセスして、Windows向けのBarrierの実行ファイルをダウンロードする。<br> KVMのゲストOSであるWindowsに、Barrierをインストールする。<br> <br> Barrierのインストール完了後、Barrierの設定を行う。<br> <br> Windowsにおいて、Barrierを自動起動する場合は以下の手順を行う。<br> # まず、[スタート]ボタンを押下して、起動時に実行するソフトウェアを右クリックする。 # コンテキストメニューから[その他] - [ファイルの場所を開く]を選択して、ソフトウェアのショートカットが保存されているディレクトリを開く。<br>もし、[ファイルの場所を開く]オプションが表示されない場合、そのソフトウェアは起動時に実行できないことを意味する。 # 次に、[Super]キー + [R]キーを同時押下して、<code>shell:startup</code>と入力、[OK]ボタンを押下する。 # [スタートアップ]ディレクトリが開くので、ソフトウェアのショートカットが保存されているディレクトリから、ショートカットを[スタートアップ]ディレクトリにコピーする。 <br> ===== Barrierのアンインストール ===== * Windows *# Barrierをアンインストールする前に、Barrierを終了する。<br><u>Barrierを起動したままでアンインストールした場合、ほとんどのBarrierに関するファイルが残ってしまうため注意すること。</u> *# Barrierのサービスを停止するため、管理者権限でPowershellまたはコマンドプロンプトを起動して、<code>net stop</code>コマンドを実行する。<br>これは、<code>sc stop</code>コマンドでは非同期で実行されるため、<code>sc delete</code>コマンドが失敗して、アンインストール後にbarrierd.exeが残るからである。 *# <code>net stop</code>コマンドを実行する。<br><code>net stop</code>コマンドは、Barrierのサービスが停止するまで同期で実行するため、<code>sc delete</code>コマンドが成功する。 *# [設定] - [アプリ]画面または[コントロールパネル] - [プログラムと機能]画面から、Barrierをアンインストールする。 *# 次に、C:\Program Files\BarrierフォルダおよびC:\ProgramData\Barrierフォルダを削除する。 *# C:\Users\<ユーザ名>\AppData\Local\Barrierディレクトリを削除する。 *# C:\Users\<ユーザ名>\AppData\Local\Tempディレクトリに存在する"Barrier."から始まるファイル群を削除する。 *# regeditを実行して、\HKEY_USERS\S-<Windows11の現在のビルド番号>\SOFTWARE\Debaucheeを削除する。 *# %LocalAppData%\Barrierフォルダ(レジストリ設定、Barrierの設定ファイル、証明書、フィンガープリント)を削除する。 *# 必要ならば、Barrierに関するファイヤーウォールのルールを削除する。 *: <br> * Linux *# まず、Barrierのインストールディレクトリを削除する。 *#: <code>rm -rf <Barrierのインストールディレクトリ></code> *# 次に、Barrierの設定ファイルが存在するディレクトリを削除する。 *#: <code>rm -rf ~/.local/share/barrier</code> *#: <code>rm -rf ~/.config/Debauchee</code> <br> ==== SynergyおよびBarrierが接続できない場合 ==== SUSE以外の各ディストリビューションでは、以下のコマンドを実行することで接続できる可能性がある。<br> sudo firewall-cmd --permanent --add-port=24800/tcp または sudo firewall-cmd --permanent --zone=libvirt --add-port=24800/tcp sudo firewall-cmd --reload <br> SUSEの場合および上記のコマンドで接続できない場合は、以下の設定を行う。<br> <br> まず、/usr/lib/firewalld/services/barrier.xmlファイルを作成する。<br> (このファイルは不要の可能性があることに注意すること)<br> sudo vi /usr/lib/firewalld/services/barrier.xml <br> <syntaxhighlight lang="xml"> <?xml version="1.0" encoding="utf-8"?> <service> <short>Synergy</short> <description>Share a mouse and keyboard on KVM.</description> <port protocol="tcp" port="24800"/> </service> </syntaxhighlight> <br> 次に、/usr/lib/firewalld/zones/libvirt.xmlファイルにおいて、<br> <code></zone></code>タグの上部に<code><port port="24800" protocol="tcp"/></code>を追記する。<br> sudo nano /usr/lib/firewalld/zones/libvirt.xml <br> <syntaxhighlight lang="xml"> <?xml version="1.0" encoding="utf-8"?> <zone target="ACCEPT"> <!-- ...略 --> <port port="24800" protocol="tcp"/> </zone> </syntaxhighlight> <br> 最後に、上記の設定を有効にするため、ファイアーウォールを再読み込みまたはPCを再起動する。<br> または、PCを再起動する。<br> sudo firewall-cmd --reload sudo systemctl restart firewalld または sudo shutdown -r now <br><br> == エラー時の対処方法 == ==== ネットワーク ==== VM起動時に下記のエラーが出力されて、VMが起動できないことがある。<br> ERROR Requested operation is not valid: network 'default' is not active <br> まず、以下のコマンドを実行する。<br> この時、以下のメッセージが出力された場合は、<code>sudo virsh net-start default</code>を実行する。<br> 今後、このネットワークを自動起動するには、<code>sudo virsh net-autostart --network default</code>を実行する。<br> # 実行 sudo virsh net-list --all # 出力 名前 状態 自動起動 永続 ------------------------------------------------ default 停止状態 いいえ (no) はい (yes) <br> また、以下のようにネットワークが表示されない場合がある。<br> Name State Autostart Persistent ---------------------------------------------------------- <br> その時は、/run/libvirt/network/default.xmlファイルを作成して、以下に示す内容を記述する。(デフォルトネットワークを作成する)<br> <br> # /run/libvirt/network/default.xmlファイル <networkstatus> <class_id bitmap='0-2'/> <floor sum='0'/> <network> <name>default</name> <uuid>e8a9f86b-1c3a-4fa5-ab03-1fb563b12b84</uuid> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:a3:0d:b0'/> <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> </networkstatus> <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