الvirtualisation في Linux: KVM وQEMU وlibvirt
أتقن الvirtualisation في Linux باستخدام KVM وQEMU وlibvirt: إنشاء الآلات الافتراضية باستخدام virt-install وvirsh، وأقراص qcow2، وشبكات bridge، وcloud-init.
InSkillCoach
الvirtualisation في Linux: KVM وQEMU وlibvirt
KVM هو الـ hypervisor المدمج في نواة Linux، وهو الذي يشغّل جزءًا كبيرًا من الحوسبة السحابية حول العالم، من OpenStack إلى عروض الاستضافة الكثيرة. وعند اقترانه بـ QEMU لمحاكاة العتاد وبـ libvirt للإدارة، يحوّل أي جهاز Linux إلى منصة virtualisation متكاملة، دون ترخيص أو منتج من طرف ثالث. في هذا الدليل ننطلق من التحقق من دعم العتاد وصولًا إلى آلات افتراضية تُجهَّز تلقائيًا باستخدام cloud-init، مرورًا بـ virt-install وvirsh وأقراص qcow2 وإعداد الشبكة.
لنوضّح أولًا دور كل مكوّن: KVM هو وحدة النواة (kernel module) التي تتيح الوصول إلى تعليمات الـ virtualisation في المعالج؛ وQEMU يحاكي العتاد (الأقراص وبطاقات الشبكة وBIOS/UEFI) ويعتمد على KVM لتنفيذ شيفرة الضيف بسرعة قريبة من السرعة الأصلية؛ أما libvirt فهي طبقة الإدارة (API وdaemon وواجهة سطر الأوامر virsh) التي توحّد التحكم في المنظومة بأكملها.
1. التحقق من دعم العتاد
تتطلب الـ virtualisation العتادية امتدادات Intel VT-x أو AMD-V، مفعّلة في BIOS/UEFI.
# عدّ أعلام الـ virtualisation في /proc/cpuinfo
# vmx = Intel VT-x، svm = AMD-V ؛ النتيجة الأكبر من 0 مؤشر جيد
grep -Ec '(vmx|svm)' /proc/cpuinfo
# على Ubuntu/Debian، تعطي الأداة المخصصة حكمًا واضحًا
sudo apt install cpu-checker
kvm-ok
# النتيجة المتوقعة:
# INFO: /dev/kvm exists
# KVM acceleration can be used
# التحقق من تحميل وحدات النواة
lsmod | grep kvm
# يجب أن تظهر kvm_intel (أو kvm_amd) وkvm
# التحقق من جهاز KVM
ls -l /dev/kvm
إذا أشار kvm-ok إلى أن الـ virtualisation معطّلة، فأعد التشغيل وفعّل VT-x/AMD-V في الـ firmware. أما للـ virtualisation المتداخلة (آلة افتراضية داخل آلة افتراضية، وهي مفيدة في المختبرات):
# التحقق من دعم الـ virtualisation المتداخلة (Intel)
cat /sys/module/kvm_intel/parameters/nested
# Y أو 1 = مفعّلة
2. تثبيت KVM وQEMU وlibvirt
Debian/Ubuntu
# تثبيت الـ hypervisor وطبقة الإدارة والأدوات
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients \
virtinst bridge-utils qemu-utils
# تشغيل daemon الخاص بـ libvirt وتفعيله
sudo systemctl enable --now libvirtd
# إضافة المستخدم إلى المجموعات اللازمة
# (يلزم تسجيل الخروج ثم الدخول ليسري المفعول)
sudo usermod -aG libvirt,kvm "$USER"
Rocky Linux/Fedora
# مجموعة الحزم virtualization تثبّت كل ما يلزم
sudo dnf install @virtualization
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt "$USER"
التحقق من التثبيت
# تشخيص كامل لمضيف الـ virtualisation
virt-host-validate
# يجب أن تكون جميع أسطر QEMU بحالة PASS (تحذيرات WARN الخاصة بـ IOMMU
# مقبولة إن لم تكن تستخدم passthrough لأجهزة PCI)
# التحقق من الاتصال بـ libvirt
virsh -c qemu:///system list --all
يوجد نوعان من عناوين URI للاتصال: qemu:///system (آلات افتراضية يديرها daemon النظام، وهو الموصى به للخوادم) وqemu:///session (آلات المستخدم، دون صلاحيات مرتفعة). ولتفادي أي لبس:
# إجبار virsh على استخدام اتصال النظام افتراضيًا
echo 'export LIBVIRT_DEFAULT_URI=qemu:///system' >> ~/.bashrc
3. إنشاء آلة افتراضية باستخدام virt-install
تجهيز الصورة والتخزين
# المجلد القياسي لصور libvirt
ls /var/lib/libvirt/images/
# تنزيل ISO لنظام Debian (مثال)
sudo wget -P /var/lib/libvirt/images/ \
https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-13.1.0-amd64-netinst.iso
تثبيت تفاعلي من ISO
# إنشاء آلة افتراضية: 2 vCPU، 4 غيغابايت RAM، قرص qcow2 بسعة 20 غيغابايت
sudo virt-install \
--name debian-test \
--memory 4096 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/debian-test.qcow2,size=20,format=qcow2 \
--cdrom /var/lib/libvirt/images/debian-13.1.0-amd64-netinst.iso \
--os-variant debian12 \
--network network=default \
--graphics vnc,listen=127.0.0.1
# عرض معرّفات أنظمة التشغيل المدعومة (تحسّن اختيار تعريفات virtio)
virt-install --osinfo list | grep -i debian
يظهر برنامج التثبيت عبر VNC (استخدم virt-viewer debian-test أو نفق SSH). أما في الخادم دون واجهة رسومية، فإن نهج cloud-init في القسم 8 أكثر كفاءة بكثير.
4. إدارة الآلات الافتراضية باستخدام virsh
دورة الحياة
# عرض الآلات الافتراضية (العاملة والمتوقفة)
virsh list --all
# تشغيل آلة افتراضية
virsh start debian-test
# إيقاف سليم (يرسل إشارة ACPI ويجب أن يعالجها الضيف)
virsh shutdown debian-test
# إيقاف قسري (يعادل سحب القابس)
virsh destroy debian-test
# إعادة التشغيل
virsh reboot debian-test
# التشغيل التلقائي مع المضيف
virsh autostart debian-test
# وحدة تحكم تسلسلية نصية (إن كانت مهيأة في الضيف)
virsh console debian-test
# حذف آلة افتراضية وأقراصها نهائيًا
virsh undefine debian-test --remove-all-storage
الفحص والموارد
# معلومات مفصلة
virsh dominfo debian-test
# عناوين IP التي حصلت عليها الآلة الافتراضية
virsh domifaddr debian-test
# تعديل الذاكرة أثناء التشغيل (ضمن الحد الأقصى المحدد)
virsh setmem debian-test 2048M --live
# تحرير تعريف XML للآلة الافتراضية
virsh edit debian-test
Snapshots
# إنشاء snapshot قبل عملية محفوفة بالمخاطر
virsh snapshot-create-as debian-test avant-migration \
--description "Avant montée de version PostgreSQL"
# عرض الـ snapshots
virsh snapshot-list debian-test
# الرجوع إلى snapshot
virsh snapshot-revert debian-test avant-migration
# حذف snapshot لم تعد هناك حاجة إليه
virsh snapshot-delete debian-test avant-migration
تتطلب الـ snapshots الداخلية صيغة qcow2. انتبه: الـ snapshot ليس نسخة احتياطية؛ فهو يوجد على القرص نفسه الذي تعمل عليه الآلة الافتراضية، ويؤدي تراكمه إلى انخفاض طفيف في الأداء.
5. أقراص qcow2 باستخدام qemu-img
تدعم صيغة qcow2 (QEMU Copy-On-Write) التخصيص الرقيق (thin provisioning، إذ لا يكبر الملف إلا بقدر البيانات الفعلية)، والـ snapshots الداخلية، والصور الأساسية.
# إنشاء قرص بسعة 50 غيغابايت (لا يشغل في البداية سوى بضعة كيلوبايتات)
qemu-img create -f qcow2 /var/lib/libvirt/images/data.qcow2 50G
# فحص صورة: الحجم الافتراضي مقابل الحجم الفعلي على القرص
qemu-img info /var/lib/libvirt/images/debian-test.qcow2
# تكبير قرص (سيلزم بعدها توسيع القسم داخل الضيف)
qemu-img resize /var/lib/libvirt/images/debian-test.qcow2 +20G
# تحويل صورة VMware/VirtualBox إلى qcow2
qemu-img convert -f vmdk -O qcow2 machine.vmdk machine.qcow2
# ضغط صورة (يجب أن تكون الآلة الافتراضية متوقفة)
qemu-img convert -O qcow2 ancienne.qcow2 compactee.qcow2
الصور الأساسية والنسخ الخفيفة
# إنشاء نسخة لا تخزن سوى الفروقات عن الصورة الأساسية
qemu-img create -f qcow2 -F qcow2 \
-b /var/lib/libvirt/images/base-debian.qcow2 \
/var/lib/libvirt/images/clone-01.qcow2
# التحقق من سلسلة الاعتماد
qemu-img info --backing-chain /var/lib/libvirt/images/clone-01.qcow2
لا تعدّل صورة أساسية ولا تنقلها ما دامت هناك نسخ تعتمد عليها، وإلا ستتلف جميع النسخ.
6. شبكات libvirt: NAT وBridge
شبكة NAT الافتراضية
عند التثبيت، تنشئ libvirt الشبكة default: جسرًا داخليًا virbr0 ضمن النطاق 192.168.122.0/24 مع DHCP مدمج (dnsmasq). تصل الآلات الافتراضية إلى الإنترنت عبر NAT لكن لا يمكن الوصول إليها من الشبكة الفعلية.
# عرض شبكات libvirt
virsh net-list --all
# تشغيل الشبكة الافتراضية وجعلها دائمة
virsh net-start default
virsh net-autostart default
# عرض عقود DHCP الممنوحة للآلات الافتراضية
virsh net-dhcp-leases default
Bridge: آلات افتراضية كأعضاء كاملين في الشبكة المحلية
لكي تحصل الآلات الافتراضية على عنوان IP من الشبكة الفعلية (كأنها أجهزة مستقلة تمامًا)، أنشئ جسرًا على المضيف. مثال باستخدام Netplan (على Ubuntu Server) في الملف /etc/netplan/01-bridge.yaml:
network:
version: 2
ethernets:
enp3s0:
dhcp4: false
bridges:
br0:
interfaces: [enp3s0]
dhcp4: true
# التطبيق مع مهلة رجوع تلقائي في حال انقطاع الاتصال
sudo netplan try
# التحقق من الجسر
ip addr show br0
ثم اربط الآلات الافتراضية بالجسر:
# عند الإنشاء
virt-install ... --network bridge=br0 ...
# أو عدّل آلة افتراضية موجودة: في virsh edit، استبدل
# <source network='default'/> بـ <source bridge='br0'/>
| الوضع | عنوان IP للآلة الافتراضية | يمكن الوصول إليها من LAN | حالة الاستخدام |
|---|---|---|---|
| NAT (default) | 192.168.122.x خاص | لا | أجهزة التطوير، مختبرات معزولة |
| Bridge (br0) | عنوان من LAN | نعم | خوادم الإنتاج |
| Isolated | خاص، دون خروج | لا | اختبارات الأمان، بيئات sandbox |
7. حاويات LXC أم آلات افتراضية؟
يشغّل LXC حاويات نظام (system containers): مساحات معزولة تتشارك نواة المضيف، بينما يشغّل KVM نواة كاملة لكل آلة. وكثيرًا ما يتعايش النهجان على المضيف نفسه (وProxmox مثال على ذلك).
| المعيار | LXC (حاوية نظام) | KVM (آلة افتراضية) |
|---|---|---|
| النواة | مشتركة مع المضيف | خاصة بكل آلة افتراضية |
| العزل | Namespaces وcgroups | عتادي (VT-x/AMD-V) |
| الكثافة | عالية جدًا (مئات لكل مضيف) | محدودة بذاكرة RAM المخصصة |
| زمن الإقلاع | نحو ثانية واحدة | من 10 إلى 60 ثانية |
| كلفة الذاكرة الإضافية | شبه معدومة | RAM محجوزة لكل آلة افتراضية |
| نظام الضيف | Linux فقط | Linux وWindows وBSD |
| نواة أو وحدات مخصصة | غير ممكن | ممكن |
| الأمان في البيئات متعددة المستأجرين | مقبول، مع سطح هجوم أوسع | قوي، وهو المرجع في السحابة العامة |
# نظرة سريعة على LXC في Ubuntu
sudo apt install lxc
sudo lxc-create -n conteneur-test -t download -- -d debian -r bookworm -a amd64
sudo lxc-start -n conteneur-test
sudo lxc-attach -n conteneur-test
قاعدة القرار: استخدم LXC لبيئات Linux خفيفة كثيرة على جهاز واحد؛ واستخدم KVM عندما تحتاج إلى نظام تشغيل آخر، أو نواة محددة، أو عزلًا قويًا بين المستأجرين.
8. cloud-init: أتمتة التجهيز
cloud-init هو المعيار لتهيئة صور السحابة: عند أول إقلاع، تقرأ الآلة الافتراضية إعدادًا (مستخدمون ومفاتيح SSH وحزم وأوامر) وتهيّئ نفسها ذاتيًا. وبالاقتران مع صور السحابة الرسمية، يلغي التثبيت اليدوي تمامًا.
الحصول على صورة سحابية
# صورة Ubuntu 24.04 السحابية (qcow2 جاهزة للاستخدام، نحو 600 ميغابايت)
sudo wget -P /var/lib/libvirt/images/ \
https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
كتابة إعداد user-data
# /tmp/user-data.yaml
#cloud-config
hostname: vm-web-01
users:
- name: admin
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... admin@poste-travail
package_update: true
packages:
- nginx
- htop
runcmd:
- systemctl enable --now nginx
إنشاء الآلة الافتراضية المجهّزة
# إنشاء قرص الآلة الافتراضية انطلاقًا من الصورة السحابية (نسخة خفيفة مكبّرة)
sudo qemu-img create -f qcow2 -F qcow2 \
-b /var/lib/libvirt/images/noble-server-cloudimg-amd64.img \
/var/lib/libvirt/images/vm-web-01.qcow2 20G
# يولّد virt-install صورة ISO الخاصة بـ cloud-init تلقائيًا مع --cloud-init
sudo virt-install \
--name vm-web-01 \
--memory 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vm-web-01.qcow2,format=qcow2 \
--import \
--os-variant ubuntu24.04 \
--network network=default \
--cloud-init user-data=/tmp/user-data.yaml \
--noautoconsole
# بعد دقيقتين: الحصول على عنوان IP والاتصال
virsh domifaddr vm-web-01
ssh admin@192.168.122.53
تقلع الآلة الافتراضية وتنشئ المستخدم وتثبّت nginx وتفعّل الخدمة دون أي تدخل. ويمكن بعد ذلك كتابة هذه العملية في سكربت وتوسيعها على نطاق صناعي باستخدام Terraform (مزوّد libvirt) أو Ansible.
أفضل الممارسات
- شغّل
virt-host-validateبعد كل تثبيت أو ترقية للمضيف. - اعمل دائمًا على
qemu:///systemللخوادم، وحدّدLIBVIRT_DEFAULT_URIلتفادي الآلات الافتراضية «المختفية» التي أُنشئت على اتصال خاطئ. - حدّد دائمًا
--os-variantفي virt-install: فتعريفات virtio المختارة تُحدث فرقًا كبيرًا في الأداء. - فضّل
virsh shutdownعلىvirsh destroy: فالإيقاف القسري قد يتلف أنظمة الملفات في الضيف. - تعامل مع الـ snapshots كنقاط رجوع مؤقتة، وليس كنسخ احتياطية أبدًا: انسخ ملفات qcow2 احتياطيًا (والآلة الافتراضية متوقفة أو عبر snapshot خارجي متسق).
- لا تلمس أبدًا صورة أساسية تعتمد عليها نسخ مشتقة.
- خصّص NAT لبيئات الاختبار؛ واستخدم bridge لأي خدمة يجب أن يمكن الوصول إليها.
- وحّد التجهيز باستخدام cloud-init منذ الآلة الافتراضية الثانية: فالإعداد اليدوي لا يتوسع.
- راقب المساحة في
/var/lib/libvirt/images: فملفات qcow2 ذات التخصيص الرقيق تكبر بصمت حتى تملأ وحدة التخزين.
الخلاصة
توفر حزمة KVM وQEMU وlibvirt virtualisation بمستوى الإنتاج بأدوات العالم الحر وحدها: يمنح KVM أداءً قريبًا من الأصلي، ويوفر QEMU محاكاة العتاد، وتقدم libvirt واجهة إدارة متسقة من جهاز التطوير إلى العنقود (cluster). أصبحت الآن قادرًا على التحقق من دعم العتاد، وتثبيت الحزمة، وإنشاء آلات افتراضية باستخدام virt-install، والتحكم بها عبر virsh، وإدارة أقراص qcow2، والاختيار بين NAT وbridge، والموازنة بين حاويات LXC والآلات الافتراضية، وأتمتة التجهيز باستخدام cloud-init.
الخطوة التالية هي التوسع الصناعي: صِف آلاتك الافتراضية في Terraform عبر مزوّد libvirt، وهيّئها باستخدام Ansible، فتصبح بنيتك التحتية للـ virtualisation قابلة للتكرار ومُدارة بالإصدارات وقابلة للتدقيق كما هي الشيفرة.
نبذة عن InSkillCoach
خبير في التدريب والتقنيات
مدرّب متخصص في التقنيات المتقدمة والذكاء الاصطناعي، تدعمه شركة GNeurone Inc.
الشهادات:
- AWS Certified Solutions Architect – Professional
- شهادات Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش