كيفية جعل Intel GVT-g تعمل
مرحبا بالجميع! قدمت Intel حلاً ممتازًا للمشكلة الأبدية: "لدي كمبيوتر محمول على نظام Linux وأحتاج إلى تشغيل Windows مع تسريع الأجهزة ، لكن ليس لدي جهاز كمبيوتر محمول ثقيل مزود بوحدتي GPU وتبريد سائل." باستخدام بنية وحدات معالجة الرسومات الخاصة بهم أو أي شيء آخر ، تمكنوا من صنعها بحيث يمكنك تقسيم وحدة معالجة الرسومات المدمجة Intel Intel إلى وحدات معالجة وحدة معالجة أو أكثر.
لسوء الحظ ، هذا ليس بهذه البساطة ... الوثائق عفا عليها الزمن قليلاً ، وبعض الأشياء تتكسر بطريقة غير مفهومة دون سبب واضح. لذلك ، سوف أخبرك في هذا المنشور بكيفية تكوين جهاز ظاهري يعمل على تسريع أجهزة Windows مع ميزة رائعة وبرامج تشغيل Intel GVT-g السريعة.
للقيام بذلك ، تحتاج إلى GPU أكثر أو أقل حداثة ( ملاحظة المترجم : وفقًا للوثائق الرسمية ، تدعم GVT-g بطاقات الفيديو المدمجة ، بدءًا من الجيل الخامس Intel Core والجيل الرابع Xeon ).

الخطوة 1: تكوين النواة
تحقق من أن لديك إصدار kernel جديد. يبدو أن الخيارات الخاصة بـ GVT-g قد تم تضمينها قبل الإصدار 4.8 ، ولكن من المؤكد أنها كانت تعمل بشكل أسوأ ، لذلك أوصي باستخدام أحدث إصدار متوفر. إذا كنت أصليًا بدرجة كافية لإنشاء نواة لديك ، فقم بتمكين هذه الخيارات . قم أيضًا بتعطيل إزالة ksyms غير المستخدمة ، لأن هذا الخيار يؤدي إلى حدوث خلل .
أنت الآن بحاجة إلى إصلاح وسيطات سطر الأوامر kernel. الخيارات المهمة هي:
i915.enable_gvt=1 kvm.ignore_msrs=1 intel_iommu=on i915.enable_guc=0
تأكد من عدم تخطي enable_guc=0
بشيء سيمكّن تحميل GuC ، لأن هذا سيؤدي إلى تعطل محبط لبرنامج i915. عند التمهيد ، انتقل إلى بيئة العمل الخاصة بك وتحقق من الدليل / /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/
. إذا لم يكن موجودًا ، فلن يعمل GVT-g. تحقق من السجلات و / أو البكاء في الوسادة.
كحل للمشكلة ، يمكنك إضافة هذه الوحدات النمطية إلى initramfs وإزالة i915 من هناك.
لتسجيل أكثر تفصيلاً ، يمكنك ضبط المتغير drm.debug
على بعض القيمة ، على سبيل المثال ، drm.debug
على 0x02 رسائل من برامج التشغيل.
الخطوة 2: إنشاء صديق الظاهري
داخل mdev_supported_types
يمكنك العثور على مجموعة كاملة من الأدلة. يتم تحديد هذه المجموعة حسب مقدار ذاكرة الرسومات الخاصة بك ، كل دليل فرعي يتوافق مع نوع من GPU الظاهري. يحتوي ملف description
فيه على معلومات حول الذاكرة والقرارات التي يدعمها وحدة معالجة الرسومات الافتراضية هذه. إذا كان إنشاء GPU ظاهريًا ذا ذاكرة كبيرة باستخدام إخراج UUID في الملف /create
يمنحك خطأً غير مفهوم ، فحينئذٍ لديك عدة خيارات. أولاً ، انتقل إلى BIOS وأضف ذاكرة الفيديو ، إن أمكن. إذا لم ينجح هذا ، فيمكنك إيقاف DM الخاص بك ، والتحول إلى أداة إزالة الإطار ، وإنشاء vGPU المطلوب من هناك ، ثم العودة إلى x11. لسوء الحظ ، تؤدي هذه الطريقة إلى العديد من الأخطاء ولا تسمح بتحقيق 60 إطارًا في الثانية على جهاز الكمبيوتر المحمول. البديل هو إنشاء vGPU أصغر ، واستخدام برنامج خاص لزيادة الدقة (CRU). بهذه الطريقة ، تمكنت من تحقيق 60 إطارًا في الثانية ، وكان هناك عدد أقل من الأخطاء والتجميد.
يمكنك إنشاء vGPU باستخدام هذا الأمر:
$ echo ${vGPU_UUID} | sudo tee /sys/bus/pci/devices/0000:00:02.0/mdev_supported_types/${vGPU_TYPE}/create
وحذف - هذا:
$ echo 1 | sudo tee /sys/bus/mdev/devices/${vGPU_UUID}/remove
ملاحظة المترجم :
يمكنك إنشاء UUID لـ vGPU باستخدام الأمر uuidgen
بدون وسيطات. يشير المتغير $ {vGPU_TYPE} إلى أحد الأنواع المدرجة في دليل mdev_supported_types
. تجدر الإشارة أيضًا إلى أنه يجب إعادة إنشاء vGPU في كل عملية إعادة تشغيل ، ولا يتم حفظها بين عمليات إطلاق نظام التشغيل.
الخطوة 3: يصرخ كورتانا عليك
الخطوة التالية هي دعم أفضل بكثير وأبطأ ومؤلمة - تثبيت Windows 10. لا تستخدم السيول أو التنزيلات غير الرسمية ، أو الإصدار القديم من Windows ، الرابط الصحيح موجود هنا . يجدر أيضًا تنزيل صورة القرص باستخدام برامج التشغيل الفعلية المصممة خصيصًا لتسريع الضيوف هنا . تثبيت libvirt
و virt-manager
وتشغيل libvirtd
:
# systemctl start libvirtd
قم بتشغيل تطبيق virt-manager
وتأكد من اتصالك libvirt
نظام libvirt
وليس المستخدم:

