Kami menggunakan mesin virtual Windows dengan penerusan kartu video virtual menggunakan QEMU dan Intel GVT-g

Cara membuat Intel GVT-g berfungsi


Halo semuanya! Intel menawarkan solusi yang sangat baik untuk masalah abadi: "Saya punya laptop di Linux dan saya harus menjalankan Windows dengan akselerasi perangkat keras, tetapi saya tidak memiliki laptop yang berat dengan dua GPU dan pendingin cair." Menggunakan arsitektur GPU mereka atau sesuatu yang lain, mereka berhasil membuatnya sehingga Anda dapat membagi Intel GPU terintegrasi Anda menjadi dua atau lebih GPU.


Sayangnya, ini tidak sesederhana itu ... Dokumentasinya sedikit usang, dan beberapa hal pecah dengan cara yang tidak dapat dimengerti tanpa alasan yang jelas. Oleh karena itu, dalam posting ini saya akan memberi tahu Anda cara mengkonfigurasi perangkat keras mesin virtual Windows yang dipercepat dengan virtio keren dan driver cepat Intel GVT-g.


Untuk melakukan ini, Anda memerlukan GPU yang kurang lebih modern ( Catatan Penerjemah : menurut dokumentasi resmi , GVT-g mendukung kartu video terintegrasi, dimulai dengan Intel Core generasi kelima dan Xeon generasi keempat ).


Tangkapan layar Windows


Langkah 1: konfigurasikan kernel


Pastikan Anda memiliki versi kernel baru. Tampaknya opsi untuk GVT-g dimasukkan sebelum versi 4.8, tetapi kemudian mereka pasti bekerja lebih buruk, jadi saya sarankan menggunakan kernel terbaru yang tersedia. Jika Anda cukup orisinal untuk membangun kernel, aktifkan opsi ini . Nonaktifkan juga penghapusan ksym yang tidak digunakan, karena opsi ini menyebabkan bug .


Sekarang Anda perlu memperbaiki argumen baris perintah kernel. Opsi penting adalah:


i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=on i915.enable_guc=0 

Pastikan Anda tidak mengesampingkan enable_guc=0 dengan sesuatu yang akan mengaktifkan pemuatan GuC, karena ini akan menyebabkan crash driver i915 yang menyedihkan. Ketika Anda boot, masuk ke lingkungan kerja Anda dan periksa direktori /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/ . Jika tidak ada, GVT-g tidak berfungsi. Periksa log dan / atau menangis di bantal.


Sebagai solusi untuk masalah ini, Anda dapat menambahkan modul ini ke initramfs dan menghapus i915 dari sana.


Untuk pencatatan yang lebih terperinci, Anda dapat mengatur variabel drm.debug ke beberapa nilai, misalnya, mengaturnya ke 0x02 akan menyertakan pesan dari driver.


Langkah 2: buat teman virtual


Di dalam mdev_supported_types Anda dapat menemukan seluruh set direktori. Set ini ditentukan oleh jumlah memori grafis Anda, setiap subdirektori sesuai dengan beberapa jenis GPU virtual. File description di dalamnya berisi informasi tentang memori dan resolusi yang didukung oleh GPU virtual ini. Jika membuat GPU virtual dengan memori besar menggunakan output UUID di file /create memberi Anda kesalahan yang tidak bisa dipahami, maka Anda memiliki beberapa opsi. Pertama, buka BIOS dan tambahkan memori video, jika memungkinkan. Jika ini tidak berhasil, Anda dapat menghentikan DM Anda, beralih ke framebuffer, buat vGPU yang diinginkan dari sana, dan kemudian kembali ke x11. Sayangnya, metode ini menyebabkan banyak bug dan tidak memungkinkan untuk mencapai 60 FPS di laptop saya. Alternatifnya adalah membuat vGPU yang lebih kecil, dan menggunakan program khusus untuk meningkatkan resolusi (CRU). Dengan cara ini, saya berhasil mencapai 60 FPS, dan ada jauh lebih sedikit bug dan macet.


