KVM、PCIパススルー、Looking Glass、およびすべてすべて

Linuxソフトウェア開発者への移行が成功した後、ちょっとした作業が行われ、メインOSも変更されました。 懸念は、既存のプロジェクトをサポートする非プラットフォームソフトウェアによって引き起こされました。 ソフトウェアの一部はワインを通じて機能しました。 しかし、特定のソフトウェアがワインの下で動作することを拒否することが判明しました。 QEMU + KVM仮想マシンでソフトウェアを実行することが決定されました。 ソフトウェアは実行を開始しましたが、その中での作業はかなり不便でした。 ソフトウェア仮想ビデオカードのパフォーマンスに違いはなく、3Dグラフィックスのサポートは非​​常に控えめです。 私はタンバリンを発見し、道を探す必要がありました。

ゲストシステムに別のビデオカードを割り当てます!


道を見つけるのに長い時間はかかりませんでしたが、サーチライトでタンバリンを打つという考えは非常に奇妙であることが判明しました。 ビデオカードを仮想マシンに転送するというトピックについては、インターネットにはさまざまな時間の指示やさまざまなハードウェアの指示がたくさんあります。 Arch Linuxサイトの巨大な記事は何ですか[0] 。 ビデオカードを転送するための手順の簡略版を提供します。

0.ハードウェアがIOMMUをサポートしていることを確認します


たとえば、ここ[1]

1.カーネルにIOMMUのサポートを含めます。


猫/ etc /デフォルト/ grub
GRUB_CMDLINE_LINUX_DEFAULT = "静かなスプラッシュamd_iommu = on"
または
GRUB_CMDLINE_LINUX_DEFAULT = "静かなスプラッシュintel_iommu = on"


sudo update-grub忘れないでください。

2.ドライバからビデオカードを選択します


適切なデバイスを探し、どのドライバーがそれらを使用しているかを確認します。

lspci -nnk
04:00.0 VGA互換コントローラー[0300]:NVIDIA Corporation GT218 [GeForce 210] [ 10de:0a65 ](rev a2)
使用中のカーネルドライバー: nouveau
カーネルモジュール:nvidiafb、nouveau
04:00.1オーディオデバイス[0403]:NVIDIA Corporation高解像度オーディオコントローラー[ 10de:0be3 ](rev a1)
使用中のカーネルドライバー: snd_hda_intel
カーネルモジュール:snd_hda_intel


VFIOモジュールを追加して、起動時にロードされるようにします。

猫/ etc /モジュール| grep vfio
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd


VFIOモジュールを構成して、デバイスをインターセプトし、メインドライバーが読み込まれないようにします。 必要に応じて、ブラックリストにメインドライバーを追加します。

cat /etc/modprobe.d/vfio.conf
オプションvfio-pci ids = 10de:0a65,10de:0be3
ブラックリストヌーボー


3.再起動し、すべてがうまくいったことを確認します


IOMMUがオンになりました。

dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
DMAR:ダイレクトI / O向けインテル®バーチャライゼーションテクノロジー
または
AMD-Vi:0000にIOMMUが見つかった:00:00.2 cap 0x40
AMD-Vi:割り込み再マッピングが有効
AMD-Vi:遅延IO / TLBフラッシュが有効


複合デバイスは1つのグループに分類されました。

in / sys / kernel / iommu_groups / *; $ a -type lを見つけてください。 完了| sort --version-sort
/sys/kernel/iommu_groups/15/devices/0000:01:00.0
/sys/kernel/iommu_groups/15/devices/0000:01:00.1
/sys/kernel/iommu_groups/16/devices/0000:02:00.0
/sys/kernel/iommu_groups/17/devices/0000:03:00.0
/sys/kernel/iommu_groups/18/devices/0000:04:00.0
/sys/kernel/iommu_groups/18/devices/0000:04:00.1


KVMおよびVFIOドライバーがロードされました。

lsmod | grep -e kvm -e vfio
 kvm_amd 94208 0
 ccp 90112 1 kvm_amd
 kvm 622592 1 kvm_amd
 vfio_pci 45056 0
 vfio_virqfd 16384 1 vfio_pci
 irqbypass 16384 2 vfio_pci、kvm
 vfio_iommu_type1 24576 0
 vfio 28672 2 vfio_iommu_type1、vfio_pci


VFIOによってキャプチャされたゲストOSのビデオカード。

lspci -nnk
04:00.0 VGA互換コントローラー[0300]:NVIDIA Corporation GT218 [GeForce 210] [ 10de:0a65 ](rev a2)
使用中のカーネルドライバー: vfio-pci
カーネルモジュール:nvidiafb、nouveau
04:00.1オーディオデバイス[0403]:NVIDIA Corporation高解像度オーディオコントローラー[ 10de:0be3 ](rev a1)
使用中のカーネルドライバー: vfio-pci
カーネルモジュール:snd_hda_intel


4. QEMUを構成し、ゲストOSを起動します


インストール(まだインストールされていない場合)
sudo apt install qemu-kvm qemu-utils seabios ovmf virt-viewer

ゲストOSをインストールするディスクを作成します
qemu-img create -f raw -o preallocation = full guest.img 50G
または
fallocate -l 50G guest.img

ビデオカードを転送せずに仮想マシンを起動して、ゲストOSをインストールします。 Looking Glassに目があるので、ゲストにはWindows 10を選択する価値があります。最新のデータに応じたWindows 8 / 8.1もサポートされています。

vga_qxl.sh
#!/ bin / bash
リモートビューアスパイス://127.0.0.1:5900&
sudo qemu-system-x86_64 \
-machine q35、accel = kvm \
-enable-kvm \
-cpu host、kvm = off、チェック\
-smp cpus = 2、ソケット= 1、コア= 2、スレッド= 1 \
-m 6G \
-rtc base = localtime、clock = host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if = pflash、format = raw、readonly、file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'w10.iso'、if = ide、format = raw、index = 2、media = cdrom、cache = none \
-drive file = 'virtio-win-0.1.141_st.iso'、if = ide、format = raw、index = 3、media = cdrom、cache = none \
-drive file = 'guest.img'、if = ide、format = raw、index = 4、media = disk、cache = writeback \
-vga qxl \
-spice port = 5900、addr = 127.0.0.1、disable-ticketing \
-monitor stdio \
-netdev user、id = n1、ipv6 = off、smb = "/ media / user / data" \
-device e1000、netdev = n1、mac = 67:77:78:88:89:99 \
「$ @」

5.ビデオカードをゲストOSに転送します


まず、2枚のビデオカードで起動します。 転送されたカードがシステムに表示され、ドライバーをその上に置き、それらが機能することを確認します。

vga_qxl_pass.sh
#!/ bin / bash
リモートビューアスパイス://127.0.0.1:5900&
sudo qemu-system-x86_64 \
-machine q35、accel = kvm \
-enable-kvm \
-cpu host、kvm = off、チェック\
-smp cpus = 2、ソケット= 1、コア= 2、スレッド= 1 \
-m 6G \
-rtc base = localtime、clock = host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if = pflash、format = raw、readonly、file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'virtio-win-0.1.141_st.iso'、if = ide、format = raw、index = 3、media = cdrom、cache = none \
-drive file = 'guest.img'、if = ide、format = raw、index = 4、media = disk、cache = writeback \
-vga qxl \
-spice port = 5900、addr = 127.0.0.1、disable-ticketing \
-device ioh3420、バス= pcie.0、addr = 1c.0、多機能=オン、ポート= 1、シャーシ= 1、id =ルート\
-device vfio-pci、ホスト= 04:00.0、バス=ルート、アドレス= 00.0、多機能=オン\
-device vfio-pci、ホスト= 04:00.1、バス=ルート、アドレス= 00.1 \
-monitor stdio \
-netdev user、id = n1、ipv6 = off、smb = "/ media / user / data" \
-device e1000、netdev = n1、mac = 67:77:78:88:89:99 \
「$ @」

転送されたビデオカードがどのように機能し、デバイスマネージャーで「デバイスは正常に動作しています」と書いた後、転送されたビデオカードでのみ仮想マシンを起動します。

