web-dev-qa-db-ja.com

QEMUおよびKVMを使用したVGAパススルー-画面に何もありません

ここ数日、このガイドを主な参考資料として使用して、VGAパススルーを使用してWindows仮想マシンをセットアップしようとしました: https://www.pugetsystems.com/labs/articles/Multiheaded-NVIDIA- Gaming-using-Ubuntu-14-04-KVM-585 /

私のPCは、Intel i7-4790とIntel HD 4600を統合し、それをプライマリカードとして使用し、NVIDIA GTX 960を使用しています。

NVIDIAドライバーをインストールし、nvidia設定でハイブリッドグラフィックスを無効にした後、nvidiaカードをvfio-pciコントローラーに問題なくバインドできました。

私はnvidiaドライバーをブラックリストに入れ、pci-stubを使用してGPUをそれらから「盗む」ようにしたので、起こりうるエラーを避けることができましたが、うまくいきませんでしたので、OSを起動した後、手動でnvidiaモジュールをアンロードしますスクリプト(コンソールモード):

#!/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

Device(gpu)を削除し、再スキャン時にカードがnvidiaドライバーではなくvfio-pciによって要求されていることを確認することで、これが機能することを確認しました。

すべてのドライバーをセットアップした後、次のスクリプトを使用してVMを開始しました。

#!/bin/bash

Sudo qemu-system-x86_64 -enable-kvm -M q35 -m 4096 -cpu Host,kvm=off \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/seabios/bios.bin -vga none \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,Host=01:00.0,bus=root.1,addr=00.0,x-vga=on \
-device virtio-scsi-pci,id=scsi \
-drive file=/home/xanty/windows1.img,id=disk,format=raw,cache=none,if=none -device scsi-hd,drive=disk \
-drive file=/home/xanty/Descargas/windows7pro.iso,id=isocd,cache=none,if=none -device scsi-cd,drive=isocd \
-boot menu=on

exit 0

そして、私は最終的にそれを実行しました.qemuモニターでpci情報を確認すると (pic here) 、すべてが正常に見えますが、nvidiaカードのDVI-Iポートに接続した2番目のモニターは何も表示しません。 モニターは信号を受信して​​いないようです

これを解決する方法を理解するか、少なくともこの方法の実行可能な代替案を見つけるために、いくつかの助けが必要です。

追加情報として、Ubuntu Studio 16.04を使用しています。最初のモニターはIntel DVI-Iポートに接続されたSamsungモニターで、2番目のモニターは1つのVGAと1つのDVI-Iポートを持つBENQです。 GTX 960 DVI-Iポート(このモデルにはVGAポートはありません)

あなたが提供できる助けを本当に感謝しています。

編集1:

通常、vmを起動する前に、nvidiaモジュールを削除した後、デバイスを削除して再スキャンします。

echo > 1 /sys/bus/pci/devices/0000:01:00.0/remove
echo > 1 /sys/bus/pci/devices/0000:01:00.1/remove
echo > 1 /sys/bus/pci/rescan

これを行うと、vmは大きな問題なく実行されるようですが、そうしないと、qemuモニターを起動しようとするとフリーズし、「-9を殺す」しない限り、それを閉じたりプロセスを停止したりできませんそれ。これは次の理由によるものです。

-device vfio-pci,Host=01:00.0,bus=root.1,addr=00.0,x-vga=on \

「x-vga = on」パラメータを削除しても、引き続き正常に機能します。

EDIT 2:この問題についてさらにテストと調査を行った結果、kvmを起動したときにvfio-pciドライバーがgpuを有効にしていないことがわかりました。

Kvmを起動した後、「dmesg | grep -i vfio」コマンドは次の新しい行を返します。

[ 1572.975051] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x1e@0x258
[ 1572.975063] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x19@0x900

これに似た別の行があるはずです:

[ 3182.192258] vfio-pci 0000:01:00.0: enabling device (0000 -> 0003)

しかし、それは欠落しています。

EDIT3:Ubuntu Studio 14.04にダウングレードしたところ、nvidia/nouveauドライバーの前にpci-stubがgpuを取得できるようになりました。 gpuを簡単にクラッシュすることなくvfio-pciドライバーにバインドできます。kvmを起動した後の出力は次のようになります。

[  130.988082] vfio-pci 0000:01:00.0: enabling device (0000 -> 0003)
[  130.988186] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x1e@0x258
[  130.988196] vfio_ecap_init: 0000:01:00.0 hiding ecap 0x19@0x900

しかし、このすべての後、モニターはまだ信号を受信しません。本当に助けが必要です。残っている唯一のオプションは、カーネルを4.2.0-27-lowlatencyから4.1.xにダウングレードすることです。 OSが台無しになるのではないかと心配しています。

3
Xanty

解決しました。

よく調べた結果、2つの主な問題に気付きました。

1-統合されたグラフィックカードi915ドライバーに問題があり、カーネルに非公式のパッチを適用するか、仮想マシンをUEFIモードでインストールし、BIOSの起動をシミュレートする必要があることがわかりました。このために、ovmfをインストールする必要がありました。

apt-get install ovmf

2- Windows nvidiaドライバーは、私がkvm上でWindowsを実行しており、私のGPUをブロックしていることを検出していました。

最後に、ovmfをインストールした後、virt-managerとovmfを使用してセットアップする方法に関するこのチュートリアルに従いました: http://vfio.blogspot.com.es/2015/05/vfio-gpu-how -to-series-part-4-our-first.html

また、マシンのxml構成を編集して、nvidiaドライバーからkvmを難読化する方法についても説明します。

面白い機能も見つかりました:

ウィンドウでマシンをエミュレートするためにVGAスタートアップオプション(VNCサーバー)を選択すると、ウィンドウが起動すると、ウィンドウを2番目の物理モニターとして検出します 、USBコントローラーをパススルーすることなく、マウスとキーボードをキャプチャできます。

3
Xanty