Anda dapat membuat vGPU dengan perintah ini:


 $ echo ${vGPU_UUID} | sudo tee /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/${vGPU_TYPE}/create 

Dan hapus - ini:


 $ echo 1 | sudo tee /sys/bus/mdev/devices/${vGPU_UUID}/remove 

Catatan Penerjemah :
Anda dapat membuat UUID untuk vGPU menggunakan perintah uuidgen tanpa argumen. Variabel $ {vGPU_TYPE} menunjukkan salah satu jenis yang tercantum dalam direktori mdev_supported_types . Perlu juga dicatat bahwa vGPU harus dibuat ulang di setiap reboot, mereka tidak disimpan di antara peluncuran OS.


Langkah 3: Cortana meneriaki Anda


Langkah selanjutnya jauh lebih baik didukung dan jauh lebih lambat dan menyakitkan - menginstal Windows 10. Jangan gunakan torrent atau unduhan tidak resmi, atau versi Windows yang lama, tautan yang benar ada di sini . Anda juga perlu mengunduh image disk dengan driver virtio yang dirancang khusus untuk mempercepat tamu di sini . Instal libvirt dan libvirt virt-manager dan jalankan libvirtd :


 # systemctl start libvirtd 

Jalankan virt-manager dan pastikan Anda terhubung ke sesi sistem libvirt , bukan yang pengguna:
Jendela Virt-manager


Catatan Penerjemah :
Agar manajer virt dapat terhubung ke sesi sistem, Anda dapat menjalankannya sebagai root, tetapi lebih baik untuk mengkonfigurasi otorisasi, misalnya, seperti yang disarankan pada Arch Wiki .


Setelah Anda melakukan ini, Anda dapat mulai membuat mesin virtual. Dalam dialog pengaturan, pilih unduhan dari iso-image lokal dan temukan gambar yang diunduh. Jika virt-manager tidak mengenalinya sebagai gambar Windows 10, pilih secara manual, karena ini akan mempercepat Windows, karena virt-manager dalam hal ini menyediakan beberapa antarmuka virtualisasi dari Microsoft. Buat disk image atau partisi LVM dan konfigurasikan sesuai kebutuhan. Antarmuka setup sebelum instalasi sangat terbatas, jadi saya biasanya memulai instalasi dan segera menghentikannya untuk sepenuhnya mengkonfigurasi semuanya. Berikut ini beberapa pengaturan:
Pengaturan CPU Mesin Virtual
Pengaturan jaringan mesin virtual


Catatan Penerjemah :
Terlepas dari kenyataan bahwa posting tentang pengaturan mesin virtual pada laptop, untuk beberapa alasan pertanyaan tentang mendistribusikan jaringan menggunakan adaptor nirkabel dihilangkan. Faktanya adalah bahwa pengaturan jaringan default di virt-manager tidak cocok untuk jaringan nirkabel. Dalam situasi ini, jawaban untuk pertanyaan ini dan komentar di atasnya dapat membantu. Penulis juga menyarankan untuk menggunakan BIOS daripada UEFI, mungkin karena fakta bahwa UEFI memerlukan konfigurasi tambahan. Juga, sepertinya tianocore belum bekerja dengan GVT-g, lihat bug 935 . Dalam kasus saya, VM mulai, tetapi Windows tidak mengenali monitor yang terhubung dengan kartu video terintegrasi.


