web-dev-qa-db-ja.com

qemu / kvmパススルーのNvidia GPUをブラックリストに追加する

VMにGPUへの直接パススルーを与えながら、パフォーマンスを向上させるために、仮想マシンでWindowsを実行しようとしています。

統合されたインテルGPU(ホストにこれを使用します)とNvidia GTX980(VMにこれを使用します)があります。 Elementary OS 0.3.2 Freya 64ビットを使用しています。

this ガイドに従いましたが、ステップ2で停止しています。Nvidiagpuをブラックリストに登録できません。

はじめにlspci -nn | grep NVIDIAを実行します

これにより、次の出力が得られます

01:00.0 VGA compatible controller [0300]: NVIDIA Corporation Device [10de:13c0] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation Device [10de:0fbb] (rev a1)

次に、この行を/etc/initramfs-tools/modulesファイルに追加しました。

pci_stub ids=10de:13c0,10de:0fbb

そして、update-initramfs -uを使用してリロードし、その後リブートしました。

再起動後、dmesg | grep pci-stubを実行すると、次の出力が表示されます。

[    2.029626] pci-stub: add 10DE:13C0 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.029630] pci-stub: add 10DE:0FBB sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[    2.029637] pci-stub 0000:01:00.1: claimed by stub

ご覧のとおり、音声もビデオもスタブによって要求されていません。

また、etc/default/grubのgrubファイルにこのオプションを直接追加しようとしたので、GRUB_CMDLINE_LINUX_DEFAULT行は次のようになります。

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on pci-stub.ids=10de:13c0,10de:0fbb"

しかし、これにより、Nvidiaカードがブラックリストに載ることもなくなりました。

誰がこれを引き起こしているのでしょうか?

4
Mathyn

私もqemu-kvmパススルーを設定していますが、あなたと同じ問題がありました。統合されたIntelグラフィックカードをプライマリGPUとして使用しているため、nvidia設定を開いてハイブリッドグラフィックスを無効にしているため、nvidiaカードは使用されません: (pic related)

その後、vfio-pciにカードをバインドするのに問題はありませんでした。

どういうわけか、nvidiaモジュールがqemuの起動時に問題を引き起こすか、ハイブリッドグラフィックスをオフにするオプションがない可能性があります。この場合、私もやったことを試して、コンソールモードから次のようなスクリプトを使用して手動でnvidiaモジュールを無効にすることができます(CTRL + ALT + F1):

#!/bin/bash
Sudo service lightdm stop
Sudo rmmod nvidia_uvm
Sudo rmmod nvidia_drm
Sudo rmmod nvidia_modeset
Sudo rmmod nvidia
Sudo service lightdm start

これにより、ディスプレイマネージャー(私の場合はlightdm)が停止し、nvidiaモジュールが順番に無効になり、その後ディスプレイマネージャーが再起動します。これをコンソールモードで起動してください。これをデスクトップから実行すると、最初の行の後にスクリプトが中断される可能性が高いためです。

Nvidiaモジュールは、再起動すると自動的に再度読み込まれますが、次の方法で手動で再度読み込むこともできます。

modprobe nvidia nvidia_modeset nvidia_drm nvidia_uvm

お役に立てれば。

1
Xanty

Grub configを使用してnvidia/nuveauを非アクティブ化します。

module_blacklist=<module1>[,<module2>](documentation) ディレクティブをgrub2コマンドライン経由でカーネルに渡す可能性があります。 GRUB_CMDLINE_LINUX_DEFAULT/etc/default/grubに以下を追加して、nuveauおよびnvidiaドライバーを無効にすることができました(Sudo update-grubの発行を忘れないでください):

module_blacklist=nvidia,nvidia_uvm,nvidia_drm,nvidia_modeset,nouveau

カーネルごとにこのオプションを使用して、または使用せずにgrubエントリを自動的に生成することもできます。 https://unix.stackexchange.com/questions/24670/choose-at-grub-menu-whether-nvidia-driver -should-be-used (最初の回答)。しかし、予想よりも厄介であることが判明しました。 ubuntu grubの設定は非常に複雑です。それをいじる前にバックアップを作成してください。