vga_pass.sh
#!/ bin / bash
sudo qemu-system-x86_64 \
-machine q35、accel = kvm \
-enable-kvm \
-cpu host、kvm = off、チェック\
-smp cpus = 2、ソケット= 1、コア= 2、スレッド= 1 \
-m 6G \
-rtc base = localtime、clock = host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if = pflash、format = raw、readonly、file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'virtio-win-0.1.141_st.iso'、if = ide、format = raw、index = 3、media = cdrom、cache = none \
-drive file = 'guest.img'、if = ide、format = raw、index = 4、media = disk、cache = writeback \
-vga なし \
-device ioh3420、バス= pcie.0、addr = 1c.0、多機能=オン、ポート= 1、シャーシ= 1、id =ルート\
-device vfio-pci、ホスト= 04:00.0、バス=ルート、アドレス= 00.0、多機能=オン\
-device vfio-pci、ホスト= 04:00.1、バス=ルート、アドレス= 00.1 \
-monitor stdio \
-netdev user、id = n1、ipv6 = off、smb = "/ media / user / data" \
-device e1000、netdev = n1、mac = 67:77:78:88:89:99 \
「$ @」

モニターを接続して、ゲストOSのデスクトップイメージを鑑賞します。

簡単な決定が終わる場所


そして、楽しみが始まります。 誰か、すべてがうまく、絵がなくなって、すべてが簡単です。 イメージ不足の段階で、私の経験は2度つまずいた。 最初はIntel 6700T HD 530プロセッサの統合グラフィックスカードの転送でした。ビデオ出力は空であり、失敗はプラグインがうまく機能しないという事実に起因していました。 外部のNvidia GF210が2回目に投げられましたが、これはすでに実験用に特別に購入されたものです。 結果はさらに興味深いものでした。 非EFIモードでは、ビデオカードは正常に転送され、写真を表示することさえできましたが、ゲストOSをオフにすると失火しました

その後の転送では、ホストがハングする可能性があります。 数時間の簡単なグーグルは、ビデオカードのフリーズの問題が非常に一般的であるという事実につながります。 これにより、仮想マシンが誤ってシャットダウンされ、場合によっては正しくシャットダウンされることもあります。 出力として、EFIモードで転送することをお勧めします。 しかし、VBIOS Nvidia GF210はEFIをサポートしていません...

縫うかどうか、それが問題です


縫わないでください。 QEMUは、ビデオカードの転送時にVBIOSスプーフィングをサポートします。 ただし、VBIOSはEFIモードをサポートするようにまだ教える必要があります。 通常、ビデオカードの転送を開始する前にこれを確認することをお勧めしますたとえば、ここ[2]) 。 しかし、あるものに対処する必要があり、EFIをサポートする新しいビデオカードを探したくありませんでした。 したがって、VBIOSにパッチを適用する必要があります。 VBIOSで実行されるすべての操作は、自己の責任において行ってください。 ここからソフトウェアパッケージとその手順を使用しました[3] 。 VBIOSを読み取った後、 gt210.romファイル、パッチ、およびgt210_uefi.rom出力をgt210_uefi.romます。 これは、仮想マシンをロードするときにビデオカードをスリップする必要がある場所です。

vga_pass_rom.sh
#!/ bin / bash
sudo qemu-system-x86_64 \
-machine q35、accel = kvm \
-enable-kvm \
-cpu host、kvm = off、チェック\
-smp cpus = 2、ソケット= 1、コア= 2、スレッド= 1 \
-m 6G \
-rtc base = localtime、clock = host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if = pflash、format = raw、readonly、file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'virtio-win-0.1.141_st.iso'、if = ide、format = raw、index = 3、media = cdrom、cache = none \
-drive file = 'guest.img'、if = ide、format = raw、index = 4、media = disk、cache = writeback \
-vgaなし\
-device ioh3420、バス= pcie.0、addr = 1c.0、多機能=オン、ポート= 1、シャーシ= 1、id =ルート\
-device vfio-pci、host = 04:00.0、bus = root、addr = 00.0、 multifunction = on、 romfile = gt210_uefi.rom \
-device vfio-pci、ホスト= 04:00.1、バス=ルート、アドレス= 00.1 \
-monitor stdio \
-netdev user、id = n1、ipv6 = off、smb = "/ media / user / data" \
-device e1000、netdev = n1、mac = 67:77:78:88:89:99 \
「$ @」