Jika Anda memerlukan akses cepat ke disk atau bahkan kemampuan mesin virtual untuk memampatkan gambar disk saat menghapus file mesin virtual (TRIM menyelidiki, untuk ini Anda perlu membuat gambar dengan perintah qemu-img create -f qcow2 -o preallocation=metadata,lazy_refcounts , instruksi lengkap ada di sini ), konfigurasikan drive utama untuk menggunakan SCSI. Anda akan memerlukan driver untuk mesin virtual untuk Windows untuk memahami format ini, jadi tancapkan disk driver virtio yang diunduh sebelumnya untuk Windows 10. Secara default, mereka menggunakan IDE, tetapi Anda dapat mempercepat instalasi beberapa kali dan menggunakan kode legacy lebih sedikit jika Anda menggunakan sebagai gantinya untuk DVD SCSI. Windows mendukung ini di luar kotak. Anda juga dapat:


  • Paksa USB untuk menggunakan USB 3.0
  • Tambahkan bumbu, bumbu-webdav dan saluran qemu-ga sehingga menyalin dan menempel dan berbagi file antara VM dan pekerjaan host
  • Hapus perangkat keras virtual yang tidak digunakan
  • Alihkan kartu video yang ditiru ke QXL dan alihkan layar ke SPICE, BUKAN mendengarkan jaringan (bahkan loopback) ( Catatan Penerjemah: jika tidak VM akan crash ).
  • Ganti jenis chip ke Q35, atur di sebelah pengaturan BIOS.
  • Beri makan anjing

Anda juga dapat membiasakan diri dengan teman baru Anda virsh edit . Jika Anda menjalankannya menggunakan sudo -E , variabel lingkungan Anda, khususnya EDITOR, akan digunakan untuk mengedit, dan Anda akan menggunakan sesi sistem libvirt, bukan yang pengguna. Dalam file ini, misalnya, Anda dapat menetapkan korespondensi antara prosesor fisik dan virtual, karena cache prosesor lebih konsisten dan penjadwal berperilaku tidak begitu aneh. Berikut adalah contoh XML yang dapat Anda letakkan di sana:


 <vcpu placement='static'>6</vcpu> <cputune> <vcpupin vcpu='0' cpuset='1'/> <vcpupin vcpu='1' cpuset='2'/> <vcpupin vcpu='2' cpuset='3'/> <vcpupin vcpu='3' cpuset='5'/> <vcpupin vcpu='4' cpuset='6'/> <vcpupin vcpu='5' cpuset='7'/> </cputune> <features> <hyperv> <relaxed state='on'/> <vapic state='on'/> <spinlocks state='on' retries='8191'/> <runtime state='on'/> <synic state='on'/> <stimer state='on'/> </hyperv> </features> <cpu mode='host-passthrough' check='none'> <topology sockets='1' cores='3' threads='2'/> </cpu> 

Dalam cuplikan ini, saya mengkonfigurasi VM sehingga melihat prosesor dengan tiga core fisik, yang masing-masing memiliki dua hyperthreads. Selanjutnya, setiap prosesor / hyper-thread menempel pada hyper-thread-nya sendiri, dan korespondensi ini tidak berubah. Penjadwal Windows tahu tentang hyperthreads dan dapat menggunakannya dengan benar, tidak menghitungnya sebagai prosesor terpisah. Saya juga mengaktifkan beberapa antarmuka Hyper-V yang dinonaktifkan secara default dan mungkin tidak berpengaruh. Jika Anda menggunakan SPICE, Anda dapat menambahkan baris berikut untuk menonaktifkan kompresi, karena jaringan eksternal masih tidak digunakan untuk mengakses VM.


 <graphics type='spice'> <listen type='none'/> <image compression='off'/> <jpeg compression='never'/> <zlib compression='never'/> <playback compression='off'/> <streaming mode='off'/> <!-- <gl enable='yes' rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/>     ,     libvirt --> </graphics> 

Sekarang Anda dapat mengkonfigurasi urutan boot dan memulai instalasi Windows. Jika Anda menggunakan virtio atau drive SCSI, Windows tidak akan menemukannya. Anda perlu menginstal driver SCSI dari drive yang Anda sambungkan, mereka berada di direktori virtscsi/amd64 . Semuanya harus berjalan dengan lancar, dan Windows harus mem-boot dalam mode yang dipercepat dan lambat bukan dipercepat. Cortana akan mulai berteriak pada Anda, dan jaringan Anda tidak akan berfungsi. Hancurkan semuanya ke desktop. Di sana, luncurkan manajer perangkat, temukan semua perangkat yang tidak dikenal, dan perbarui driver untuk mereka dari disk yang Anda sambungkan. Anda akan mendapatkan Windows yang sedikit lebih cepat.


