سؤال

لم أتمكن من العثور على أي وثائق توضح وجود واجهة برمجة تطبيقات يمكن استخدامها لأتمتة الأشياء داخل ضيف QEMU.

على سبيل المثال ، أود إطلاق عملية داخل آلة الضيوف من جهاز المضيف. لا يبدو أن libvirt يحتوي على هذه الوظيفة.

هل كانت مفيدة؟

المحلول

على حد علمي ، فإن الطريقة الوحيدة للتواصل مع الضيف هي من خلال جسر الشبكة.

نصائح أخرى

ملاحظة: الأتمتة دون استخدام أي واجهة برمجة تطبيقات للمحاكاة الافتراضية. من وجهة نظري مشاركة مدونة.]

الخطوة 1:

بشكل افتراضي ، تستخدم QEMU SDL لعرض إخراج VGA. لذلك ، فإن الخطوة الأولى هي جعل هذا التفاعل مع QEMU من خلال stdio. يوفر QEMU خيارًا لهذا الغرض.

من مستندات QEMU:

-صفي عادة ، تستخدم QEMU SDL لعرض إخراج VGA. باستخدام هذا الخيار ، يمكنك تعطيل الإخراج الرسومي تمامًا بحيث يكون QEMU تطبيقًا بسيطًا لسطر الأوامر. يتم إعادة توجيه المنفذ التسلسلي المحاكاة على وحدة التحكم. لذلك ، لا يزال بإمكانك استخدام QEMU لتصحيح نواة Linux مع وحدة تحكم تسلسلية.

لذلك ، كل ما عليك فعله هو استدعاء QEMU مع -NOGRAPH.

Qemu -Nographic -hda guest.disk

الخطوة 2:

الآن بعد أن يمكنك التفاعل مع ضيفك (أو عملية QEMU) من خلال سطر الأوامر ، يجب عليك أتمتة هذا التفاعل. الطريقة الواضحة للقيام بذلك في Python هي بدء عملية QEMU (مع -Nographic) مع وحدة التخطيط الفرعي ثم التواصل مع هذه العملية. لكن لدهشتي ، لم ينجح هذا الأمر بالنسبة لي. لذلك ، بحثت عن طريقة أخرى.

في وقت لاحق ، اكتشفت أن الأداة الأكثر روعة لهذا النوع من الوظائف هي يتوقع. إنها أداة أتمتة للتطبيقات التفاعلية المكتوبة في TCL.

هذا الدليل يجب أن يساعدك في البدء مع توقع. هنا هو البرنامج النصي لتشغيل ضيف مع QEMU باستخدام توقع.

#!/usr/bin/expect -f

#starts guest vm, run benchmarks, poweroff
set timeout -1

#Assign a variable to the log file
set log     [lindex $argv 0]

#Start the guest VM
spawn qemu -nographic -hda guest.disk

#Login process
expect “login: “
#Enter username
send “user\r”

#Enter Password
expect “Password: “
send “user\r”

#Do whatever you want to do with in the guest VM. ( Run a process and write result to log )

#poweroff the Guest VM
expect “# “
send “shutdown -h now\r”

ال مراقب QEMU يمكن التفاعل مع أنظمة الضيوف إلى حد محدود باستخدام وحدة التحكم الخاصة بها. ويشمل ذلك القراءة سجلات ، والتحكم في الماوس/لوحة المفاتيح ، والحصول على مقالب الشاشة. هناك بروتوكول مراقبة QEMU (QMP) هذا يتيح لك تمرير أوامر JSON وقراءة القيم من نظام الضيوف.

يمكنني استخدام Python مع Pexpect للتفاعل مع VMs التي تفرد باستخدام لوحات المفاتيح التسلسلية. أتم أتمتة السيناريوهات عمومًا التي تصل إلى 128VMs بهذه الطريقة ، وهي سريعة بشكل معقول. أنا أستخدم بشكل عام التثبيت لاستئصال الضيوف ، واستخدام "Virsh Console (DomainName)" باستخدام PEXPECT للحصول على "مقبض" لكل وحدة تحكم ، حتى أتمكن من إرسال أوامر لتكوين الشبكات ، وأدوات بدء التشغيل/الأدوات النصية/البرامج النصية ، وعملية الشاشة ، إلخ. حلوة جدًا من حيث البساطة ، وبما أن البرامج النصية تصدر مجرد أوامر Shell ، فأنت لا تتعرض لبرامج واجهات برمجة التطبيقات التي تتغير من الإصدار إلى الإصدار ، على سبيل المثال ، ستكون وحدة التحكم التسلسلية موجودة دائمًا. أحيانًا أستخدم QEMU مباشرةً ، (في الآونة الأخيرة ، أعمل مع QEMU لا يدعمها libvirt منذ أن كانت جديدة جدًا) ، في هذه الحالة ، سأستخدم وحدة التحكم في الضيوف منفذ Telnet حتى أتمكن من "Telnet LocalHost Portnumber" توصيل وحدة التحكم بدلاً من "وحدة التحكم Virsh (DomainName)". وفي كلتا الحالتين ، فإن البرامج النصية Python مع وحدة Pexpect للتفاعل مع VMs رائعة.

يمكنك إنشاء نفق SSH عكسي من الضيف إلى المضيف ، والذي سيعيد توجيه كل طلب للاستضافة على منفذ محدد للضيف. بهذه الطريقة ستساعدك على التحكم في الضيف من المضيف.

يمكن أن يفعل Pyqemu نظريًا. لقد استخدمته في الماضي ، على الرغم من أنه يبدو وكأنه مشروع قديم الآن. يوفر وكيل Python (ما يعادل أدوات ضيف VMware) لتشغيله على الضيف ، والتواصل مع المضيف عبر المنفذ التسلسلي. يمكنك الحصول على وكلاء إلى وحدات بيثون التي تعمل في سياق VM ، وأي اتصال معهم يتم تنظيمه على المنفذ التسلسلي. في المثال التالي ، يتم استخدام Autoit لأتمتة المفكرة:

machine = PyQemu.GetProxy("win2k")

# Wrap the machine object in another proxy representing the 'os'
# module running inside the VM.
os = PyQemu.vm.Module(machine,"os")

# NOTE: This is running on the VM!
os.system("notepad")

# Get an IDispatch object representing the autoit ActiveX control
autoit = PyQemu.vm.Dispatch(machine,"AutoItX3.Control")

# See if a window is active on the VM
state = autoit.WinActive("Untitled -")

التحذير: نظرًا لاستخدام المنفذ التسلسلي ، فإنه بعيد عن سريع (بغض النظر عن إعدادات السرعة التسلسلية) ، لذلك ربما يكون من الأفضل نقل أي بيانات بالجملة بوسائل أخرى ، مثل صورة قرص الدهون الافتراضية.

إذا كنت تقوم بتشغيل Linux في الضيف ، ألا يمكنك استخدام SSH/Screen فقط لإطلاق عمليات عن بُعد على الضيف؟

بدلاً من ذلك ، رأيت الناس يكتبون أغلفة بيثون التي تستخدم popen() للاستيلاء على stdin/stdout واستخدامها لأتمتة بعض الأوامر (أي عندما ترى موجه تسجيل الدخول ، أرسل اسم تسجيل الدخول إلى stdin من QEMU.

يمكنك الوصول إلى الضيف من خلال NET عن طريق ضبط جسر صافي أو استخدام -HostFWD.

هذا الأخير أبسط. يتيح لك تصدير منفذ TCP/UDP للضيف للاستضافة. يمكنك تعيين Guest TCP Port 22 لاستضافة الضيف وإدارته كما لو كنت إدارة الآلات البعيدة الحقيقية. انظر هذه المدونة تشغيل Qemu في الخلفية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top