KVM, PCI passthrough, Looking Glass dan semuanya

Setelah transisi yang sukses ke pengembang perangkat lunak Linux, momen datang ketika sedikit bekerja, dan juga mengubah OS utama. Kekhawatiran disebabkan oleh perangkat lunak necro-platform untuk mendukung proyek yang ada. Sebagian dari perangkat lunak bekerja melalui anggur. Namun, ternyata perangkat lunak tertentu menolak untuk bekerja di bawah anggur. Diputuskan untuk menjalankan perangkat lunak pada mesin virtual QEMU + KVM. Perangkat lunak mulai berjalan, tetapi bekerja di dalamnya agak tidak nyaman. Perangkat lunak kartu video virtual tidak berbeda dalam kinerja, dan dukungan grafis 3D sangat sederhana. Saya harus mengungkap rebana dan mencari jalan keluar.

Alokasikan kartu video terpisah ke sistem tamu!


Tidak butuh waktu lama untuk menemukan jalan keluar, tetapi gagasan untuk memukul rebana dengan lampu sorot ternyata sangat aneh. Pada topik meneruskan kartu video ke mesin virtual, Internet penuh dengan instruksi dari berbagai waktu dan untuk berbagai perangkat keras. Apa itu artikel besar di situs Arch Linux [0] . Saya akan memberikan versi singkat dari instruksi untuk meneruskan kartu video.

0. Periksa apakah perangkat keras mendukung IOMMU


Misalnya, di sini [1] .

1. Kami menyertakan dukungan IOMMU dalam kernel.


cat / etc / default / grub
GRUB_CMDLINE_LINUX_DEFAULT = "quiet splash amd_iommu = on"
atau
GRUB_CMDLINE_LINUX_DEFAULT = "quiet splash intel_iommu = on"


Jangan lupa sudo update-grub .

2. Kami memilih kartu video dari driver


Kami mencari perangkat yang diperlukan dan melihat driver mana yang menggunakannya.

lspci -nnk
04: 00.0 Pengontrol kompatibel VGA [0300]: NVIDIA Corporation GT218 [GeForce 210] [ 10de: 0a65 ] (rev a2)
Driver kernel yang digunakan: nouveau
Modul kernel: nvidiafb, nouveau
04: 00.1 Perangkat audio [0403]: NVIDIA Corporation High Definition Audio Controller [ 10de: 0be3 ] (rev a1)
Driver kernel yang digunakan: snd_hda_intel
Modul kernel: snd_hda_intel


Tambahkan modul VFIO sehingga mereka dimuat saat boot.

cat / etc / modules | grep vfio
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd


Kami mengkonfigurasi modul VFIO sehingga memotong perangkat, mencegah driver utama memuat. Jika perlu, tambahkan ke daftar hitam driver utama.

cat /etc/modprobe.d/vfio.conf
Pilihan vfio-pci id = 10de: 0a65,10de: 0be3
blacklist nouveau


3. Reboot dan periksa apakah semuanya berhasil


IOMMU dihidupkan.

dmesg | grep -e DMAR -e IOMMU -e AMD-Vi
DMAR: Teknologi Virtualisasi Intelยฎ untuk I / O Sutradara
atau
AMD-Vi: Ditemukan IOMMU pada 0000: 00: 00.2 cap 0x40
AMD-Vi: Memetakan ulang interrupt diaktifkan
AMD-Vi: Lazy IO / TLB flushing diaktifkan


Perangkat komposit jatuh ke dalam satu grup.

untuk in / sys / kernel / iommu_groups / *; temukan $ a -type l; selesai | 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


Driver KVM dan VFIO dimuat.

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


Kartu video untuk OS tamu yang ditangkap oleh VFIO.

lspci -nnk
04: 00.0 Pengontrol kompatibel VGA [0300]: NVIDIA Corporation GT218 [GeForce 210] [ 10de: 0a65 ] (rev a2)
Driver kernel yang digunakan: vfio-pci
Modul kernel: nvidiafb, nouveau
04: 00.1 Perangkat audio [0403]: NVIDIA Corporation High Definition Audio Controller [ 10de: 0be3 ] (rev a1)
Driver kernel yang digunakan: vfio-pci
Modul kernel: snd_hda_intel


