Skip to content

الأجهزة الافتراضية (Virtual Machines) ​

تسمح لك لوحة Virtual Machines بالتحكم في دورة حياة أنظمة تشغيل الضيف، وإدارة ملفات التهيئة، واستنساخ الموارد.

أ. عمليات الحالة الأساسية ​

  • من قائمة VM الرئيسية، يمكنك التصفية حسب حالات التنفيذ الحالية: All States, Running, Stopped, Paused, أو Suspended.
  • تتيح اختصارات الإجراءات للمسؤولين تنفيذ أوامر حالة الطاقة السريعة: Start, Stop (Graceful), Force Stop, Restart, أو Force Restart.

ب. الوصول إلى وحدات تحكم الضيف (Guest Consoles) ​

  • يتيح لك تحديد جهاز افتراضي شغال إطلاق VNC Console تفاعلية مباشرة داخل متصفح الويب.
  • يوفر هذا تحكمًا منخفض المستوى بالرسوميات أو سطر الأوامر لتسجيل الدخول إلى نظام التشغيل (tty1)، وهو مثالي للإعدادات الأولية، أو إصلاحات الشبكات، أو التحقق من أسماء المضيفين.

ج. تعديل تهيئات العتاد الافتراضي (التعديل وتعديل XML) ​

عندما يحتاج جهاز افتراضي إلى تعديلات في الموارد، انتقل إلى لوحة إجراءات Edit:

  • Compute Options (الأساسية والمتقدمة): ضبط الإعدادات للذاكرة القصوى (Maximum Memory)، والحد الأقصى لـ vCPUs، وتهيئات تثبيت المعالج (CPU Pinning)، والمآخذ (Sockets)، والأنوية (Cores)، والخيوط (Threads). يمكنك أيضًا تعريف وضع CPU (مثل host-passthrough) وتحديد الأعلام المتقدمة (مثل تمكين ميزات UEFI أو Secure Boot أو TPM).
  • التعديل المباشر لـ XML: للتعديلات الدقيقة التي تتجاوز قوائم التبديل القياسية، اختر Edit XML. يقدم هذا وصولاً نصيًا مباشرًا إلى كتل تعيين تعاريف نطاق libvirt XML للضيف (مثل تعديل <domain type='kvm'> أو <vcpu> أو <memory> أو تعاريف ملفات الدعم مباشرة).

د. القوالب والاستنساخ واللقطات ​

  • استنساخ الأجهزة الافتراضية (Cloning VMs): إنشاء نسخ مكررة من خلال بدء إجراء Clone. أدخل اسمًا فريدًا للاستنساخ الجديد، وحدد تجميع التخزين المستهدف للوجهة، ثم اختر Guest identity (راجع القسم هـ). الاستنساخ دائمًا نسخة كاملة ومستقلة من كل صور أقراص (disk images) الجهاز الافتراضي المصدر: لا يعتمد على المصدر بعد إنشائه، وكلما كبرت الأقراص طال وقت الاستنساخ. الاستنساخ المرتبط (linked/copy-on-write) غير متاح، ولا تُنسخ لقطات المصدر إلى الاستنساخ. لا تُنسخ أجهزة الكتل (block devices) الخاصة بالمضيف والمرفقة مباشرة بالمصدر، ولا الأقراص للقراءة فقط، ولا صور ISO: يستخدم الاستنساخ الجهاز أو الملف نفسه الذي يستخدمه المصدر، لذا لا تشغّل الجهازين في الوقت نفسه ما داما يتشاركان جهازًا قابلًا للكتابة.
  • اللقطات (Snapshots): التقاط صور استعادة في نقطة زمنية محددة بتحديد Create Snapshot. أدخل اسم لقطة فريدًا (مثل snap-01) وملاحظات وصفية اختيارية. يمكنك اختيار ما إذا كنت تريد تضمين الذاكرة النشطة في وقت التشغيل داخل حالة اللقطة.
  • القوالب (Templates): تحويل نشر جهاز افتراضي مهيكل إلى تهيئة قالب خط أساسي ثابت عبر ميزة Convert to Template، أو نشر أجهزة جديدة من قوالب تم التقاطها سابقًا. يعرض النشر من قالب خيار Guest identity نفسه الموجود في الاستنساخ. راجع اللقطات والقوالب.