仮想マシンを起動して見てみましょう。


ビデオカードの出力は暗闇で輝いていました。 もう一度、道徳は失敗のテストに合格しました。 最初に頭に浮かぶのは、起動時にゲストOSがクラッシュすることです。 ログ、彼女のログが必要です。 これを行うには、 vga_qxl.sh実行しvga_qxl.sh 。 前回の打ち上げを見ます。 そして、食べ物が鋭く引っ張られたことを除いて、すべてがうまくいきます。 動作しませんが、動作することがわかりました。 最初のアイデアは、RDPを介して接続し、そこで何が起こるかを確認することでしたが、それでも、例えばtightvnc [4]のように、VNCを使用する方が良いです。 VNCをインストールし、ポート5600を構成し、ホストからアクセスするためにこのポートを転送します。

vga_vnc_pass_rom.sh
#!/ bin / bash
sudo qemu-system-x86_64 \
-machine q35、accel = kvm \
-enable-kvm \
-cpu host、kvm = off、チェック\
-smp cpus = 2、ソケット= 1、コア= 2、スレッド= 1 \
-m 6G \
-rtc base = localtime、clock = host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if = pflash、format = raw、readonly、file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'virtio-win-0.1.141_st.iso'、if = ide、format = raw、index = 3、media = cdrom、cache = none \
-drive file = 'guest.img'、if = ide、format = raw、index = 4、media = disk、cache = writeback \
-vgaなし\
-device ioh3420、バス= pcie.0、addr = 1c.0、多機能=オン、ポート= 1、シャーシ= 1、id =ルート\
-device vfio-pci、host = 04:00.0、bus = root、addr = 00.0、multifunction = on、romfile = gt210_uefi.rom \
-device vfio-pci、ホスト= 04:00.1、バス=ルート、アドレス= 00.1 \
-monitor stdio \
-netdev user、id = n1、 hostfwd = tcp:127.0.0.1:5600-:5600、 ipv6 = off、smb = "/ media / user / data" \
-device e1000、netdev = n1、mac = 67:77:78:88:89:99 \
「$ @」

接続して作業中のマシンを確認します。モニターにのみ奇妙な汎用非PnPモニターがあります(ユニバーサルモニターはPnPではありません)。 写真があるので、Looking Glassを実行してみてください。

見るガラス


このテクノロジーはOpenGLを使用しますが、glの後にスペースは必要ありません。 ただし、プロジェクトのWebサイトで指示[5]を読む必要があります。 ゲストOSの場合、画面をダウンロードします-looking-glass-host.exe [6]をキャプチャし、Microsoft Visual C ++ 2015 Redistributableをダウンロードしてインストール[7] 、IVSHMEMデバイスのドライバーをダウンロード[8] ホストについては、依存関係を追加し、クライアントアプリケーションをダウンロードしてビルドします。

build_looking_glass_a12.sh
#!/ bin / bash
sudo apt-get install cmake libsdl2-dev libsdl2-ttf-dev nettle-dev libspice-protocol-dev libfontconfig1-dev libx11-dev fonts-freefont-ttf libconfig-dev
wget github.com/gnif/LookingGlass/archive/a12.tar.gz
tar -xf a12.tar.gz
cd LookingGlass-a12
mkdirクライアント/ビルド
cdクライアント/ビルド
cmake ../
作る

IVSHMEMデバイスを使用して仮想マシンを起動します。 1920Mの解像度では、32Mbのメモリサイズが選択されています。

