انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

نویسنده موضوع: لاگین مستقیم کاربر به ماشین مجازی (حل شد)  (دفعات بازدید: 1306 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین norouzi90

  • Hero Member
  • *
  • ارسال: 784
  • جنسیت : پسر
  • Debian + Mate
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #15 : 15 امرداد 1400، 02:51 ب‌ظ »
خیلی لطف فرمودید.
یک مشکل دیگری که هم دارم این است که می‌خواهم pid برنامه qemu-system-x86 را بعنوان یک
متغیر داشته باشم .با دستور:
pidof qemu-system-x86
هیچ خروجی به من نمی دهد، نمی‌دانم چرا نمی‌دهد ، پس چرا مثلاً به firefox و cinnamon می‌دهد ولی به این یکی نمی دهد؟!



آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #16 : 15 امرداد 1400، 03:30 ب‌ظ »
با pgrep امتحان کنید.
pgrep qemu-system-x86
میدونید که زکات علم نشر آن است

آفلاین norouzi90

  • Hero Member
  • *
  • ارسال: 784
  • جنسیت : پسر
  • Debian + Mate
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #17 : 15 امرداد 1400، 05:33 ب‌ظ »
ممنون، درست شد.

بازهم چند سوال:
۱-
آیا از توابع if ، for و …. بصورت مستقیم در محیط ترمینال می‌توان استفاده کرد. یا اینکه در محیط ترمینال همین‌جوری نمی‌شود آن‌ها را بکار برد و بایستی فقط در داخل یک فایل اسکریپت آن‌ها را نوشت.

۲-
برای اینکه یک فایل اسکریپت تنها برای یک کاربر در هنگام لاگین به سیستم اجرا شود، بعد از نوشتن آن فایل، بایستی آنرا در کجا قرار داد؟

۳-
در اسکریپت نویسی برای پوسته (Bash) ،جاهای خالی (space) در نظر گرفته می شود؟

۴-
در اسکریپت نویسی و همچنین ویرایش فایل‌های کانفیگ بهتر است از Text Editor استفاده کرد
یا از nano ؟

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #18 : 15 امرداد 1400، 06:35 ب‌ظ »
۱- اونها تابع نیستند و بله می‌تونید توی محیط ترمینال هم از اونها استفاده کنید.
۲- نمی‌دونم‌. ولی معمولا خود میزکار چنین قابلیتی داره.
۳- بستگی داره فاصله کجا باشه. کلی نمیشه چیزی گفت. اطلاعات بیشتری درباره این بدید.
۴- خود nano یه text editor هست. :) بهتره که فایل‌های کانفیگ رو با ویرایشگر گرافیکی تغییر ندید. چون احتمال تغییر تصادفی فایل به دست کاربر بیشتره. بعضی از اونها هم نقص امنیتی دارند که اگه فایلی که ویرایش می‌کنید مهم باشه، ممکنه بشه به سیستم نفوذ کرد ولی به همین راحتی هم نیست.
میدونید که زکات علم نشر آن است

آفلاین norouzi90

  • Hero Member
  • *
  • ارسال: 784
  • جنسیت : پسر
  • Debian + Mate
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #19 : 16 امرداد 1400، 12:20 ق‌ظ »
ممنون که جواب می‌دهید و من را شرمنده می فرمایید.

ببخشید، در صورت امکان می‌خواستم فرمانی بنویسم زمانیکه کاربر مربوطه، ماشین مجازی
را shutdown کند( در اینجا مانجارو)، بعد از خاموشی ماشین مجازی، سیستم اصلی ( در اینجا مینت) هم بصورت اتوماتیک وار خاموش بشود.
نظر من در این رابطه این است که متغیری را ایجاد کنم که مقدار آن pid  مربوط 
 به qemu-system-x86  در آن قرار گرفته باشد. بنظرم بایستی با خاموشی ماشین مجازی مقدار مربوط به این به حالت null خواهد شد. ولی فکر می‌کنم متغیر را درست نمی‌توانم تعریف کنم.
هر چند الکی ولی تا این حد از دستم برمی آمد. اگر این دستورات را تصحیح یا هر دستور دیگری که بنظرتان مناسب می باشد را بفرمایید،خیلی ممنون خواهم شد.