これは、VGAパススルーを使用して仮想マシンでゲームに強力なNVIDIAカードを使用したいが、tensorflowなどのディープラーニングに使用するオプションがある場合に特に役立ちます。これら2つを切り替えるには、再起動のみが必要です。

0
user334287

あなたの音声はスタブによって要求されています

[    2.029637] pci-stub 0000:01:00.1: claimed by stub

ビデオはそうではありません。私も同じ問題を抱えています。NvidiaやNouveauをブラックリストに載せました。 Ubuntuサーバー15.10を使用しているので、まったく同じではありませんが、同じ問題があります。何週間もインターウェブを検索しましたが、何もありません。

編集最後に修正し、ここで見つけました: https://forum.level1techs.com/t/pci-stub-not-claming-secondary-graphics-card/88728

そこで、NvidiaおよびNouveauモジュールをブラックリストに載せて再起動しました。それが役に立てば幸い

もう一度編集:

カーネル4.10.1-1でArchのpci-stubにpciカードをバインドするために行った現在の手順。

GRUB_CMDLINE_LINUX_DEFAULT = "quiet intel_iommu = on pci-stub.ids = 1002:6798,1002:679a、1002:aaa0,1106:3483"のように/ etc/default/grubを編集しました

次に、新しいgrub構成ファイルを作成します

$ Sudo grub-mkconfig -o /boot/grub/grub.cfg

次に再起動します。

/etc/mkinitcpio.confで、モジュールにpci-stubを追加して、次のようにしました:MODULES = "pci-stub"

その後、実行します

$ Sudo mkinitcpio -P

すべてのinitramfsイメージを再構築します。次に再起動します。

次に、pci-grubによって要求されていることを確認するためだけにこのコマンドを実行します

$ dmesg | grep pci-stub

0
Dan

このガイドを試しましたか https://forum.level1techs.com/t/play-games-in-windows-on-linux-pci-passthrough-quick-guide/108981 ? :)それはかなり新しいです:)

0
tomsk

あなたと同じような問題に遭遇しました(Lubuntu 16.04)。これは、pci-stubがこれを実行する前に、デバイスをデバイスにバインドするドライバー/モジュールが原因です。ここには少なくとも2つのオプションがあります。

最初の最も簡単な方法は、デバイスを要求するモジュールをブラックリストに登録することです。lspci -knn | grep VGA -A 5と入力して、すべてのVGA pciデバイスとそのデバイスデバイス番号とそのカーネルモジュール。

 01:00.0 VGA互換コントローラー[0300]:NVIDIA Corporationデバイス[10de:128b](rev a1)
サブシステム:Micro-Star International Co.、Ltd. [MSI]デバイス[1462: 8c93] 
使用中のカーネルドライバー:nouveau 
カーネルモジュール:nvidiafb、nouveau 
 01:00.1オーディオデバイス[0403]:NVIDIA Corporation GK208 HDMI/DPオーディオコントローラー[10de:0e0f ](rev a1)
サブシステム:Micro-Star International Co.、Ltd. [MSI] GK208 HDMI/DPオーディオコントローラー[1462:8c93] 
-
 02:00.0 VGA互換コントローラー[0300]:NVIDIA Corporation GM204 [GeForce GTX 970] [10de:13c2](rev a1)
サブシステム:ZOTAC International(MCO)Ltd. GM204 [GeForce GTX 970] [19da:1366] 
使用中のカーネルドライバー:nouveau 
カーネルモジュール:nvidiafb、nouveau 
 02:00.1オーディオデバイス[0403]:NVIDIA Corporation GM204 High Definition Audio Controller [10de:0fbb](rev a1 )
サブシステム:ZOTAC International(MCO)Ltd. GM204 High Definition Audio Controller [19da:1366] 
 

次に、使用しているドライバーを確認する必要があります。たとえば、nouveauは私のVMに使用したいVGAデバイス02:00.0を取得したので、その中の1つをブラックリストに追加しました。