4. Konfigurasikan QEMU dan luncurkan OS tamu


Instal, jika belum diinstal
sudo apt install qemu-kvm qemu-utils seabios ovmf virt-viewer

Buat disk tempat OS tamu akan diinstal
qemu-img create -f raw -o preallocation = guest.img penuh 50G
atau
fallocate -l 50G guest.img

Kami memulai mesin virtual tanpa meneruskan kartu video untuk menginstal OS tamu. Karena ada pemandangan di Looking Glass, maka untuk para tamu ada baiknya memilih Windows 10. Windows 8 / 8.1 menurut data terbaru juga didukung.

vga_qxl.sh
#! / bin / bash
rempah-rempah penampil jarak jauh: //127.0.0.1: 5900 &
sudo qemu-system-x86_64 \
-machine q35, accel = kvm \
-mengaktifkan-kvm \
-cpu host, kvm = off, centang \
-smp cpus = 2, soket = 1, core = 2, utas = 1 \
-m 6G \
-rtc base = localtime, clock = host \
-device piix3-usb-uhci \
-lengkapan usb-tablet \
-drive if = pflash, format = mentah, hanya baca, file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'w10.iso', jika = ide, format = mentah, indeks = 2, media = cdrom, cache = tidak ada \
-drive file = 'virtio-win-0.1.141_st.iso', jika = ide, format = mentah, indeks = 3, media = cdrom, cache = tidak ada \
-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 \
pengguna -netdev, id = n1, ipv6 = off, smb = "/ media / pengguna / data" \
-lengkapan e1000, netdev = n1, mac = 67: 77: 78: 88: 89: 99 \
"$ @"

5. Kami meneruskan kartu video ke OS tamu


Untuk memulai, boot dengan dua kartu video. Kami melihat bahwa kartu yang diteruskan muncul di sistem, meletakkan driver di dalamnya dan memastikan bahwa mereka berfungsi.

vga_qxl_pass.sh
#! / bin / bash
rempah-rempah penampil jarak jauh: //127.0.0.1: 5900 &
sudo qemu-system-x86_64 \
-machine q35, accel = kvm \
-mengaktifkan-kvm \
-cpu host, kvm = off, centang \
-smp cpus = 2, soket = 1, core = 2, utas = 1 \
-m 6G \
-rtc base = localtime, clock = host \
-device piix3-usb-uhci \
-lengkapan usb-tablet \
-drive if = pflash, format = mentah, hanya baca, file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'virtio-win-0.1.141_st.iso', jika = ide, format = mentah, indeks = 3, media = cdrom, cache = tidak ada \
-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 \
-perangkat ioh3420, bus = pcie.0, addr = 1c.0, multifungsi = aktif, port = 1, sasis = 1, id = root \
-device vfio-pci, host = 04: 00.0, bus = root, addr = 00.0, multifungsi = on \
-device vfio-pci, host = 04: 00.1, bus = root, addr = 00.1 \
-monitor stdio \
pengguna -netdev, id = n1, ipv6 = off, smb = "/ media / pengguna / data" \
-lengkapan e1000, netdev = n1, mac = 67: 77: 78: 88: 89: 99 \
"$ @"

Setelah bagaimana kartu video yang diteruskan bekerja, dan di manajer perangkat menulis "Perangkat bekerja dengan baik", kami memulai mesin virtual hanya dengan kartu video yang diteruskan.