VAR=$(pgrep qemu-system-x86) |  if [ $(VAR) = null ] | then poweroff

آفلاین مرتضی . م

  • High Hero Member
  • *
  • ارسال: 1121
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #20 : 16 امرداد 1400، 04:49 ق‌ظ »
۱-
آیا از توابع if ، for و …. بصورت مستقیم در محیط ترمینال می‌توان استفاده کرد. یا اینکه در محیط ترمینال همین‌جوری نمی‌شود آن‌ها را بکار برد و بایستی فقط در داخل یک فایل اسکریپت آن‌ها را نوشت.

۲-
برای اینکه یک فایل اسکریپت تنها برای یک کاربر در هنگام لاگین به سیستم اجرا شود، بعد از نوشتن آن فایل، بایستی آنرا در کجا قرار داد؟

۳-
در اسکریپت نویسی برای پوسته (Bash) ،جاهای خالی (space) در نظر گرفته می شود؟

۴-
در اسکریپت نویسی و همچنین ویرایش فایل‌های کانفیگ بهتر است از Text Editor استفاده کرد
یا از nano ؟
۱: گفتن جوابتونو
۲: همونطور که گفتن میتونید از تنظیمات میزکار بزارید به غیر از این میتونید از init سیستم  هم کمک بگیرید احتمالا (systemd)
۳: گفتن باز
۴: کلا با نرم افزار گرافیکی رو با دسترسی بالا باز نکنید دلیلش رو هم گفتن همین نانو خوبه یا اگه امکانات بیشتری میخواید ویم و ایمکس‌ و....
ببخشید، در صورت امکان می‌خواستم فرمانی بنویسم زمانیکه کاربر مربوطه، ماشین مجازی
را shutdown کند( در اینجا مانجارو)، بعد از خاموشی ماشین مجازی، سیستم اصلی ( در اینجا مینت) هم بصورت اتوماتیک وار خاموش بشود.
من چیز سرراستی به ذهنم نمیرسه ( مگر یه اسکریپت که هر چند ثانیه بیاد چک کنه ببینه پنجره باز هست یا نه و اگر نبود shutdown کنه ) ولی با توجه به صحبت های قبلی، فکر کنم اون ماشین مجازی رو با یه اسکریپت اجرا کردید کافیه دستورش رو به این تغییر بدید
YOUR_OLD_COMMAND && shutdown now
که فکر کنم برای شما بشه این
virt-manager && shutdown now

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #21 : 16 امرداد 1400، 09:39 ق‌ظ »
virt-manager وقتی از ترمینال فراخوانی میشه، پنجره مورد نظر رو باز می‌کنه و بعد هم توی ترمینال دستور خاتمه پیدا می‌کنه. پس اون چیزی که گفتید کار نمی‌کنه. چون بعد که virt-manager اجرا شد، کامپیوتر خاموش میشه.
اگه اینجوری بود که تا وقتی پنجره virt-manager باز هست، دستور توی ترمینال هم در حال اجرا باشه، میشد. ولی حالا نیست و نمیشه. :(

ببخشید، در صورت امکان می‌خواستم فرمانی بنویسم زمانیکه کاربر مربوطه، ماشین مجازی
را shutdown کند( در اینجا مانجارو)، بعد از خاموشی ماشین مجازی، سیستم اصلی ( در اینجا مینت) هم بصورت اتوماتیک وار خاموش بشود.

برای خاموش کردن ایده خوبی دادید ولی چیزی که نوشتید مشکل داشت. این رو ببینید:
VAR="$(pgrep qemu-system-x86)"
if [ -z "$VAR" ]; then
      poweroff
fi
برای این از "" استفاده شده تا خروجی به عنوان رشته (استرینگ) به حساب بیاد. در حالت معمول هم باید اینطور بشه ولی اگه توی خروجی pgrep فاصله وجود داشته باشه، می‌تونه داخل if مشکل‌ساز بشه.

این اول pid که مربوط qemu-system-x86 هست رو پیدا می‌کنه و داخل متغیر VAR قرار میده. اگه پردازشی (پروسه‌) با این اسم وجود داشته باشه، مقدار متغیر VAR برابر pid اون پردازش قرار می‌گیره. اگه پردازشی به این اسم وجود نداشته باشه، مقداری داخل متغیر VAR قرار نمی‌گیره و به اصطلاح، مقدار پوچ رو می‌گیره.
بعد if چک می‌کنه اگه رشته‌ای (استرینگ) که بهش داده شده خالی هست، ادامه کار رو انجام بده. اگه ماشین‌مجازی ‌در‌حال اجرا نباشه، متغیر VAR خالی به حساب میاد، شرط if درست میشه و کامپیوتر خودش رو خاموش می‌کنه.

این شرط فقط یه‌بار اجرا میشه و اگه اون موقع ماشین‌مجازی شما در‌حال اجرا باشه، اتفاقی نمی‌فته و بعد هم کامپیوتر خاموش نمیشه. برای حل این مشکل باید کاری کنید که مرتب این شرط چک بشه. اینکار رو می‌تونید با گذاشتن دستوراتی نوشتم، داخل یه حلقه تکرار بینهایت انجام بدید. چیزی که نوشتم رو ببینید:
while :
do
     VAR="$(pgrep qemu-system-x86)"
      if [ -z "$VAR" ]; then
            poweroff
      fi
done

ولی یه مشکلی که داره این هست که اگه چندین ماشین ‌مجازی با معماری x86 همزمان توسط qemu/kvm اجرا شدن، کامپیوتر خاموش نمیشه.
مشکل دیگه‌ای که هست اینه که ممکنه کار‌های دیگه هم در‌حال اجرا باشه که وقتی یهو کامپیوتر خاموش میشه، ممکنه باعث مشکل بشه. ولی از اونجایی که کامپیوتر شما داره توی خونه استفاده میشه، این مشکل بعیده که اتفاق بیوفته.
برای اطمینان، می‌تونید poweroff رو به shutdown تغییر بدید تا 1 دقیقه بعد از اینکه ماشین‌مجازی خاموش شد، کامپیوتر شما هم خاموش بشه.
بهتره قبل از while دستور sleep 5 رو هم بنویسید تا قبل از اینکه برنامه وارد حلقه بشه، ۵ ثانیه صبر کنه تا از اجرا شدن ماشین‌مجازی مطمئن بشید.
میدونید که زکات علم نشر آن است

آفلاین norouzi90

  • Hero Member
  • *
  • ارسال: 784
  • جنسیت : پسر
  • Debian + Mate
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #22 : 16 امرداد 1400، 10:06 ب‌ظ »
با تشکر فراوان از اسکریپت هایی که لطف کرده و نوشته بودید، همه آنها بدرستی کار می کنند.
اگر حوصله داشتید سوالاتی در مورد این اسکریپت ها داشتم.

۱-
با
VAR="$(pgrep qemu-system-x86)"
ما متغیری بنام VAR$تعریف کردیم. در زمانیکه ماشین مجازی در حالت روشن می باشد، هر دو
"$(pgrep qemu-system-x86)"و همچنین
$VARیک مقدار را برمی گردانند.

ولی وقتی که ماشین مجازی را خاموش می نماییم. نتایج متفاوتی دارند.
"$(pgrep qemu-system-x86)"مقدار null را بر‌می‌گرداند، که درست است. ولی
$VARهمان مقدار قبلی را برمی گرداند، در صورتی که بنظرم بایستی null را برگرداند.
علت این امر را نمی دانم.
( عکس شماره ۱ )

۲-
if [ -z "$VAR" ]اگر امکان داشته باشید توضیح مختصری در این باره بدهید، خیلی ممنون خواهم شد.
چیزی سردرنیاوردم.

۳-
در صورت امکان می‌خواستم این اسکریپت ها را بصورت فایل دربیاورم که در موقع بوت سیستم بصورت خودکار اجرا بشوند. آیا از لحاظ محتوایی بنظرتان اشکالی ندارند؟

touch script1.shchmod u+x script1.sh
آیا بایستی دو تا فایل اسکریپت مجزا بسازم یا اینکه هر دو تایش را در یک فایل می توان ریخت؟
محتوای آنها بدین صورت می باشد، آیا بنظرتان به عنوان فایل های اسکریپت درست می باشند؟
#!/bin/bash

virt-manager  --connect qemu:///system --show-domain-console manjaro
sleep 5s
wmctrl -R "manjaro on QEMU/KVM" ; wmctrl -r "manjaro on QEMU/KVM" -b toggle,fullscreen


#!/bin/bash

sleep 5
while :
do
     VAR="$(pgrep qemu-system-x86)"
      if [ -z "$VAR" ]; then
            poweroff
      fi
done

« آخرین ویرایش: 16 امرداد 1400، 10:08 ب‌ظ توسط norouzi90 »

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #23 : 16 امرداد 1400، 11:54 ب‌ظ »
اولا که اسم متغیر VAR هست، نه VAR$. دومی برای دسترسی به مقدارش استفاده میشه.
۱- مشخصه که چرا متفاوت هست. وقتی که دستور زیر رو می‌نویسیم، مقدار متغیر VAR برابر خروجی pgrep qemu-system-x86 قرار میگیره.
VAR="$(pgrep qemu-system-x86)"بعد که ماشین‌مجازی رو خاموش می‌کنید، pgrep چیزی رو برنمیگردونه. چون چیزی پیدا نکرده. VAR هم همون مقدار قبلی رو داره. چون شما مقدارش تغییر ندادید. دستور اولی که گذاشتم، فقط همون موقع اجرا خروجی pgrep qemu-system-x86 رو داخل متغیر VAR قرار میده. کار دیگه‌ای انجام نمیده. اگه می‌خواهید مقدارش تغیر کنه، دوباره دستور اولی که گذاشتم رو اجرا کنید.

۲- صفحه man مربوط به دستور test رو ببینید.
man test
۳-مشکلی نداره. به ترتیب اونها رو بزاربد توی یه فایل. حلقه while رو آخر همه بزارید. یه دستور sleep که بین virt-manager و wmctrl هست رو فکر کنم بتونید بردارید یا اینکه زمانش رو کمتر کنید. این دست خودتونه.
میدونید که زکات علم نشر آن است

آفلاین norouzi90

  • Hero Member
  • *
  • ارسال: 784
  • جنسیت : پسر
  • Debian + Mate
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #24 : 18 امرداد 1400، 12:10 ق‌ظ »
۱-
با تشکر فراوان بخاطر توضیحات مفید و ارزشمندتان .

۲-
نقل‌قول
یه دستور sleep که بین virt-manager و wmctrl هست رو فکر کنم بتونید بردارید یا اینکه زمانش رو کمتر کنید. این دست خودتونه.
این زمان ضروری می باشد. اگر sleep نگذاریم و  یا مقدار آن برابر یک بگذاریم، عمل fullscreen صورت نمی گیرد، ولی در زمانهای دو ثانیه و بالاتر این عمل صورت می گیرد.

۳-
بصورت علمی و محاسباتی از کجا می‌توان فهمید سرعت سیستم پایین آمده است یا بالا رفته است؟
مثلاً من یک توزیع را بصورت اصلی در کامپیوترم نصب می‌کنم و همچنین همان توزیع را در ماشین مجازی نصب می‌کنم ، آیا راهی وجود دارد که سرعت عمل‌کرد آندو سیستم را نسبت بهم  بسنجم ؟ (می‌گوییم سیستمم سنگین شده، بغیر از ظاهر قضایا که مثلاً مربوط به باز شدن پنجره ها و اجرای ظاهری آن‌ها می‌شود ، آیا راه دقیق‌تری برای دیدن این تفاوتها هم هست؟)

۴-
می‌خواستم در صورت امکان این کارم را بر روی یک window manager بعنوان یک پلت فرم انجام دهم. بنظرتان از بین window manager های گوناگون کدامیک برای این کار من مناسب‌تر است؟
آیا بغیر از window manager  برای این کار پیشنهاد  مناسب‌تر دیگری می‌توان داشت؟

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #25 : 19 امرداد 1400، 07:03 ب‌ظ »
۲- خب بزاریدش روی ۳ یا ۴ تا کمتر منتظر بمونید.
۳- benchmark بگیرید. می‌تونید اینجا رو ببینید. خودتون هم می‌تونید جست‌و‌جو کنید.
۴- تجربه‌ای ندارم.
میدونید که زکات علم نشر آن است

آفلاین norouzi90

  • Hero Member
  • *
  • ارسال: 784
  • جنسیت : پسر
  • Debian + Mate
پاسخ : لاگین مستقیم کاربر به ماشین مجازی
« پاسخ #26 : 20 امرداد 1400، 06:03 ق‌ظ »
گام های لازم برای اجرا را بصورت خلاصه برای استفاده در اینجا قرار می دهم.
 چنانکه دوستان به من آموختند ،خوشحال خواهم شد  ، آموخته هایم را در اختیار سایرین بگذارم.

هدف:
می‌خواهیم وقتی کاربر،در سیستم اصلی،وارد حساب کاربری خود بشود، بطور اتوماتیک وار وارد توزیع نصب شده در ماشین مجازی بشود. یعنی ابتدا توزیع مربوطه اجرا شده، بعد به حالت تمام صفحه نشان داده شود و هر وقت که کاربر ماشین مجازی را خاموش نماید ، سیستم اصلی هم بطور اتوماتیک وار خاموش شود.

توضیحات جانبی:
سیستم اصلی: LMDE 4 Debbie
نام کاربر در سیستم اصلی: mytest
ماشین مجازی بکار رفته : Virtual Machine Manager   یا همان virt-manager
سیستم نصب شده در ماشین مجازی: مانجارو

گام ۱:
ایجاد کاربر جدید در سیستم اصلی ( در اینجا کاربری بنام mytest ایجاد می نماییم)
sudo adduser mytestکاربر جدبد را عضو گروه sudo می نماییم:
sudo usermod -aG sudo mytest
گام۲:
کاربر مربوط در سیستم اصلی را به عضویت گروههای libvirt و libvirt-qemu را در می آوریم.(برای اجرای ماشین مجازی نیاز به دسترسی روت می باشد، برای اینکه لازم نباشد با sudo اجرایش کنیم، کاربر مربوطه در سیستم اصلی که در اینجا mytest می باشد، به عضویت این دو گروه در می آوریم.
بعد از اینکار ،چون این کاربر به عضویت این دو گروه درآمده است چه در اجرای این برنامه چه در محیط گرافیکی و چه در محیط متنی ، دیگر رمز عبور برای این کاربر پرسیده نخواهد شد.)
sudo usermod -aG libvirt mytestsudo usermod -aG libvirt-qemu mytest
گام ۳:
( Start virtual machine on host boot up )
 استارت ماشین مجازی در  زمان بوت در سیستم اصلی :
پنجره اصلی  Virtual Machine Manager را باز کرده و بر روی ماشین مجازی مربوطه دابل کلیک کنید تا پنجره ماشین مجازی مربوطه باز شود. از منو بالایی بر روی
حرف i یا همان show virtual hardware details کلیک کنید. در Overview در قسمت Name نامی که با آن راحت‌تر هستید به ماشین مجازی بدهید، که من در اینجا من ،نام manjaro را نوشتم. بعد از اعمال این تغییر در پایین صفحه دکمه Applay را فشار بدهید
بعد بروید به قسمت Boot Options و در آنجا تیک گزینه
Start virtual machine on host boot up را فعال کنید. حتماً بعد از اعمال این تغییر نیز در پایین صفحه دکمه Apply را فشار بدهید.
 این استارت به معنای این نخواهد بود که وقتی به حساب کاربری خود لاگین می کنید، پنجره ماشین مجازی برایتان باز شود. عمل استارت در اینجا به مفهوم یک عمل در پشت پرده می باشد.

گام ۴:
حالا سیستممان را restart می نماییم و بعد به داخل صفحه کاربر mytest ، لاگین می نماییم.

گام ۵:
(Power on the virtual machine )
نحوه روشن کردن ماشین مجازی بصورت اتوماتیک:
 اسکریپتی خواهیم نوشت که ماشین مجازی را روشن کند.این عمل معادل این می‌باشد ، که در زمانیکه ماشین مجازیتان در حالت خاموش ( shutoff ) می باشد، بر روی دکمه (Power on the virtual machine ) در صفحه مربوط به ماشین مجازیتان کلیک نمایید
virt-manager  --connect qemu:///system --show-domain-console manjaroتوجه نمایید که بجای کلمه manjaro ، اسم ماشین مجازی خودتان رادر اینجا بگذارید.

گام ۶ :
 ( Launh and fullscreen )
نحوه تمام صفحه کردن محیط سیستم عامل ماشین مجازی:
برای اینکار هم اسکریپتی خواهیم نوشت.
ولی ابتدا بایستی برای کار با پنجره هاازبرنامه‌ای بنام wmctrl استفاده نماییم.( اگر با xdotool و یا devilspie2 برای کار با پنجره ها راحت‌تر هستید، می‌توانید از آن‌ها بجای  wmctrl استفاده نمایید.)

و همچنین برای اینکه نام اختصاصی برنامه ماشین مجازی manjaro را بدانیم، بایستی ، برنامه‌ای بنام top را اجرا نماییم. ابتدا این برنامه را در زمانیکه ماشین مجازی مورد نظرمان در حالت خاموش است را اجرا می نماییم و یکبار دیگر در زمانیکه ماشین مجازی ما در حالت روشن
است ( یعنی بر روی  (Power on the virtual machine ) کلیک کرده ایم.)
در این بین نامی به اسامی مربوطه در top لیست ها اضافه می شود. نام مورد نظر ما در قسمت COMMAND است .(برای راهنماییتان ،نام USER در آنجا ،+libvirt است.)

حالا برای اینکه بعد از روشن شدن واجرای برنامه ماشین مجازی ، پنجره برنامه Launch بشود و بعد به حالت fullscreen یا همان تمام صفحه بدل شود، از این اسکریپت استفاده می کنیم:
wmctrl -R "manjaro on QEMU/KVM" ; wmctrl -r "manjaro on QEMU/KVM" -b toggle,fullscreenدر این قسمت می‌توانید ، نام مورد نظرتان را بجای  "manjaro on QEMU/KVM" از برنامه top  پیدا کرده و بنویسید.
البته برای اجرای درست  fullscreen  از حالت وقفه ۸ ثانیه استفاده کردیم.

گام ۷:
Autoshutoff :
می‌خواهیم کاری کنیم که بعد از shutdown کردن سیستم میهمان ، سیستم میزبان ( اصلی) هم بصورت اتوماتیک وار خاموش بشود.
برای خاموش کردن از pid استفاده می نماییم.
اسکریپت پایینی pid مربوط  به qemu-system-x86 را پیدا می‌کند و داخل متغیر VAR قرار میدهد. اگر پردازشی (پروسه‌) با این اسم وجود داشته باشد، مقدار متغیر VAR برابر pid آن پردازش قرار می‌گیرد. اگر پردازشی به این اسم وجود نداشته باشد، مقداری داخل متغیر VAR قرار نمی‌گیرد و به اصطلاح، مقدار پوچ را می‌گیرد.
بعد if چک می‌کند اگه رشته‌ای (استرینگ) که بهش داده شده خالی باشد، ادامه کار را انجام می دهد. اگه ماشین‌مجازی ‌ در‌حال اجرا نباشد، متغیر VAR خالی به حساب میاد، شرط if درست میشود و کامپیوتر (سیستم اصلی) خودش را خاموش می‌کند.

این شرط فقط یک بار اجرا میشود و اگر آن موقع ماشین‌مجازی  در‌حال اجرا باشد، اتفاقی نمی‌ افتد و بعد هم کامپیوتر خاموش نمیشود. برای حل این مشکل باید کاری کنیم که مرتب این شرط چک بشود. اینکار را می‌توانیم با گذاشتن دستورات در داخل یک حلقه تکرار بینهایت انجام دهیم.
و همچنین بهتر است قبل از while دستور sleep 5 رو هم بنویسیم تا قبل از اینکه برنامه وارد حلقه بشود، ۵ ثانیه صبر کند تا از اجرا شدن ماشین‌مجازی مطمئن بشویم.
#!/bin/bash

sleep 5
while :
do
     VAR="$(pgrep qemu-system-x86)"
      if [ -z "$VAR" ]; then
            poweroff
      fi
done

گام ۸:
ساخت فایل اسکریپت:
الان نوبت آن است که اسکریپت هایمان را داخل یک فایلی که می سازیم ، قرار بدهیم.
touch myscript.shبا این فرمان فایل خالی بنام myscript.sh در داخل پوشه home  کاربر ( در اینجا mytest) ساخته می شود.
این فایل را باز کرده و محتوای زیر را در آن قرار می دهیم.
#!/bin/bash

virt-manager  --connect qemu:///system --show-domain-console manjaro
sleep 8
wmctrl -R "manjaro on QEMU/KVM" ; wmctrl -r "manjaro on QEMU/KVM" -b toggle,fullscreen


#!/bin/bash

sleep 5
while :
do
     VAR="$(pgrep qemu-system-x86)"
      if [ -z "$VAR" ]; then
            poweroff
      fi
done

گام ۹:
دادن مجوزههای اجرایی به فایل:
chmod u+x myscript.sh
گام ۱۰)
( اجرای فایل اسکریپت بصورت اتوماتیک در زمان ورود کاربر):

الان نوبت آن است که بوسیله نرم‌افزار Startup Applications ، تنظیم نماییم که این فایل اسکریپت در هنگام ورود کاربر به صفحه کاربری خود، بصورت اتوماتیک وار اجرا بشود.
این نرم‌افزار را باز نموده و سپس در قسمت پایین بر روی علامت بعلاوه(+)
کلیک می نماییم،دو گزینه به ما نشان داده خواهد شد:
-Custom command
-Choose Application

گزینه Custom command را انتخاب می نماییم، در همانجا برایمان پنجره ای محاوره ای باز می‌شود بنام Add Startup Program ،
در قسمت Name  ، نامی اختیاری برای آن می‌گذاریم.( مثلاً Myscript )
در قسمت Command ، با استفاده از Browse به مسیر فایل می رویم. بعد از پیدا کردن فایل  مورد نظرمان ( در اینجا myscript.sh ) ، در پایین صفحه بر روی کلید open  کلیک می نماییم.
در قسمت Comment ، اگر خواستیم توضیحی برای اسکریپتمان می نوسیسم.( مثلاً من در این قسمت نوشتم execute file myscript.sh )
در قسمت Startup delay هم، ۵ ثانیه برای تأخیر در راه اندازی را تنظیم می نماییم.
و سپس در پایان بر روی Add کلیک می نماییم.