ملاحظة المترجم :
من أجل أن يكون المدير الفعلي قادرًا على الاتصال بجلسة النظام ، يمكنك تشغيله كجذر ، ولكن من الأفضل تكوين التوثيق ، على سبيل المثال ، كما هو مقترح في Arch Wiki .
بمجرد القيام بذلك ، يمكنك البدء في إنشاء جهاز افتراضي. في مربع الحوار "إعدادات" ، حدد التنزيل من الصورة المحلية iso وابحث عن الصورة التي تم تنزيلها. إذا لم يتعرف virt-manager
ذلك على أنه صورة Windows 10 ، فحددها يدويًا ، حيث سيعمل ذلك على تسريع Windows ، حيث إن virt-manager
في هذه الحالة يوفر بعض الواجهات الافتراضية من Microsoft. إنشاء صورة قرص أو قسم LVM وتكوين ما تحتاج إليه. واجهة الإعداد قبل التثبيت محدودة للغاية ، لذلك عادةً ما أبدأ التثبيت وأوقفه فورًا لتكوين كل شيء بشكل كامل. فيما يلي بعض الإعدادات:


ملاحظة المترجم :
على الرغم من حقيقة أن المشاركة في إعداد جهاز افتراضي على جهاز كمبيوتر محمول ، لسبب ما ، تم حذف السؤال حول توزيع الشبكة باستخدام محول لاسلكي. الحقيقة هي أن إعدادات الشبكة الافتراضية في virt-manager ليست مناسبة لشبكة لاسلكية. في هذه الحالة ، يمكن أن تساعد الإجابة على هذا السؤال والتعليقات عليه. يقترح المؤلف أيضًا استخدام BIOS بدلاً من UEFI ، وربما يرجع ذلك إلى حقيقة أن UEFI يتطلب تهيئة إضافية. أيضًا ، يبدو أن tianocore لا يعمل مع GVT-g حتى الآن ، انظر الخطأ 935 . في حالتي ، بدأت VM ، لكن Windows لم يتعرف على الشاشة التي تم توصيل بطاقة الفيديو المدمجة بها.
إذا كنت بحاجة إلى الوصول السريع إلى القرص أو حتى قدرة الجهاز الظاهري على ضغط صورة القرص عند حذف ملفات الجهاز الظاهري (إعادة توجيه TRIM ، لهذا فأنت بحاجة إلى إنشاء الصورة باستخدام الأمر qemu-img create -f qcow2 -o preallocation=metadata,lazy_refcounts
، فإن التعليمات الكاملة هنا ) ، تكوين محرك الأقراص الأساسي لاستخدام SCSI. ستحتاج إلى برامج تشغيل الجهاز الظاهري لـ Windows لفهم هذا التنسيق ، لذلك قم بتوصيل قرص برنامج التشغيل الفعلي الذي تم تنزيله مسبقًا لنظام التشغيل Windows 10. بشكل افتراضي ، يستخدمون IDE ، ولكن يمكنك تسريع عملية التثبيت عدة مرات واستخدام رمز قديم أقل إذا كنت تستخدم بدلاً من ذلك لأقراص الفيديو الرقمية SCSI. يدعم ويندوز هذا خارج الصندوق. كما يمكنك:
- فرض USB لاستخدام USB 3.0
- أضف قنوات التوابل و spice-webdav و qemu-ga بحيث تنسخ وتشترك وتشترك في تبادل الملفات بين VM والعمل المضيف
- إزالة الأجهزة الافتراضية غير المستخدمة
- بدّل بطاقة الفيديو التي تمت مضاهاتها إلى QXL وقم بتبديل العرض إلى SPICE ، وليس الاستماع إلى الشبكة (حتى الاسترجاع) ( ملاحظة المترجم: وإلا يتعطل جهاز VM ).
- بدّل نوع الرقائق إلى Q35 ، مع تحديد إعدادات BIOS.
- إطعام الكلب
يمكنك أيضًا التعود على virsh edit
صديقك الجديد. إذا قمت بتشغيله باستخدام sudo -E
، فسيتم استخدام متغيرات البيئة لديك ، خاصة EDITOR ، للتحرير ، وسوف تستخدم جلسة نظام libvirt ، وليس المستخدم. في هذا الملف ، على سبيل المثال ، يمكنك تعيين مراسلات بين المعالجات الفعلية والظاهرية ، نظرًا لتخزين ذاكرات التخزين المؤقت للمعالج أكثر اتساقًا ويتصرف المجدول غير الغريب. فيما يلي مثال XML يمكنك وضعه هناك:
<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>
في هذا المقتطف ، أقوم بتكوين جهاز VM بحيث يرى معالجًا يحتوي على ثلاثة مراكز أساسية ، ولكل منها خيطان مفرطان. علاوة على ذلك ، يتم إرفاق كل معالج / مؤشر ترابط فرعي بسلسلة العمليات التشعبية الخاصة به ، ولا تتغير هذه المراسلات. يعرف Windows Scheduler عن hyperthreads ويمكن استخدامه بشكل صحيح ، وليس حسابهم كمعالجات منفصلة. يمكنني أيضًا تمكين بعض واجهات Hyper-V التي يتم إيقاف تشغيلها افتراضيًا وقد لا يكون لها تأثير. إذا كنت تستخدم SPICE ، فيمكنك إضافة الأسطر التالية لتعطيل الضغط ، لأن الشبكة الخارجية لا تزال غير مستخدمة للوصول إلى VM.
<graphics type='spice'> <listen type='none'/> <image compression='off'/> <jpeg compression='never'/> <zlib compression='never'/> <playback compression='off'/> <streaming mode='off'/> </graphics>
يمكنك الآن تكوين ترتيب التمهيد وبدء تثبيت Windows. إذا كنت تستخدم محرك أقراص virtio
أو SCSI ، فلن يعثر عليه Windows. ستحتاج إلى تثبيت برنامج تشغيل SCSI من محرك الأقراص الذي تتصل به ، فهي موجودة في دليل virtscsi/amd64
. يجب أن يسير كل شيء بسلاسة ، ويجب أن يقوم نظام التشغيل Windows بالتمهيد في وضع بطيء وبائس لا يتم تسريعه. سيبدأ Cortana في الصراخ عليك ، ولن تعمل شبكتك. اختراق كل ذلك إلى سطح المكتب. هناك ، قم بتشغيل مدير الجهاز ، والعثور على جميع الأجهزة غير المحددة ، وتحديث برامج التشغيل لها من القرص الذي قمت بتوصيله. سوف تحصل على ويندوز أسرع قليلا.
الخطوة 4: الجزء المرح
هناك ثلاث طرق للحصول على شاشة VM افتراضية متسارعة من Windows على شاشة جهازك.
- VNC أو بعض بروتوكول الوصول عن بُعد (عادة ما يكون هذا حلًا سيئًا للغاية). في هذا الخيار ، تحتاج فقط إلى توصيل vGPU وتعطيل جميع شاشات العرض وبطاقات الفيديو الأخرى. قم أيضًا بتعيين إعداد
display='off'
. لا تحتاج إلى خيار igd-opregion
الموضح لاحقًا. - SPICE (لم أستطع تحقيق 30 إطارًا في الثانية أو أعلى ، لكن الحافظة العامة ونقل الملفات بين جهاز VM والعمل المضيف).
- المدمج في واجهة QEMU على GTK + (الحافظة المشتركة ونقل الملفات لا تعمل ، ولكن يمكنك تحقيق 60 إطارا في الثانية مع التصحيح).
كل ما تنوي استخدامه ، لا يزال عليك استخدام الخيار الثاني لتثبيت برامج تشغيل وحدة معالجة الرسومات. لا تعمل برامج تشغيل Microsoft المضمنة بشكل جيد مع GVT-g في وقت كتابة هذا التقرير ، وغالبًا ما تنكسر. قبل أن تقوم بتوصيل vGPU بجهاز VM ، يُنصح بتنزيل أحدث برنامج تشغيل من Intel (على ما يبدو ، تقوم Intel بتغيير نهجها في توزيع برامج التشغيل ، لذلك قد تكون هذه الخطوة في المستقبل مختلفة أو غير ضرورية على الإطلاق). الآن تأكد من قيامك بإنشاء vGPU. افتح virt-manager
واستبدل QXL سريع جيد مع Cirrus بطيئة لتجنب الصراعات. لتوصيل vGPU بجهاز VM ، تحتاج إلى فتح virsh edit
وإضافة الجزء التالي في مكان ما:
<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>
ملاحظة: عندما أقدم مقتطف XML مثل هذا ، يجب عليك إضافته إلى النسخة الحالية إن أمكن ، دون استبدال أي شيء.
تحقق من أنك قمت بإنشاء UUIDs فريدة من نوعها لجميع vGPUs الذي تستخدمه وأن أرقام الفتحات لا تتعارض مع أي من أجهزة PCI الأخرى. إذا كان رقم الفتحة بعد وحدة معالجة الرسومات Cirrus ، فسوف يتعطل الجهاز الظاهري. الآن يمكنك بدء تشغيل الجهاز الظاهري. تحتاج إلى تثبيت virt-viewer
لمشاهدة كل من يعرض! يمكنك الاتصال بجهاز VM باستخدام الأمر
$ sudo -E virt-viewer --attach
ستكون إحدى شاشات العرض فارغة أو غير مهيأة ، والثاني عبارة عن شاشة مألوفة وصغيرة وغير متسارعة. قم بتوسيعه ، وبعد إدخاله ، قم بتثبيت برنامج تشغيل GPU. إذا كنت محظوظًا ، فسيعمل كل شيء على الفور. بخلاف ذلك ، يجب إيقاف تشغيل VM (عدم إعادة التشغيل) وإعادة تشغيله باستخدام شاشة العمل. الآن حان الوقت لفتح محطة وتشغيل dmesg -w
الداخل. يمنحك هذا الأمر بعض المعلومات المفيدة حول المشاكل والتقدم العام باستخدام vGPU. على سبيل المثال ، في وقت التمهيد ، ستشكو KVM من MSR المحظورة ، ثم يجب أن تحصل على بعض رسائل الوصول غير الصحيحة عند تهيئة vGPU. إذا كان هناك الكثير ، فهناك خطأ ما.
في حالة قيام النظام بالتمهيد ، يمكنك فتح إعدادات العرض وإيقاف تشغيل الشاشة غير المتسارعة. يمكن إخفاء شاشة فارغة من خلال القائمة " عرض " في virt-viewer
. من حيث المبدأ ، يمكن بالفعل استخدام VMs ، ولكن هناك بعض الأشياء التي يمكن القيام بها لتحقيق دقة أعلى وسرعة أعلى.
الأداة المساعدة CRU مفيدة للغاية. يمكنك اللعب به ، وحتى إذا تعثرت على بعض التحف الرسومية أو حتى شاشة سوداء بالكامل تقريبًا ، كما تبين لي ، يمكنك تشغيل ملف Restart64.exe
الذي يأتي مع البرنامج لإعادة تشغيل النظام الفرعي لرسومات Windows. شخصيا ، أنا استخدم هذه الأداة لاستخدام دقة أعلى على vGPU أكثر تواضعا.
لتحقيق 60 إطارًا في الثانية ممتازًا ، تحتاج إلى التبديل إلى شاشة QEMU المدمجة على GTK + دون دعم الحافظة المشتركة مع المضيف والكعك المشابهة ، بالإضافة إلى تغيير سطر واحد فيه وإعادة إنشاء QEMU. ستحتاج أيضًا إلى إضافة مجموعة من وسيطات سطر الأوامر سيئة إلى XML الخاص بك. أزل شاشة SPICE وبطاقة Cirrus الرسومية واضبط سمة display
الخاصة بـ vGPU على وضع off
(لا تدعم libvirt الشاشة على GTK + ولن تسمح بالتمهيد من display='on'
بدون عرض).
<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>
توسيع نطاق HiDPI على شاشة QEMU يعمل بشكل سيء للغاية ، لذلك سنقوم بإيقاف تشغيله. أيضًا ، ستحتاج إلى تعيين متغير DISPLAY
على رقم العرض الذي تستخدمه. لمنح المستخدم الذي يقوم بتشغيل وصول qemu إلى خادم X ، استخدم الأمر:
# xhost si:localuser:nobody
إذا لم ينجح ذلك ، فجرّب xhost +
، ولكن تأكد من استخدامك لجدار الحماية. وإلا ، جرب طريقة أكثر أمانًا.
مع مثل هذه الحيل ، لن تحصل على أكثر من 30 إطارًا في الثانية نظرًا لهذا الخطأ الغبي في QEMU ، إذا لم تقم بتصحيحه عن طريق تغيير الخط ، كما هو موضح في رابط التعليق. تأكد من إنشاء QEMU فقط لـ x86-64 ، إلا إذا كنت تنوي استخدامه على نظام أساسي آخر. أرفقت PKGBUILD الخاص بي ، والذي لا يغير الخط ، ولكن يجمع فقط QEMU لـ x86_64 دون دعم تخزين الشبكة هنا .
إذا كنت تضيع في مكان ما على طول الطريق ، يمكنك أن ترى XML الخاص بي الحالي لل libvirt .
روابط مفيدة
دليل ضبط GVT-g الرسمي
دليل مستخدم DMA-buf
إعداد إعداد GVT-g من Intel على NixOS Wiki
مقالة ويكي حول libvirt
إعداد الشبكة في KVM على الواجهة اللاسلكية
موقع Intel GVT-g
ملاحظة: شكرا aNNiMON للمساعدة في تدقيق نص الترجمة وتصحيح الأخطاء.