تعريف واستغلال المعالجات الرسومية (GPU Passthrough) في الأنظمة الوهمية


تعريف واستغلال المعالجات الرسومية (GPU Passthrough) في الأنظمة الوهمية

أهلاً بكم يا رفاق! اليوم راح نتكلم عن موضوع شيّق ومفيد جداً لعشاق الأداء العالي والألعاب على الأنظمة الوهمية: GPU Passthrough. باختصار، هذا يعني إنك تخلي جهازك الوهمي يشوف كرت الشاشة (GPU) الحقيقي اللي عندك ويستخدمه كأنه كرت شاشته الخاص، بدل ما يعتمد على محاكاة ضعيفة.

إيش هو GPU Passthrough؟

بشكل مبسط، هو تقنية تسمح لك بتمرير جهاز PCI (مثل كرت الشاشة، كرت الشبكة، أو متحكم USB) من المضيف (Host) مباشرة إلى الجهاز الوهمي (Guest). الفكرة هنا إن الجهاز الوهمي يتعامل مع هذا الجهاز كأنه متصل به فعلياً، مما يعطيه أداءً قريباً جداً من الأداء الأصلي.

ليش نحتاج GPU Passthrough؟

  • الألعاب: عشان تلعب ألعاب تتطلب رسوميات عالية داخل نظام وهمي (مثلاً، ويندوز على Linux).
  • العمل الاحترافي: برامج التصميم الهندسي، تحرير الفيديو، أو أي تطبيقات تحتاج قوة معالجة رسومية.
  • التعلم الآلي (Machine Learning): استخدام قوة الـ GPU في بيئة وهمية معزولة.
  • تجنب Dual Boot: بدلاً من إعادة تشغيل الجهاز كل مرة تنتقل بين Linux و Windows، تقدر تشغلهم سوا.

المتطلبات الأساسية

قبل ما نبدأ، لازم تتأكد إن جهازك جاهز:

  1. المعالج (CPU): لازم يدعم تقنيات المحاكاة الافتراضية.
    • Intel: VT-d (Virtualization Technology for Directed I/O)
    • AMD: AMD-Vi أو IOMMU (Input/Output Memory Management Unit)
    عادةً تكون مفعلة في الـ BIOS/UEFI، وإذا ما كانت، لازم تفعلها يدوياً.
  2. اللوحة الأم (Motherboard): لازم تدعم IOMMU وتكون منافذ الـ PCI-e موزعة بشكل يسمح بتخصيص كرت شاشة واحد للضيف. يفضل يكون عندك كرتين شاشة (واحد للمضيف وواحد للضيف)، أو يكون المعالج فيه كرت شاشة مدمج عشان المضيف يستخدمه.
  3. كرت الشاشة (GPU): بعض كروت الشاشة تتعامل أفضل مع الـ Passthrough من غيرها. كروت AMD عادةً أسهل من Nvidia في هذا الجانب بسبب قيود Nvidia على استخدام الـ Passthrough في بعض كروتها.
  4. نظام التشغيل المضيف (Host OS): Linux (طبعاً!) مع QEMU و KVM مثبتين.

الخطوات (بالتفصيل الممل)

1. تفعيل IOMMU في Kernel Parameters

هذي أول خطوة وأهمها. لازم تخلي نواة Linux تعرف إنك بتستخدم IOMMU. افتح ملف GRUB:


sudo nano /etc/default/grub

ابحث عن السطر اللي يبدأ بـ GRUB_CMDLINE_LINUX_DEFAULT وأضف له:

  • لـ Intel: intel_iommu=on
  • لـ AMD: amd_iommu=on

إذا كان عندك كرت شاشة واحد فقط وتبغى تمرره للضيف، ممكن تحتاج تضيف video=efifb:off أو vfio-pci.ids=XXXX:XXXX,YYYY:YYYY (حيث XXXX:XXXX هو ID لكرت الشاشة) عشان تمنع المضيف من استخدامه. لكن الأفضل دائمًا يكون عندك كرتين.

مثال:


GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on"

بعد التعديل، لازم تحدث GRUB:


sudo update-grub
sudo reboot

2. التحقق من تفعيل IOMMU

بعد إعادة التشغيل، تأكد إن IOMMU شغال:


dmesg | grep -i iommu

ولازم تشوف رسائل تدل على تفعيله، مثل DMAR: IOMMU enabled أو ما شابه. تأكد كمان إن الـ IOMMU Groups شغالة صح. الأجهزة اللي بتمررها لازم تكون في IOMMU Group خاصة بها أو مع أجهزة ما تهمك لو راحت للضيف (مثل متحكمات USB). إذا كان كرت الشاشة ومخرج الصوت حقه في نفس الـ Group، لازم تمررهم سوا.


for d in /sys/kernel/iommu_groups/*/devices/*; do n=${d##*/}; dev="$(lspci -nns $n)"; printf 'IOMMU Group %s %s\n' "$(basename "$(dirname "$d")")" "$dev"; done