vga_pass.sh
#! / bin / bash
sudo qemu-system-x86_64 \
-machine q35, accel = kvm \
-mengaktifkan-kvm \
-cpu host, kvm = off, centang \
-smp cpus = 2, soket = 1, core = 2, utas = 1 \
-m 6G \
-rtc base = localtime, clock = host \
-device piix3-usb-uhci \
-lengkapan usb-tablet \
-drive if = pflash, format = mentah, hanya baca, file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'virtio-win-0.1.141_st.iso', jika = ide, format = mentah, indeks = 3, media = cdrom, cache = tidak ada \
-drive file = 'guest.img', if = ide, format = raw, index = 4, media = disk, cache = writeback \
-tidak ada \
-perangkat ioh3420, bus = pcie.0, addr = 1c.0, multifungsi = aktif, port = 1, sasis = 1, id = root \
-device vfio-pci, host = 04: 00.0, bus = root, addr = 00.0, multifungsi = on \
-device vfio-pci, host = 04: 00.1, bus = root, addr = 00.1 \
-monitor stdio \
pengguna -netdev, id = n1, ipv6 = off, smb = "/ media / pengguna / data" \
-lengkapan e1000, netdev = n1, mac = 67: 77: 78: 88: 89: 99 \
"$ @"

Kami menghubungkan monitor ke sana dan mengagumi gambar desktop OS tamu.

Tempat di mana keputusan sederhana berakhir


Dan kemudian kesenangan dimulai. Seseorang, semuanya baik-baik saja, gambarnya sudah hilang dan semuanya sederhana. Pengalaman saya tersandung dua kali pada tahap kekurangan gambar. Pertama kali adalah penerusan kartu grafis terintegrasi dari prosesor Intel 6700T HD 530, output video kosong dan kegagalan itu disebabkan oleh fakta bahwa plug-in tidak berfungsi dengan baik. Kali kedua Nvidia GF210 eksternal terlempar, yang sudah dibeli secara khusus untuk percobaan. Hasilnya bahkan lebih menarik. Dalam mode non EFI, kartu video berhasil diteruskan dan bahkan menunjukkan gambar, tetapi mematikan OS tamu gagal .

Penerusan berikutnya hanya bisa menggantung tuan rumah. Beberapa jam googling mudah mengarah pada fakta bahwa masalah pembekuan kartu video cukup umum. Ini mengarah ke shutdown yang salah dari mesin virtual, dan dengan beberapa kemungkinan bahkan shutdown yang benar. Sebagai output, disarankan untuk meneruskan dalam mode EFI. Tetapi VBIOS Nvidia GF210 tidak mendukung EFI ...

Menjahit atau tidak menjahit, itulah pertanyaannya


Jangan dijahit. QEMU mendukung spoofing VBIOS saat meneruskan kartu video. Tetapi VBIOS masih harus diajarkan untuk mendukung mode EFI. Biasanya disarankan untuk memeriksa ini sebelum Anda mulai meneruskan kartu video, misalnya di sini [2] . Tetapi kita harus berurusan dengan apa yang ada, dan tidak ingin mencari kartu video baru dengan dukungan EFI. Jadi, Anda perlu menambal VBIOS. Semua operasi yang dilakukan dengan VBIOS dilakukan dengan risiko Anda sendiri. Saya menggunakan paket perangkat lunak dan instruksi untuknya dari sini [3] . Setelah membaca VBIOS kita mendapatkan file gt210.rom , tambalan dan pada output kita memiliki gt210_uefi.rom . Di sinilah Anda perlu menyelipkan kartu video saat memuat mesin virtual.

vga_pass_rom.sh
#! / bin / bash
sudo qemu-system-x86_64 \
-machine q35, accel = kvm \
-mengaktifkan-kvm \
-cpu host, kvm = off, centang \
-smp cpus = 2, soket = 1, core = 2, utas = 1 \
-m 6G \
-rtc base = localtime, clock = host \
-device piix3-usb-uhci \
-lengkapan usb-tablet \
-drive if = pflash, format = mentah, hanya baca, file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'virtio-win-0.1.141_st.iso', jika = ide, format = mentah, indeks = 3, media = cdrom, cache = tidak ada \
-drive file = 'guest.img', if = ide, format = raw, index = 4, media = disk, cache = writeback \
-tidak ada \
-perangkat ioh3420, bus = pcie.0, addr = 1c.0, multifungsi = aktif, port = 1, sasis = 1, id = root \
-device vfio-pci, host = 04: 00.0, bus = root, addr = 00.0, multifungsi = aktif, romfile = gt210_uefi.rom \
-device vfio-pci, host = 04: 00.1, bus = root, addr = 00.1 \
-monitor stdio \
pengguna -netdev, id = n1, ipv6 = off, smb = "/ media / pengguna / data" \
-lengkapan e1000, netdev = n1, mac = 67: 77: 78: 88: 89: 99 \
"$ @"

Kami memulai mesin virtual dan mencari.

Kegelapan


Output kartu video bersinar dalam gelap. Sekali lagi, moralitas lulus ujian kegagalan. Hal pertama yang terlintas dalam pikiran adalah bahwa OS tamu lumpuh saat startup. Log, aku butuh log-nya. Untuk melakukan ini, jalankan vga_qxl.sh . Kami melihat peluncuran sebelumnya. Dan di sana semuanya baik-baik saja, kecuali bahwa makanan itu ditarik dengan tajam. Ternyata itu berfungsi, meskipun tidak berhasil. Gagasan pertama adalah terhubung melalui RDP dan melihat apa yang terjadi di sana, tetapi tetap lebih baik menggunakan VNC, misalnya tightvnc [4] . Kami menginstal VNC, mengkonfigurasi port 5600 dan meneruskan port ini untuk akses dari host.

vga_vnc_pass_rom.sh
#! / bin / bash
sudo qemu-system-x86_64 \
-machine q35, accel = kvm \
-mengaktifkan-kvm \
-cpu host, kvm = off, centang \
-smp cpus = 2, soket = 1, core = 2, utas = 1 \
-m 6G \
-rtc base = localtime, clock = host \
-device piix3-usb-uhci \
-lengkapan usb-tablet \
-drive if = pflash, format = mentah, hanya baca, file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'virtio-win-0.1.141_st.iso', jika = ide, format = mentah, indeks = 3, media = cdrom, cache = tidak ada \
-drive file = 'guest.img', if = ide, format = raw, index = 4, media = disk, cache = writeback \
-tidak ada \
-perangkat ioh3420, bus = pcie.0, addr = 1c.0, multifungsi = aktif, port = 1, sasis = 1, id = root \
-device vfio-pci, host = 04: 00.0, bus = root, addr = 00.0, multifungsi = aktif, romfile = gt210_uefi.rom \
-device vfio-pci, host = 04: 00.1, bus = root, addr = 00.1 \
-monitor stdio \
pengguna -netdev, id = n1, hostfwd = tcp: 127.0.0.1: 5600-: 5600, ipv6 = mati, seseorang = "/ media / pengguna / data" \
-lengkapan e1000, netdev = n1, mac = 67: 77: 78: 88: 89: 99 \
"$ @"

Kami terhubung dan melihat mesin yang berfungsi, hanya monitor yang memiliki Monitor Non-PnP Generik yang aneh (Monitor Universal bukan PnP). Ada gambar, jadi Anda bisa mencoba menjalankan Looking Glass.

Mencari kaca


Meskipun teknologi ini menggunakan OpenGL, tidak ada ruang yang diperlukan setelah gl. Tetapi Anda perlu membaca instruksi [5] di situs web proyek. Untuk OS tamu, unduh layar - ambil aplikasi mencari-glass-host.exe [6] , unduh dan instal Microsoft Visual C ++ 2015 Redistributable [7] , unduh driver untuk perangkat IVSHMEM [8] . Untuk tuan rumah, kami menambahkan dependensi, mengunduh dan membangun aplikasi klien.

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 font-freefont-ttf libconfig-dev
wget github.com/gnif/LookingGlass/archive/a12.tar.gz
tar -xf a12.tar.gz
cd LookingGlass-a12
mkdir client / build
klien cd / build
cmake ../
membuat

Kami memulai mesin virtual dengan perangkat IVSHMEM. Ukuran memori 32Mb dipilih untuk resolusi 1920x1080.

