تعريف واستغلال المعالجات الرسومية (GPU Passthrough) في الأنظمة الوهمية
يا هلا بالشباب! اليوم بندخل في موضوع من جد يغير قواعد اللعبة لعشاق الأنظمة الوهمية والجيمنج: GPU Passthrough. باختصار، هذي التقنية تخليك تاخذ كرت الشاشة حقك الفعلي اللي في جهازك وتخليه متاح بالكامل لنظام وهمي (Virtual Machine) كأنه مركب فيه مباشرة. يعني ودع أداء الرسوميات الضعيف في الـ VMs، واستمتع بقوة كرت الشاشة الكاملة داخل ويندوز وهمي مثلاً عشان تلعب أو تشتغل على برامج تصميم ثقيلة.
المتطلبات الأساسية: وش تحتاج عشان تبدأ؟
قبل ما نخش في الشغل العملي، لازم تتأكد إن جهازك جاهز. هذي قائمة سريعة باللي تحتاجه:
- المعالج (CPU) واللوحة الأم (Motherboard): لازم يدعموا تقنية IOMMU. هذي التقنية هي اللي تسمح لك بتمرير الأجهزة مباشرة للأنظمة الوهمية.
- لأنظمة Intel: ابحث عن
Intel VT-dأوIntel Virtualization Technology for Directed I/O. - لأنظمة AMD: ابحث عن
AMD-ViأوAMD IOMMU.
- لأنظمة Intel: ابحث عن
- كرت الشاشة (GPU): يفضل يكون عندك كرتين شاشة. واحد للمضيف (Host) وواحد للضيف (Guest). مو ضروري يكونوا بنفس القوة، ممكن كرت مدمج في المعالج للمضيف وكرت قوي للضيف. لو عندك كرت واحد، ممكن تسوي passthrough له لكن بتكون تجربتك أصعب لأن المضيف بيحتاج يعرض شي.
ملاحظة: بعض كروت NVIDIA الحديثة فيها قيود على الـ passthrough في البيئات الافتراضية، لكن فيه حلول (مثل تعديل درايفر الضيف). كروت AMD عادةً أسهل في التعامل.
- نظام تشغيل المضيف (Host OS): أي توزيعة Linux حديثة تدعم KVM/QEMU و Libvirt. أغلب الناس يستخدمون Ubuntu, Fedora, Arch Linux.
- نظام تشغيل الضيف (Guest OS): عادةً يكون Windows عشان الألعاب أو برامج التصميم، لكن ممكن تستخدم أي Linux Distro.
الخطوات العملية: يلا نشتغل!
1. تفعيل IOMMU في الـ BIOS/UEFI
ادخل على إعدادات الـ BIOS/UEFI لجهازك (عادةً بالضغط على Del, F2, F10 أو F12 عند الإقلاع) وابحث عن الخيارات اللي ذكرناها فوق (VT-d أو AMD-Vi) وفعلها. احفظ الإعدادات وأعد تشغيل الجهاز.
2. تفعيل IOMMU في نواة Linux
بعد ما فعلتها في الـ BIOS، لازم تقول لنواة Linux تستخدمها.
افتح ملف إعدادات GRUB:
sudo nano /etc/default/grub
ابحث عن السطر اللي يبدأ بـ GRUB_CMDLINE_LINUX_DEFAULT= وأضف له:
- لـ Intel:
intel_iommu=on - لـ AMD:
amd_iommu=on
إذا كنت تستخدم كرت شاشة واحد وتريد تمريره، قد تحتاج أيضًا إلى إضافة iommu=pt و vfio_pci.ids=XXXX:XXXX حيث XXXX:XXXX هو الـ Vendor ID والـ Device ID لكرت الشاشة الخاص بك. لكن خلينا نبدأ بالأساسيات.
مثال لـ Intel:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on"
بعد التعديل، لازم تحدث GRUB وتعيد تشغيل الجهاز:
sudo update-grub
sudo reboot
بعد إعادة التشغيل، تأكد إن IOMMU شغال:
dmesg | grep -i iommu
أو:
find /sys/kernel/iommu_groups/ -type l
إذا شفت مخرجات تدل على وجود IOMMU Groups، أنت في الطريق الصحيح.
3. تحديد IOMMU Group لكرت الشاشة
هذي خطوة مهمة جداً. لازم تعرف كرت الشاشة حقك في أي مجموعة IOMMU عشان تقدر تمرره. استخدم الأمر التالي:
lspci -nnv | grep -iE 'vga|audio|3d|display'
هذا الأمر بيعرض لك كل الأجهزة الرسومية والصوتية (كرت الشاشة عادةً يجي معاه كرت صوت مدمج). سجل الـ PCI ID حق كرت الشاشة والصوت (يكون على شكل XXXX:XXXX).
مثال:
01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP107 [GeForce GTX 1050 Ti] [10de:1c82] (rev a1)
01:00.1 Audio device [0403]: NVIDIA Corporation GP107GL High Definition Audio Controller [10de:0fb9] (rev a1)
هنا الـ Vendor ID هو 10de والـ Device ID للـ VGA هو 1c82 وللصوت هو 0fb9.
بعدين، لازم تتأكد إنهم في نفس الـ IOMMU Group:
for d in $(find /sys/kernel/iommu_groups/*/devices -type l | sort -V); do
n=${d##*/}; p=${d%/*}; g=${p##*/};
printf 'IOMMU Group %s: %s\n' "$g" "$n";
done
ابحث عن الـ PCI IDs اللي سجلتها (مثلاً 0000:01:00.0 و 0000:01:00.1). لازم يكونوا في نفس الـ IOMMU Group. إذا كانوا منفصلين، عندك مشكلة في الـ IOMMU Grouping وهذا يحتاج حلول متقدمة (مثل Patching Kernel أو شراء لوحة أم أفضل).
4. عزل كرت الشاشة عن المضيف
الآن لازم تمنع نواة المضيف من استخدام كرت الشاشة اللي ناوي تمرره.
أول شي، حمل وحدات vfio في النواة:
sudo modprobe vfio
sudo modprobe vfio_pci
sudo modprobe vfio_iommu_type1
عشان تتأكد إنها تتحمل مع كل إقلاع:
echo "vfio_pci" | sudo tee /etc/modules-load.d/vfio-pci.conf
بعدين، نربط كرت الشاشة ووحدة الصوت المرافقة له بوحدة vfio_pci بدلاً من درايفرات NVIDIA/AMD الأصلية.
أنشئ ملف إعدادات لـ modprobe:
sudo nano /etc/modprobe.d/vfio.conf
وأضف السطر التالي، مع استبدال الـ Vendor ID والـ Device ID اللي حصلت عليها في الخطوة 3:
options vfio_pci ids=10de:1c82,10de:0fb9
لو عندك كرت شاشة واحد فقط، لازم تضيف disable_vga=1 أيضاً:
options vfio_pci ids=10de:1c82,10de:0fb9 disable_vga=1
بعدين، لازم تتأكد إن الدرايفرات الأصلية ما تحملت قبل vfio_pci.
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf
echo "blacklist amdgpu" | sudo tee -a /etc/modprobe.d/blacklist.conf
echo "blacklist radeon" | sudo tee -a /etc/modprobe.d/blacklist.conf
echo "blacklist nvidia" | sudo tee -a /etc/modprobe.d/blacklist.conf
echo "blacklist snd_hda_intel" | sudo tee -a /etc/modprobe.d/blacklist.conf
حدث الـ initramfs (ملف صور النواة البدائي):
sudo update-initramfs -u
sudo reboot
بعد إعادة التشغيل، تأكد إن الدرايفر vfio-pci هو اللي ماسك كرت الشاشة:
lspci -nnk | grep -iE 'vga|audio|3d|display' -A3
المفروض تشوف Kernel driver in use: vfio-pci.
5. إعداد QEMU/Libvirt لـ Passthrough
الآن نجي للقسم المهم، كيف تخلي النظام الوهمي يستخدم الكرت.
أول شي، تأكد إن libvirt شغال وعندك الأدوات اللازمة:
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
سجل خروج وادخل مرة ثانية عشان تتفعل الصلاحيات.
افتح virt-manager (مدير الأجهزة الوهمية). أنشئ نظام وهمي جديد.
أثناء عملية إنشاء النظام الوهمي، أو بعد إنشائه، اذهب إلى إعدادات النظام الوهمي.
اضغط على "Add Hardware" (إضافة جهاز).
اختار "PCI Host Device" (جهاز PCI مضيف).
هنا بتشوف قائمة بأجهزة PCI المتاحة. اختار كرت الشاشة (الجزء الرسومي والصوتي).
نصيحة: تأكد إنك تختار كل مكونات كرت الشاشة، عادةً يكون فيهفيه بعض التعديلات المهمة اللي لازم تسويها في ملف XML الخاص بالنظام الوهمي. اعرض ملف XML للنظام الوهمي:VGAوAudio.
virsh edit <اسم_النظام_الوهمي>
ابحث عن قسم وأضف التالي (إذا ما كان موجود):
<features>
<acpi/>
<apic/>
<hyperv>
<relaxed state='on'/>
<vapic state='on'/>
<spinlocks state='on' retries='8191'/>
</hyperv>
<kvm>
<hidden state='on'/>
</kvm>
<vmport state='off'/>
</features>
هذي التعديلات تخلي النظام الوهمي يبدو كأنه جهاز حقيقي أكثر، وهذا مهم لبعض درايفرات كروت الشاشة (خاصة NVIDIA).
تأكد أيضاً إنك تستخدم UEFI firmware للنظام الوهمي. تلقاها في قسم BIOS أو Firmware في إعدادات النظام الوهمي في virt-manager. اختر UEFI x86_64: /usr/share/OVMF/OVMF_CODE.fd أو ما شابه.
احفظ التعديلات.
6. تثبيت نظام الضيف والدرايفرات
شغل النظام الوهمي. ثبت نظام التشغيل (مثلاً Windows). بعد التثبيت، ثبت درايفرات كرت الشاشة الرسمية من موقع الشركة المصنعة (NVIDIA أو AMD). إذا كل شي تمام، المفروض كرت الشاشة يشتغل بأدائه الكامل داخل النظام الوهمي!
حل المشاكل ونصائح إضافية
- الشاشة السوداء: هذي مشكلة شائعة، خصوصاً مع كروت NVIDIA. جرب إضافة
video=efifb:offإلىGRUB_CMDLINE_LINUX_DEFAULTفي المضيف. أيضاً تأكد من إعداداتhidden stateفي الـ XML. - الأداء: تأكد إنك مخصص موارد كافية للنظام الوهمي (CPU Cores, RAM). استخدم أقراص NVMe أو SSD لأفضل أداء.
- IOMMU Grouping: لو كرت الشاشة والصوت مو في نفس الـ IOMMU Group، هذي مشكلة كبيرة. ممكن تحتاج تحديث BIOS، أو Kernel Patching، أو تغيير اللوحة الأم.
- USB Passthrough: إذا كنت بتلعب، ممكن تحتاج تمرير لوحة المفاتيح والماوس (أو حتى يد التحكم) مباشرة للنظام الوهمي عشان تتجنب أي تأخير. تقدر تسويها بنفس طريقة الـ PCI Passthrough لكن لجهاز الـ USB.
- Snapshotting: لا تعتمد على الـ Snapshots مع الـ GPU Passthrough، ممكن تسبب مشاكل.
وبكذا نكون خلصنا درس GPU Passthrough! الموضوع ممكن يكون معقد شوي في البداية، لكن لما يشتغل، التجربة تستاهل كل التعب. استمتع بألعابك وبرامجك بقوة كرت الشاشة الكاملة داخل نظامك الوهمي!