vga_vnc_lg_pass_rom.sh
#!/ bin / bash
[! -f / dev / shm / looking-glass]; それから
タッチ/開発/ shm /鏡
chown `whoami`:kvm / dev / shm / looking-glass
chmod 660 / dev / shm /鏡
fi
sudo qemu-system-x86_64 \
-machine q35、accel = kvm \
-enable-kvm \
-cpu host、kvm = off、チェック\
-smp cpus = 2、ソケット= 1、コア= 2、スレッド= 1 \
-m 6G \
-rtc base = localtime、clock = host \
-device piix3-usb-uhci \
-device usb-tablet \
-drive if = pflash、format = raw、readonly、file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'virtio-win-0.1.141_st.iso'、if = ide、format = raw、index = 3、media = cdrom、cache = none \
-drive file = 'guest.img'、if = ide、format = raw、index = 4、media = disk、cache = writeback \
-vgaなし\
-device ioh3420、バス= pcie.0、addr = 1c.0、多機能=オン、ポート= 1、シャーシ= 1、id =ルート\
-device vfio-pci、host = 04:00.0、bus = root、addr = 00.0、multifunction = on、romfile = gt210_uefi.rom \
-device vfio-pci、ホスト= 04:00.1、バス=ルート、アドレス= 00.1 \
-device ivshmem-plain、memdev = ivshmem、bus = pcie.0 \
-object memory-backend-file、id = ivshmem、share = on、mem-path = / dev / shm / looking-glass、サイズ= 32M \
-monitor stdio \
-netdev user、id = n1、hostfwd = tcp:127.0.0.1:5600-:5600、ipv6 = off、smb = "/ media / user / data" \
-device e1000、netdev = n1、mac = 67:77:78:88:89:99 \
「$ @」

VNCを介して接続し、IVSHMEMデバイスにドライバーをインストールします。おそらく、「システムデバイス」にある標準ドライバーがインストールされます。 looking-glass-host.exeを実行します。 ホストで、. ./LookingGlass-a12/client/build/looking-glass-client実行し./LookingGlass-a12/client/build/looking-glass-client

これで、NVidia GF210を搭載したシステムが機能し、Intel HD530が同じルートで起動しました。 画面の解像度に小さな問題があり、まれな解像度、たとえば2048x1152に変更するには、カスタム解像度ユーティリティ[9]を使用する必要がありました。

別の微妙な点として、 looking-glass-host.exeアプリケーションを起動に追加するとき、自動ユーザーログインを設定する必要があります。セキュリティ上の理由から、ゲストOSではログイン画面をキャプチャできません。

あとがき


物理的なビデオ出力で画像を取得するタスクを設定しない場合、この結果は、物理的なビデオカードとレスポンシブコントロールを備えた機能する仮想マシンを取得するのに十分です。 管理は、ホストから別のウィンドウまたはフルスクリーンで実行されます。 ただし、微妙な違いがあります。

パフォーマンス 。 仮想化のためのオーバーヘッドであり、最も効率的なゲストOSではないため、弱く中程度のハードウェアで快適に作業することはできません。 少なくとも6〜8コアの強力なプロセッサ、ゲストOSに適したビデオカード、16 GB + RAM、各OSに少なくとも8 GBが必要です。 そして、鉄を最大限に活用するためにタンバリンと踊ります。
忍耐 。 すぐに動作しない場合は、時間と時間を適切に費やす必要があります。 検索して、読んで、試してください。 もう一度、見て、読んで、もう一度やり直してください。 出会ったリンクをいくつか残しておきます。もっと役立つ情報が見つかるかもしれません。 [10] [11] [12]

参照資料

注意、リンクはこのウィンドウで開きます。

0. https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF
1. https://en.wikipedia.org/wiki/List_of_IOMMU-supporting_hardware
2. https://www.techpowerup.com/vgabios/
3. https://www.win-raid.com/t892f16-AMD-and-Nvidia-GOP-update-No-requests-DIY.html
4. https://www.tightvnc.com/download.php
5. https://looking-glass.hostfission.com/quickstart
6. https://github.com/gnif/LookingGlass/releases
7. https://www.microsoft.com/en-us/download/details.aspx?id=48145
8. https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/upstream-virtio/
9. https://www.monitortests.com/forum/Thread-Custom-Resolution-Utility-CRU
10. https://heiko-sieger.info/running-windows-10-on-linux-using-kvm-with-vga-passthrough
11. https://ycnrg.org/vga-passthrough-with-ovmf-vfio/
12. https://www.reddit.com/r/VFIO/comments/8h352p/guide_running_windows_via_qemukvm_and_intel_gvtg/

Source: https://habr.com/ru/post/J433878/


All Articles