هـ. هوية الضيف في الاستنساخ (Guest Identity) ​

النسخ العادي للأقراص ينسخ أيضًا كل ما يستخدمه نظام تشغيل الضيف ليميّز نفسه عن الأجهزة الأخرى. عند تشغيل المصدر ونسخته المطابقة في الوقت نفسه، تظهر عادةً الأعراض التالية:

  • يحصل الجهازان على عنوان IP نفسه من DHCP؛
  • يبدأ استنساخ جهاز مبني من صورة سحابية (cloud image) دون أي شبكة؛
  • يعرض الجهازان اسم المضيف (hostname) نفسه، ولا يستطيع عملاء SSH التمييز بينهما بمفتاح المضيف.

يحدد إعداد Guest identity في نافذة Clone النتيجة:

الخيارما تحصل عليه
Reset guest identity (recommended)استنساخ بهوية خاصة به. يعدّل Vapor الأقراص المنسوخة قبل تشغيل الاستنساخ لأول مرة. لا يتغير الجهاز الافتراضي المصدر أبدًا.
Keep an exact copyنسخة مطابقة بايتًا ببايت لأقراص المصدر. استخدمها لاختبارات الاستعادة، أو لنسخة تحتفظ بها للتحقيق، أو للأجهزة (appliances) التي ترتبط رخصتها بـ machine ID.

يكون Reset guest identity محددًا افتراضيًا عندما يستطيع المضيف إعادة تعيين الهوية. وعندما لا يستطيع، يُحدد Keep an exact copy وتعرض النافذة السبب (راجع متطلبات المضيف).

ما الذي يغيّره Reset guest identity ​

  • Machine ID: يحصل /etc/machine-id (و/var/lib/dbus/machine-id عندما يكون ملفًا منفصلًا) على معرّف عشوائي جديد. خوادم DHCP التي تتعرف على العملاء بهذا المعرّف تمنح الاستنساخ عنوانًا خاصًا به. يُترك Machine ID كما هو إذا كانت قيمته uninitialized (قالب مُعدّ للإقلاع الأول).
  • مفاتيح SSH للمضيف (SSH host keys): يُستبدل كل مفتاح بمفتاح جديد من النوع والحجم نفسيهما. العملاء الذين اتصلوا بالمصدر سيرون مفتاح مضيف مختلفًا على الاستنساخ. يُحذف مفتاح DSA القديم عندما يملك الجهاز نوع مفتاح أحدث أيضًا. تُستبدل مفاتيح RSA الأكبر من 4096 بت بمفاتيح 4096 بت، وتتضمن النتيجة ملاحظة بذلك.
  • ربط عناوين MAC للشبكة (network MAC bindings): تحصل واجهات شبكة الاستنساخ على عناوين MAC جديدة. تُحدَّث تهيئة الشبكة التي تذكر عناوين MAC الخاصة بالمصدر (netplan وNetworkManager وملفات ifcfg وsystemd-networkd وقواعد udev و/etc/network/interfaces) إلى عناوين الاستنساخ، لكي تعمل الواجهات.
  • عقود DHCP (DHCP leases): تُحذف العقود التي حفظها المصدر، فيطلب الاستنساخ عقوده الخاصة.
  • البذرة العشوائية (random seed): تُستبدل البذرة المحفوظة ببيانات عشوائية جديدة.
  • اسم المضيف (hostname): يُؤخذ من اسم الاستنساخ بأحرف صغيرة. يُستبدل كل حرف غير حروف ASCII والأرقام والشرطة بشرطة، وتُدمج الشرطات المتكررة في شرطة واحدة، وتُحذف الشرطات في البداية والنهاية، ثم يُقتطع الناتج إلى 63 حرفًا كحد أقصى. يُحتفظ بنطاق (domain) اسم مضيف المصدر عندما يكون نطاق DNS صالحًا: web01.example.com المستنسخ باسم web02 يصبح web02.example.com. تُحدَّث الأسماء المطابقة في أسطر loopback داخل /etc/hosts أيضًا. إذا لم يتبقَّ من اسم الاستنساخ شيء صالح للاستخدام، أو لم يكن لدى الضيف الملف /etc/hostname، يُترك اسم المضيف كما هو.

يبقى كل ما عدا ذلك كما كان في المصدر: حسابات المستخدمين وكلمات المرور، ومفاتيح SSH المصرح بها للمستخدمين (authorized keys)، والبرامج وبرامج التشغيل المثبتة، وبيانات التطبيقات، وعناوين IP الثابتة.

عناوين IP الثابتة ​

يُحتفظ بعنوان IP الثابت، فيحمل الاستنساخ العنوان نفسه الذي يحمله المصدر. يكتمل الاستنساخ مع تحذير ويُنشأ مع إيقاف التشغيل التلقائي (autostart). غيّر العنوان قبل تشغيل الجهازين على الشبكة نفسها، مثلًا: أبقِ المصدر متوقفًا، وشغّل الاستنساخ، وغيّر عنوانه من VNC console، ثم شغّل المصدر مرة أخرى.

أمور أخرى يجب التحقق منها في الاستنساخ المكتمل ​

يُنشأ الاستنساخ، وتتضمن النتيجة تحذيرًا أو ملاحظة عندما:

  • يكون المصدر منضمًا إلى نطاق Active Directory أو Kerberos: يظل الاستنساخ يستخدم حساب الجهاز (machine account) الخاص بالمصدر، مما قد يؤدي إلى قفل المصدر خارج النطاق. أخرج الاستنساخ من النطاق ثم أعد ضمه باسمه الجديد قبل توصيله بالشبكة.
  • يدير cloud-init اسم المضيف: قد يعيد cloud-init تعيين اسم مضيف المصدر عند كل إقلاع. إذا ظل الاستنساخ يعرض اسم المصدر، فغيّر اسم المضيف في تهيئة cloud-init الخاصة بالاستنساخ.
  • تكون وكلاء التسجيل والإدارة مهيأة (Red Hat Subscription Manager وUbuntu Pro وPuppet وSalt وChef): يظل الاستنساخ يحمل تسجيل المصدر. سجّل الاستنساخ من جديد.

عندما لا يمكن إعادة تعيين الهوية ​

إذا اخترت Reset guest identity وتعذّرت إعادة تعيين الهوية، يفشل الاستنساخ مع ذكر السبب ولا يُنشأ أي جهاز افتراضي. يفحص Vapor الجهاز المصدر قبل النسخ، لذا يُبلَّغ عن معظم الحالات فورًا؛ أما البقية فتُكتشف على النسخ قبل تعديلها، ثم تُحذف النسخ. اختر Keep an exact copy بدلًا من ذلك، ثم غيّر الهوية من داخل الضيف قبل تشغيل الجهازين:

الحالةما يجب فعله
ضيف Windows أو ضيف آخر غير Linuxأنشئ نسخة مطابقة، ثم عمّم الضيف (في Windows باستخدام Sysprep).
أقراص مشفرة (مثل LUKS أو BitLocker)أنشئ نسخة مطابقة وغيّر الهوية من داخل الضيف.
لم يُعثر على نظام تشغيل في الأقراص، أو وُجد أكثر من نظامأنشئ نسخة مطابقة.
نظام ملفات لا يستطيع المضيف تعديله، مثل نظام ملفات XFS في RHEL 9 والتوزيعات المبنية منه (Rocky Linux وAlmaLinux) على مضيفات ذات نواة أقدمأنشئ نسخة مطابقة وغيّر الهوية من داخل الضيف.
جزء من نظام الضيف، مثل /var، موجود على قرص لا يُنسخ مع الاستنساخ (جهاز كتل للمضيف مرفق مباشرة، أو قرص للقراءة فقط)انقل ذلك الجزء من النظام إلى صورة قرص في الجهاز المصدر، ثم استنسخ من جديد. النسخة المطابقة ستظل تتشارك ذلك الجهاز مع المصدر.
للجهاز الافتراضي أكثر من واجهة شبكة، وتهيئة الشبكة تذكر عنوان MAC لا تملكه أي من واجهات شبكة المصدراحذف الإدخال القديم أو صحّحه في الجهاز المصدر، ثم استنسخ من جديد. عندما تكون قيمة guest_identity هي auto، يكون ذلك مجرد تحذير وتكتمل إعادة التعيين.
مفتاح SSH الوحيد للمضيف من نوع DSAأضف نوع مفتاح حديثًا في الجهاز المصدر (sudo ssh-keygen -A)، ثم استنسخ من جديد.

لتغيير هوية استنساخ Linux بنفسك، نفّذ داخل الاستنساخ:

bash
sudo rm -f /etc/machine-id /var/lib/dbus/machine-id
sudo systemd-machine-id-setup
sudo hostnamectl set-hostname <new-name>
sudo rm -f /etc/ssh/ssh_host_*
sudo ssh-keygen -A
sudo systemctl restart ssh    # اسم الخدمة sshd في ضيوف عائلة RHEL

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

وكيل الضيف (Guest agent) ​

يحتفظ الاستنساخ باتصال QEMU guest agent الخاص بالمصدر، لذا تعمل الميزات التي تعتمد على الوكيل (تجميد نظام الملفات للقطات والنسخ الاحتياطي، والإبلاغ عن عنوان IP للضيف) على الاستنساخ كما تعمل على المصدر.

متطلبات المضيف ​

تتطلب إعادة تعيين الهوية وجود guestfish (جزء من libguestfs) على مضيف Vapor. ثبّته بصلاحيات root:

bash
# Debian 12 وما بعده، وUbuntu 22.04 وما بعده
sudo apt-get install guestfish libguestfs-xfs

# Debian 11، وUbuntu 20.04
sudo apt-get install libguestfs-tools libguestfs-xfs

# RHEL 9 والإصدارات المعاد بناؤها منه (Rocky Linux وAlmaLinux)
sudo dnf install libguestfs libguestfs-xfs

# RHEL 8 والإصدارات المعاد بناؤها منه
sudo dnf install libguestfs-tools-c libguestfs-xfs

لا حاجة لإعادة تشغيل Vapor. يبحث Vapor عن الأداة مجددًا في كل مرة تُفتح فيها نافذة Clone، ثم يتحقق منها باختبار ذاتي قصير في الخلفية. إذا لم يكن Reset guest identity محددًا مسبقًا أو كان معطّلًا، فأغلق النافذة وافتحها مرة أخرى بعد دقيقة تقريبًا. وإذا ظل غير متاح، يوضح السبب المعروض في النافذة ما ينقص المضيف أو ما أبلغ عنه الاختبار الذاتي.

المضيفات ذات النواة الأقدم من 5.15 ​

يعيد Vapor تعيين الهوية داخل آلة افتراضية مساعدة صغيرة هي libguestfs appliance، وهي تُقلع بنواة المضيف نفسه. نسخة الاستنساخ من آلة افتراضية قيد التشغيل هي نسخة crash-consistent، فيصير نظام ملفات الضيف الحديث مثل Debian 13 في حالة لا تستطيع النواة الأقدم من 5.15 تركيبه للكتابة. على مثل هذا المضيف لا يمكن إعادة تعيين هوية تلك النسخة (السبب unmountable): وبحسب الاختيار، إما أن يفشل الاستنساخ أو تُنشأ نسخة مطابقة مع تحذير، والنسخة المطابقة تبدأ عادةً بلا شبكة. أما استنساخ آلة افتراضية متوقفة فلا يتأثر.

يشمل ذلك Ubuntu 20.04 (النواة 5.4) وDebian 11 (النواة 5.10). منذ Vapor 3.3.2، يمنح التثبيت الجديد على Ubuntu 20.04 الـ appliance نواة 5.15: إذ ينزّل المثبّت نواة HWE 5.15 ويستخرجها في /opt/vapor-guestfs-kernel/<release> دون تثبيتها، فلا تتغير نواة المضيف ولا إقلاعه. أما المضيف المُرقّى في مكانه فلا يحصل على ذلك. نفّذ الخطوات نفسها يدويًا بصلاحيات root:

bash
REL=$(apt-cache depends linux-image-generic-hwe-20.04 | grep -o 'linux-image-5\.15[^ ]*' | sed 's/linux-image-//')
D=/opt/vapor-guestfs-kernel/$REL; T=$(mktemp -d)
(cd $T && sudo apt-get download linux-image-$REL linux-modules-$REL)
for f in $T/*.deb; do sudo dpkg-deb -x $f $D; done; sudo depmod -b $D $REL
sudo mkdir -p /etc/systemd/system/vapor.service.d
printf '[Service]\nEnvironment=SUPERMIN_KERNEL=%s\nEnvironment=SUPERMIN_MODULES=%s\n' \
  "$D/boot/vmlinuz-$REL" "$D/lib/modules/$REL" | sudo tee /etc/systemd/system/vapor.service.d/guestfs-kernel.conf
# The appliance is cached; clear it so it is rebuilt with the new kernel.
sudo rm -rf /var/lib/vapor/guestfs-cache/.guestfs-0
sudo systemctl daemon-reload && sudo systemctl restart vapor

للتراجع عن ذلك، احذف /etc/systemd/system/vapor.service.d/guestfs-kernel.conf ثم أعد تشغيل Vapor. على Debian 11 تتوفر نواة أحدث من bullseye-backports، وتنطبق الخطوات نفسها مع حزم تلك النواة. ومن دون أي من ذلك، استنسخ هذه الآلات الافتراضية وهي متوقفة.

لعملاء API ​

تقبل طلبات الاستنساخ (POST /api/v1/virtualization/computes/{id}/clone وPOST /api/v1/virtualization/computes/clone) والنشر من قالب (POST /api/v1/virtualization/computes/from-template) الحقل guest_identity:

القيمةالسلوك
resetإعادة تعيين الهوية. إذا تعذّر ذلك يفشل الطلب: 409 مع IDENTITY_RESET_UNAVAILABLE (المضيف لا يستطيع إعادة تعيين الهوية) أو IDENTITY_RESET_UNSUPPORTED_GUEST (لا يمكن إعادة تعيين هوية الضيف؛ وتتضمن التفاصيل reason_code)، أو، بعد بدء النسخ، استنساخ فاشل يحمل error_code نفسه في أحداث التقدم.
autoإعادة تعيين الهوية عند الإمكان. إذا تبيّن لـ Vapor أن ذلك غير ممكن قبل أن يغيّر أي شيء في النسخ، يكون الاستنساخ نسخة مطابقة وتُبلغ النتيجة عن السبب كتحذير.
keepإنشاء نسخة مطابقة.

إذا فشلت أداة إعادة التعيين نفسها أو انتهت مهلتها، يفشل الاستنساخ مع IDENTITY_RESET_FAILED وreason_code بقيمة tool_error أو timeout: يُجيب النشر من قالب بالرمز 500، بينما يُبلغ الاستنساخ عن هذا الرمز كقيمة error_code في أحداث التقدم.

عند حذف الحقل، يُطبَّق الإعداد الافتراضي للمضيف: clone_guest_identity_default في vapor.conf (أو متغير البيئة VAPOR_CLONE_GUEST_IDENTITY_DEFAULT)، وقيمته auto (الافتراضي) أو keep. يحمل حدث الاستنساخ النهائي (وفي النشر من قالب، الاستجابة) كائن identity_reset يتضمن status (done أو kept أو failed) وreason_code وreason وhostname الجديد وwarnings الموضحة أعلاه. يُبلغ GET /api/v1/virtualization/computes/clone/capabilities عما إذا كان المضيف يستطيع إعادة تعيين الهوية، وإن لم يستطع، عن السبب.