vga_vnc_lg_pass_rom.sh
#! / bin / bash
jika [! -f / dev / shm / looking-glass]; lalu
sentuh / dev / shm / looking-glass
chown `whoami`: kvm / dev / shm / looking-glass
chmod 660 / dev / shm / looking-glass
fi
sudo qemu-system-x86_64 \
-machine q35, accel = kvm \
-mengaktifkan-kvm \
-cpu host, kvm = off, centang \
-smp cpus = 2, soket = 1, core = 2, utas = 1 \
-m 6G \
-rtc base = localtime, clock = host \
-device piix3-usb-uhci \
-lengkapan usb-tablet \
-drive if = pflash, format = mentah, hanya baca, file = / usr / share / OVMF / OVMF_CODE.fd \
-drive file = 'virtio-win-0.1.141_st.iso', jika = ide, format = mentah, indeks = 3, media = cdrom, cache = tidak ada \
-drive file = 'guest.img', if = ide, format = raw, index = 4, media = disk, cache = writeback \
-tidak ada \
-perangkat ioh3420, bus = pcie.0, addr = 1c.0, multifungsi = aktif, port = 1, sasis = 1, id = root \
-device vfio-pci, host = 04: 00.0, bus = root, addr = 00.0, multifungsi = aktif, romfile = gt210_uefi.rom \
-device vfio-pci, host = 04: 00.1, bus = root, addr = 00.1 \
-perangkat ivshmem-plain, memdev = ivshmem, bus = pcie.0 \
-mencoba memori-backend-file, id = ivshmem, share = aktif, mem-path = / dev / shm / looking-glass, size = 32M \
-monitor stdio \
pengguna -netdev, id = n1, hostfwd = tcp: 127.0.0.1: 5600-: 5600, ipv6 = mati, seseorang = "/ media / pengguna / data" \
-lengkapan e1000, netdev = n1, mac = 67: 77: 78: 88: 89: 99 \
"$ @"

Kami terhubung melalui VNC, instal driver pada perangkat IVSHMEM, mungkin driver standar akan diinstal di atasnya, yang terletak di "System Devices". Kami mulai mencari-kaca-host.exe . Di host, jalankan ./LookingGlass-a12/client/build/looking-glass-client .

Mengenai hal ini, sistem dengan NVidia GF210 bekerja untuk saya, dan kemudian Intel HD530 diluncurkan di rute yang sama. Ada masalah kecil dengan resolusi layar, untuk mengubah ke resolusi langka, misalnya 2048x1152, saya harus menggunakan Custom Resolution Utility [9] .

Nuansa lain, ketika menambahkan aplikasi mencari-kaca-host.exe ke autoload, Anda perlu mengkonfigurasi login pengguna otomatis, untuk alasan keamanan, OS tamu tidak memungkinkan menangkap layar login.

Kata penutup


Jika Anda tidak menetapkan tugas, memperoleh gambar pada output video fisik, maka hasil ini akan cukup untuk mendapatkan mesin virtual yang berfungsi dengan kartu video fisik dan kontrol responsif. Manajemen dilakukan dari host di jendela terpisah atau di layar penuh. Namun, ada nuansa.

Performa . Sumber daya overhead untuk virtualisasi dan bukan OS tamu yang paling efisien tidak akan memungkinkan Anda untuk bekerja dengan nyaman pada perangkat keras yang lemah dan sedang-rendah. Ini akan membutuhkan prosesor yang kuat setidaknya 6-8 core, kartu grafis yang bagus untuk OS tamu, 16GB + RAM, setidaknya 8GB untuk setiap OS. Dan menari dengan rebana untuk mendapatkan hasil maksimal dari besi.
Sabar . Jika tidak segera bekerja, maka Anda harus menghabiskan waktu dan waktu dengan sopan. Cari, baca, coba. Sekali lagi, lihat, baca, dan coba lagi. Saya akan meninggalkan beberapa tautan lagi yang saya jumpai, mungkin akan ada beberapa informasi yang lebih berguna. [10] [11] [12]

Referensi

Perhatian, tautan terbuka di jendela ini.

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/id433878/


All Articles