گام ۱۱:
امتحان فایل اسکریپت:
در همان پایین پنجره Startup Applications ، می‌توانید بر روی علامت چرخ دنده ( Run now ) ، کلیک نمایید تا درستی عمل‌کرد فایل اسکریپتتان را امتحان نمایید.( ولی چون هنوز  سیستمتان را restart نکرده‌اید تا ماشین مجازیتان شروع بکار بکند( Power on نشده هنوز) می‌توانید برای تست کردن بصورت دستی ابتدا دکمه Power on را در پنجره ماشین مجازیتان را بزنید و بعد بر روی Run now در این پنجره کلیک نمایید.


گام ۱۲:
اجرا:
سیستم عامل اصلی امان را در اینجا restart می نماییم و بعد وارد محیط کاری ، کاربر mytest می شویم.   

« آخرین ویرایش: 20 امرداد 1400، 10:24 ب‌ظ توسط norouzi90 »

آفلاین Dragon-

  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 5124
  • جنسیت : پسر
پاسخ : لاگین مستقیم کاربر به ماشین مجازی (حل شد)
« پاسخ #27 : 21 امرداد 1400، 12:49 ق‌ظ »
برای اجرای ماشین‌مجازی، کاربری که ساختید لازم نیست توی گروه sudo باشه. چون توی گروه libvirt و libvirt-qemu هست. بودن توی گروه sudo باعث میشه اون کاربر بتونه از دستور sudo هم استفاده کنه. اگه واقعا اون کاربر چنین چیزی رو لازم داره، کار شما درست هست. اما اگه اون کاربر نیازی به اجرای دستور sudo نداره، اینکار اضافه هست.

دستور زیر، فقط پنجره virt-manager رو باز می‌کنه. روشن شدن ماشین‌مجازی، با کاری که توی مرحله ۳ کردید انجام میشه. اون کاری که کردید، باعث میشه موقع دوشن شدن سیستم اصلی، ماشین‌مجازی هم اجرا بشه. این می‌تونه زمان بوت رو افزایش بده. اگه هم به کاربر mytest وارد نشید، باز هم ماشین‌مجازی داره اجرا میشه و از منابع سیستم استفاده می‌کنه. بهتره کاری کنید که اگه تا مثلا ۵ دقیقه وارد کاربر mytest نشدید، ماشین مجازی خاموش بشه.
virt-manager  --connect qemu:///system --show-domain-console manjaro
اون دستورات پشت سرهمی که گذاشتید، اسکریپت نیستند بلکه فقط دستور‌اند. اونی که طولانیه و با
#!/bin/bashشروع میشه اسکریپت هست.
فقط هم یه‌بار اول فایل لازمه که اون رو بنویسید. پس اونکه دوباره وسط نوشتید، اضافه هست.

دستور touch myscript.sh فایل myscript.sh رو داخل هوم شما نمیسازه بلکه توی مسیری که هستید میسازه. به طور پیش‌فرض، پوسته توی هوم شما باز میشه پس اگه یه ترمینال باز کنید و داخلش اون دستور رو بزنید، فایل توی هوم شما درست میشه و حرف شما درسته. ولی اگه با دستور cd برید توی یه مسیر دیگه یا اینکه پوسته توی یه مسیر دیگه به‌غیر از هوم شما باز بشه، دیگه اون دستور فایل رو داخل هوم شما نمیسازه بلکه داخل مسیری که هست میسازه.

برای درست کردن متن یا اسکریپت (اسکریپت در اصل همون متن هست ولی جوری نوشته شده که یه پوسته مثل bash می‌تونه اون رو بفهمه و کار‌ها رو انجام بده) لازم نیست اول با touch یه فایل خالی درست کنید و بعد با یه ویرایشگر متن اون رو باز کنید و چیز‌های لازم رو داخلش بنویسید.
می‌تونید همینجوری از ویرایشگر‌های متن استفاده کنید. مثلا برای استفاده از ویرایشگر تحت خط فرمان nano از دستور زیر استفاده کنید:
nano myscript.sh
یا اگه ویرایشگر‌های متن گرافیکی رو ترجیح میدید، فایل‌منیجر باز کنید و به مسیر مورد نظر برید. بعد راست کلیک کنید و چیزی شبیه new text file رو انتخاب کنید. اینجوری باز هم فایل ایجاد میشه و شما می‌تونید داخلش چیز‌های لازم رو بنویسید.

اون روش اجرای اسکریپت موقع ورود کاربر  فکر کنم فقط مربوط به میزکار cinnamon باشه. توی بقیه میزکار‌ها (desktop environment) متفاوت هست.

برای پیدا کردن اسم پردازشی (process)که مربوط به ماشین‌مجازی هست، می‌تونید از دستور ps -aux هم استفاده کنید. چون خروجی طولانی هست، شاید لازم باشه با grep خروجی رو فیلتر کنید. مثلا اینجوری
ps -aux | grep -i kvm
اون sleep 5 رو هم فکر کنم می‌تونید بردارید چون قبلش یه sleep 8 هست تا مطمئن بشه virt-manager اجرا شده. از اون هم بگذریم، چون ماشین‌مجازی موقع روشن شدن سیستم اصلی اجرا میشه، باید پردازشی به اسم qemu-system-x86 وجود داشته باشه.
اگه هم حذفش نکنید، نباید تاخیری ببینید چون داره توی پشت صحنه اجرا میشه.
میدونید که زکات علم نشر آن است

آفلاین norouzi90

  • Hero Member
  • *
  • ارسال: 784
  • جنسیت : پسر
  • Debian + Mate
پاسخ : لاگین مستقیم کاربر به ماشین مجازی (حل شد)
« پاسخ #28 : 21 امرداد 1400، 10:51 ب‌ظ »
بابت راهنماییهای مفیدتان و وقتیکه گذاشتید، ممنون و سپاسگزارم.