ابحث عن كرت الشاشة حقك. راح تلاقي سطرين لكرت الشاشة (واحد للمعالج الرسومي والثاني لمخرج الصوت HDMI/DP). تأكد إنهم في نفس الـ Group.

3. تحديد معرفات PCI لكرت الشاشة (Vendor ID و Device ID)

هذي الخطوة حاسمة عشان نعرف الـ GPU اللي نبغى نمرره. استخدم lspci:


lspci -nn | grep -i vga

راح تشوف شي زي كذا:


01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] [10de:1c03] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation GP106 High Definition Audio Controller [10de:10f1] (rev a1)

القيم اللي بين الأقواس المربعة هي اللي تهمنا: [Vendor ID:Device ID]. في المثال هذا: 10de:1c03 و 10de:10f1.

4. حجب درايفرات المضيف عن كرت الشاشة

عشان نمنع نواة المضيف من استخدام كرت الشاشة، لازم نحجب الدرايفرات الافتراضية (مثل nouveau لـ Nvidia أو amdgpu لـ AMD) ونستخدم درايفر vfio-pci بدلاً منها. أولاً، نضيف vfio-pci إلى قائمة الموديلات اللي تشتغل مع الإقلاع:


echo "vfio-pci" | sudo tee /etc/modules-load.d/vfio-pci.conf

ثانياً، نحدد لـ vfio-pci يتعامل مع كرت الشاشة حقنا باستخدام الـ IDs اللي طلعناها قبل شوي:


echo "options vfio-pci ids=10de:1c03,10de:10f1" | sudo tee /etc/modprobe.d/vfio.conf

ملاحظة: استبدل 10de:1c03,10de:10f1 بالـ IDs الحقيقية لكرت الشاشة ومخرج الصوت الخاص بك.

ثالثاً، نمنع الدرايفرات الافتراضية من الارتباط بكرت الشاشة. مثلاً لـ Nvidia:


echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
echo "blacklist nvidia" | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf

ثم نحدث الـ initramfs ونعيد التشغيل:


sudo update-initramfs -u
sudo reboot

بعد إعادة التشغيل، تأكد إن vfio-pci هو اللي ماسك كرت الشاشة:


lspci -nnk | grep -i vga -A3

المفروض تشوف Kernel driver in use: vfio-pci.

5. إعداد الجهاز الوهمي (QEMU/KVM)

هنا نجي للجزء الممتع، إضافة كرت الشاشة للجهاز الوهمي. إذا كنت تستخدم virt-manager (وهو الأسهل للمبتدئين)، افتح إعدادات الجهاز الوهمي، اضغط على "Add Hardware"، ثم "PCI Host Device"، واختار كرت الشاشة ومخرج الصوت الخاص به. إذا كنت تعدل ملف XML يدوياً، أضف هذا الجزء ضمن قسم <devices>:


<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
  </source>
  <address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/>
</hostdev>

ملاحظة: domain, bus, slot, function في قسم <source> لازم تطابق قيم كرت الشاشة اللي طلعتها من lspci (مثال: 01:00.0 تعني bus='0x01', slot='0x00', function='0x0'). أما قيم <address type='pci'> فهي تحدد وين راح يظهر الجهاز داخل الجهاز الوهمي، وتقدر تختار أي قيم غير مستخدمة.

بعض النصائح والمشاكل المحتملة

شاشة سوداء في الجهاز الوهمي: تأكد إنك خصصت شاشة العرض للجهاز الوهمي على مخرج كرت الشاشة اللي سويت له Passthrough. ممكن تحتاج تشبك شاشة ثانية على هذا الكرت.

خطأ 43 في Nvidia (Code 43): هذي مشكلة شائعة مع كروت Nvidia بسبب حظرها لـ Passthrough على الأنظمة الافتراضية. فيه حلول غير رسمية تتضمن تعديل XML الجهاز الوهمي لإخفاء حقيقة إنه جهاز وهمي (مثل إضافة kvm hidden=on أو vendor_id). ابحث عن "Nvidia Error 43 passthrough fix".

الأداء ليس كما هو متوقع: تأكد إنك أعطيت الجهاز الوهمي موارد كافية (RAM، CPU Cores). تأكد إنك مثبت أحدث الدرايفرات لكرت الشاشة داخل الجهاز الوهمي.

عدم القدرة على تمرير الأجهزة: تأكد من أن IOMMU Group للأجهزة المراد تمريرها منفصلة بشكل صحيح. إذا كانت مجموعة IOMMU تحتوي على أجهزة أخرى لا تريد تمريرها، فلن تتمكن من تمريرها بشكل فردي.

الخلاصة

GPU Passthrough تقنية قوية جداً تفتح لك آفاق جديدة في استخدام الأنظمة الوهمية. نعم، ممكن تكون معقدة شوي وتتطلب صبر وبحث، لكن النتيجة النهائية تستاهل العناء: أداء رسومي شبه أصلي داخل جهازك الوهمي. استمتع!