Langkah 4: Bagian yang Menyenangkan


Ada tiga cara untuk mendapatkan tampilan VM virtual yang dipercepat dari Windows di layar mesin Anda.


  • VNC atau protokol akses jarak jauh lainnya (biasanya ini adalah solusi yang sangat buruk). Dalam opsi ini, Anda hanya perlu menghubungkan vGPU dan menonaktifkan semua tampilan dan kartu video lainnya. Juga atur pengaturan display='off' . Anda tidak perlu opsi igd-opregion ditampilkan nanti.
  • SPICE (saya tidak bisa mencapai 30 FPS atau lebih tinggi, tetapi clipboard umum dan transfer file antara VM dan host bekerja).
  • Antarmuka QEMU bawaan pada GTK + (clipboard dan transfer file bersama tidak berfungsi, tetapi 60 FPS dapat dicapai dengan tambalan).

Apa pun yang ingin Anda gunakan, Anda masih harus menggunakan opsi kedua untuk menginstal driver untuk GPU. Driver bawaan Microsoft tidak bekerja dengan baik dengan GVT-g pada saat penulisan, dan sering rusak. Sebelum Anda menghubungkan vGPU ke VM, disarankan untuk mengunduh driver terbaru dari Intel (Rupanya, Intel mengubah pendekatannya untuk mendistribusikan driver , jadi di masa depan langkah ini mungkin berbeda atau tidak perlu sama sekali). Sekarang pastikan Anda telah membuat vGPU. Buka virt-manager dan gantikan QXL cepat yang bagus dengan Cirrus yang lambat untuk menghindari konflik. Untuk menghubungkan vGPU ke VM, Anda perlu membuka virsh edit dan menambahkan fragmen berikut di suatu tempat:


 <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> <hostdev mode='subsystem' type='mdev' managed='no' model='vfio-pci' display='on'> 

 <address uuid='fff6f017-3417-4ad3-b05e-17ae3e1a4615'/> 

  <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> <rom enabled='no'/> </hostdev> <graphics type='spice'> <listen type='none'/> <image compression='off'/> <jpeg compression='never'/> <zlib compression='never'/> <playback compression='off'/> <streaming mode='off'/> <gl enable='yes' rendernode='/dev/dri/by-path/pci-0000:00:02.0-render'/> <!--      , virt-manager     ,        GL. ,      ,   auto. --> </graphics> <qemu:commandline> <qemu:arg value='-set'/> <qemu:arg value='device.hostdev0.x-igd-opregion=on'/> <!-- libvirt     ,      --> </qemu:commandline> </domain> 

Catatan: Saat saya memberikan potongan XML seperti ini, Anda harus menambahkannya ke yang sekarang jika memungkinkan, tanpa mengganti apa pun.


Verifikasi bahwa Anda telah membuat UUID unik untuk semua vGPU yang Anda gunakan dan bahwa nomor slot tidak bertentangan dengan perangkat PCI lainnya. Jika nomor slot adalah setelah GPU Cirrus, mesin virtual akan macet. Sekarang Anda dapat memulai mesin virtual. Anda perlu menginstal virt-viewer untuk melihat kedua tampilan! Anda dapat terhubung ke VM menggunakan perintah


 $ sudo -E virt-viewer --attach 

Salah satu tampilan akan menjadi kosong atau tidak diinisialisasi, yang kedua adalah tampilan yang akrab, kecil, dan tidak dipercepat. Perluas itu dan, setelah masuk, instal driver untuk GPU. Jika Anda beruntung, semuanya akan segera berhasil. Jika tidak, Anda harus mematikan dan memulai ulang VM (jangan restart) menggunakan layar yang berfungsi. Sekarang saatnya untuk membuka terminal dan menjalankan dmesg -w di dalamnya. Perintah ini akan memberi Anda beberapa informasi yang berguna tentang masalah dan kemajuan keseluruhan menggunakan vGPU. Misalnya, pada saat boot, KVM akan mengeluh tentang MSR diblokir, maka Anda harus mendapatkan beberapa pesan akses yang salah ketika vGPU diinisialisasi. Jika ada terlalu banyak, ada sesuatu yang salah.