Sudo nano /etc/modprobe.d/blacklist.conf blacklist nouveau

これで完了です。

私の場合、2つのnVidia VGA(01:00.0と02:00.0)が同じドライバーで実行されているため、これが問題の原因になります。私の場合、ドライバーをブラックリストに登録しません。

02:00.0 VGAカードから手動でバインドを解除します。VM-guestと01:00.0 VGAにそのカードを使用したかったためです。私のLinuxホスト。このガイドのおかげで、その方法がわかりました: https://lwn.net/Articles/143397/

Sudo tree /sys/bus/pci/drivers/nouveauと入力します。 nouveauをデバイスをつかんだモジュールと交換します。

次のようなリストを受け取る必要があります。

/sys/bus/pci/drivers/nouveau 
├──0000:01:00.0-> ../../../../devices/pci0000:00/0000: 00:03.0/0000:01:00.0 
├──0000:02:00.0-> ../../../../devices/pci0000:00/0000:00:05.0/0000: 02:00.0 
├──bind 
├──module->../../../../module/drm
├──new_id 
├──remove_id 
├──uevent 
└──unbind 
 

ドライバーnouveauにバインドされているデバイスが必要であることがわかります:0000:01:00.0および0000:02:00.0

グラフィックカードのバインドを解除してバインドするには、まずlightdm.serviceをオフにする必要があります。そのため、たとえば、Ctrl + Alt + F2を使用して、デスクトップ環境の外部でコンソールを開きます。ルートとしてログインし、systemctl stop lightdm.serviceと入力します

これで、グラフィックカードからモジュールをバインド解除できます。

echo -n "0000:02:00.0" > /sys/bus/pci/drivers/nouveau/unbind

それを私が望むモジュール(pci-stubまたはvfio-pci)にバインドします。私はvfio-pciを使用しました。

echo -n "0000:02:00.0" > /sys/bus/pci/drivers/vfio-pci/bind

その後、desktopmanagerを再び起動できます:systemctl start lightdm.service

すべてが正常に機能した場合は、lspci -knn | grep VGA -A 5を再度検索して、指定したモジュールにデバイスがバインドされていることを確認する必要があります。

 01:00.0 VGA互換コントローラー[0300]:NVIDIA Corporationデバイス[10de:128b](rev a1)
サブシステム:Micro-Star International Co.、Ltd. [MSI]デバイス[1462: 8c93] 
使用中のカーネルドライバー:nouveau 
カーネルモジュール:nvidiafb、nouveau 
 01:00.1オーディオデバイス[0403]:NVIDIA Corporation GK208 HDMI/DPオーディオコントローラー[10de:0e0f ](rev a1)
サブシステム:Micro-Star International Co.、Ltd. [MSI] GK208 HDMI/DPオーディオコントローラー[1462:8c93] 
-
 02:00.0 VGA互換コントローラー[0300]:NVIDIA Corporation GM204 [GeForce GTX 970] [10de:13c2](rev a1)
サブシステム:ZOTAC International(MCO)Ltd. GM204 [GeForce GTX 970] [19da:1366] 
使用中のカーネルドライバー:vfio-pci 
カーネルモジュール:nvidiafb、nouveau 
 02:00.1オーディオデバイス[0403]:NVIDIA Corporation GM204 High Definition Audio Controller [10de:0fbb]( rev a1)
サブシステム:ZOTAC International(MCO)Ltd. GM204 High Definition Audio Controller [19da:1366] [.___ _。]

残念ながら、この回避策は再起動後に無効になります。しかし、私はそれを永続化する方法を知りませんでした。たぶん他の誰かが私にヒントを与えることができます。 startscriptのようなものが可能だと思います。ただし、最初にバインドを解除せずに、デバイスを特定のモジュールにバインドできる方が良いでしょう。いつかnvidiaドライバーを使いたいと想像してください。その場合、グラフィックカードはnvidiaモジュールにバインドされるため、nouveauからのバインドを解除しても意味がありません。

0
AlexOnLinux