Jika sistem melakukan boot, Anda dapat membuka pengaturan tampilan dan mematikan layar yang tidak dipercepat. Layar kosong dapat disembunyikan melalui menu View di virt-viewer . Pada prinsipnya, VM sudah dapat digunakan, tetapi ada beberapa hal yang dapat dilakukan untuk mencapai resolusi yang lebih tinggi dan kecepatan yang lebih tinggi.


Utilitas CRU sangat berguna. Anda dapat bermain-main dengannya, dan bahkan jika Anda menemukan beberapa artefak grafis atau bahkan hampir layar hitam, ternyata bagi saya, Anda dapat menjalankan file Restart64.exe yang datang dengan program untuk memulai kembali subsistem grafis Windows. Secara pribadi, saya menggunakan utilitas ini untuk menggunakan resolusi lebih tinggi pada vGPU yang lebih sederhana.


Untuk mencapai 60 FPS yang luar biasa, Anda perlu beralih ke monitor QEMU bawaan pada GTK + tanpa mendukung clipboard bersama dengan host dan roti serupa, serta mengubah satu baris di dalamnya dan membangun kembali QEMU. Anda juga perlu menambahkan banyak argumen baris perintah tidak menyenangkan ke XML Anda. Hapus tampilan SPICE dan kartu grafis Cirrus dan off atribut display vGPU Anda (libvirt tidak mendukung tampilan pada GTK + dan tidak akan mengizinkan booting dari display='on' tanpa layar).


  <qemu:commandline> <qemu:arg value='-set'/> <qemu:arg value='device.hostdev0.x-igd-opregion=on'/> <qemu:arg value='-set'/> <qemu:arg value='device.hostdev0.display=on'/> <qemu:arg value='-display'/> <qemu:arg value='gtk,gl=on'/> <qemu:env name='DISPLAY' value=':1'/> <qemu:env name='GDK_SCALE' value='1.0'/> </qemu:commandline> 

Penskalaan untuk HiDPI pada monitor QEMU bekerja sangat buruk, jadi kami akan mematikannya. Selain itu, Anda perlu mengatur variabel DISPLAY ke nomor tampilan yang Anda gunakan. Untuk memberikan pengguna yang menjalankan akses qemu ke server X, gunakan perintah:


 # xhost si:localuser:nobody 

Jika ini tidak berhasil, coba xhost + , tetapi pastikan Anda menggunakan firewall. Jika tidak, coba metode yang lebih aman.


Dengan trik semacam itu, Anda masih tidak akan mendapatkan di atas 30 FPS karena bug bodoh ini di QEMU, jika Anda tidak menambalnya dengan mengubah baris, seperti yang ditunjukkan dalam tautan komentar. Pastikan Anda hanya membangun QEMU untuk x86-64, kecuali Anda bermaksud menggunakannya pada platform lain. Saya memasang PKGBUILD saya, yang tidak mengubah jalur, tetapi hanya mengumpulkan QEMU untuk x86_64 tanpa dukungan penyimpanan jaringan di sini .


Jika Anda tersesat di suatu tempat di sepanjang jalan, Anda dapat melihat XML saya saat ini untuk libvirt .


Tautan yang bermanfaat


Panduan Tuning Resmi GVT-g
Panduan Pengguna Dma-buf
Intel GVT-g Setup Artikel pada NixOS Wiki
Arch artikel Wiki di libvirt
Pengaturan jaringan di KVM pada antarmuka nirkabel
Situs web Intel GVT-g


PS: Terima kasih aNNiMON untuk bantuan dalam mengoreksi teks terjemahan dan memperbaiki kesalahan.

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


All Articles