انجمنهای فارسی اوبونتو
کمک و پشتیبانی => انجمن عمومی => نویسنده: norouzi90 در 12 امرداد 1400، 07:57 بظ
-
با سلام و احترام به خدمت تمامی سروران ،
آیا راهی وجود دارد که برای یک کاربر چنین تعریف شود که در هنگام لاگین کردن مستقیماً به محیط توزیع موردنظر که در virt-manager نصب شده است بصورت full screen وارد شود؟
-
حالا full screen رو نمیدونم ولی برو auto login رو فعال کن دیگه!
-
من الان لینوکس مینت را به عنوان تنها توزیع اصلی خودم بر روی سیستمم دارم.
حالا فرض کنید بغیر از من فرد دیگری از اعضا خانواده از مانجارو خوشش آمده است .
یک کاری را که من میتوانم انجام دهم این است که سیستمم را دوال بوت نمایم.
و هر دو توزیع مینت و مانجارو را بعنوان توزیع اصلی بر روی سیستمم داشته باشم.
ولی من از دوال بوت خوشم نمی آید.
یک راه دیگری که به ذهنم میرسد این است که مانجارو را در virt-manager نصب کنم و کاری کنم که آن کاربر هنگامی که به لینوکس مینت به حساب کاربری خودش لاگین می کند، اصلاً ریخت و قیافه لینوکس مینت را نبیند ( هر چند که وارد آن محیط شده است) ، بصورت مستقیم وارد مانجارو نصب شده در ماشین مجازی بشود.
فکر میکنم این عمل بوسیله ویرایش systemd و cron و …. میتواند انجام بگیرد. ولی متأسفانه سوادم در آن حد نیست .
-
توی lightdm میشه guest session گذاشت
اگر نمیخواید میتونید یه user دیگه بگذارید تا هرموقع مهمانی کسی اومد به اون کاربر login کنه
به نظرم استفاده از ماشین مجازی برای این کار هدر رفتن منابعه!
-
توی lightdm میشه guest session گذاشت
اگر نمیخواید میتونید یه user دیگه بگذارید تا هرموقع مهمانی کسی اومد به اون کاربر login کنه
به نظرم استفاده از ماشین مجازی برای این کار هدر رفتن منابعه!
با سپاس فراوان از بابت راهنمایی و پیشنهادتان.
ولی دوست دارم برای کسب آگاهی بیشتر روی این موضوع کار کنم، ولی خوشبختانه یا متأسفانه بدون کمک شما و سایر دوستان این امر برایم غیرممکن می باشد.( شاید بگویید برو مطالعه کن ولی فهم و حلاجی قضایا یک چیز دیگریست)
سؤالاتی که از این به بعد میپرسم کلاً در راستای حل این مسله می باشد،گام به گام میروم جلو، و امیدوارم که راهنماییم بفرمایید.
تا جایی که من میدانم در محیط متنی یا همان کامند لاین ما فقط با دستورات کار داریم. در محیط گرافیکی مثلاً میخواهیم برنامه فایرفاکس را اجرا کنیم، میتوانیم برویم در ترمینال دستور
firefox
را تایپ کرده و اینتر را بزنیم تا پنجره این مرورگر در محیط دسکتاب باز بشود. کار دیگری هم که میشود کرد این است که برویم بر روی آیکن این برنامه دابل کلیک کنیم:
۱- آیا دستوراتی که به پوسته یا کرنل در این دو حالت فرستاده میشود یکی است؟
۲- در محیط گرافیکی برای هر عملکرد، در پشت پرده، دستور یا دستوراتی اجرا می شود. آیا راهی وجود دارد که متن این دستورات را ببینیم؟ببینیم در هر لحظه چه دستوراتی به پوسته فرستاده می شود؟
-
۱- آیا دستوراتی که به پوسته یا کرنل در این دو حالت فرستاده میشود یکی است؟
۲- در محیط گرافیکی برای هر عملکرد، در پشت پرده، دستور یا دستوراتی اجرا می شود. آیا راهی وجود دارد که متن این دستورات را ببینیم؟ببینیم در هر لحظه چه دستوراتی به پوسته فرستاده می شود؟
۱. تقریبا یکیه شاید موقع کلیک روی آیکن برنامه بیاد فایرفاکس رو به یه سری سوییچ و... اجرا کنه ولی در کل یکیه
۲. کارکردش این نیست ولی میتونید با دستور htop یه چیزایی دستگیرتون بشه به غیر از اون با alacarte میتونید ببینید که هر برنامه وقتی روی آیکنش کلیک میشه چه دستوری رو میفرسته و اگه بخواید تغییرش بدید.
** دستوری به پوسته فرستاده نمیشه! درواقع شما به پوسته دستور میدید
-
ممنون از برنامه مفیدی که معرفی فرمودید.(alacarte )
۱-
الان میدانم برای Launch شدن یک برنامه در محیط GPU بایستی چه دستوری را در ترمینال بکار ببرم.( رجوع میکنم به قسمت Command آن برنامه در پنجره Launcher Properties )
مثلاً برای اجرای برنامه Virtual Machine Manager در ترمینال تایپ می کنم:
virt-manager
۲-
این برنامه برای ورود در خود برنامه رمز عبور میخواهد که با استفاده از sudo این مشکل هم حل می شود.
sudo virt-manager
۳-
برای اینکه بتوانیم با پنجره ها کار کنیم بایستی دو تا بسته بنام های xdotool و wmctrl
را نصب کنیم:
sudo apt-get install xdotool wmctrl
۴-
برای کار با پنجره ها ما نیاز داریم که <window_id> پنجره مورد نظر را بدانیم، از این دستور استفاده می کنیم:
wmctrl -l
که id تمام پنجره های فعال را به ما نشان می دهد.
ولی متأسفانه id پنجره ها یک مقدار ثابتی نیست و متغیر میباشد و با هر خاموش و روشن کردن سیستم عوض می شود.
الف) آیا راهی وجود دارد که در دستور بالایی عوض اینکه id تمام پنجره ها را بما به عنوان خروجی ارسال کند، تنها id پنجره ( manjaro on QEMU/KVM )بعنوان خروجی بما بدهد.
ب)یا بایستی دستوری نوشته شود که id پنجره ( manjaro on QEMU/KVM ) را بعنوان یک متغیر تعریف شود و از آن استفاده کنم.که در این حالت فکر کنم بایستی کمی برنامه نویسی یا اسکریپت نویسی یاد بگیرم.بنظرتان دقیقاً چه چیزی بکارم میآید ، دنبال آن باشم: پایتون، اسکریپت نویسی پوسته و...
پ)یا اینکه راه دیگری به ذهنتان می رسد؟!
۵-
اگر id پنجره مورد نظرمان را بدانیم ، در مرحله بعد بایستی که پنجره را به حالت fullscreen در بیاوریم، که متأسفانه در اینترنت گشتم ولی چیزی دستگیرم نشد.
( مثلاً برای ماگزیمم کردن میشود از این دستور استفاده کرد:
xdotool windowsize <window_id> 100% 100%
ولی برای fullscreen کردن نتوانستم کد مناسبش را پیدا کنم)
-
۱. برنامهٔ گرافیکی رو با sudo اجرا نکن
۲. از devilspie2 برای کار با پنجرهها و شرط گذاشتن براشون استفاده کن
-
برای virt-manager برای اینکه لازم نباشه با sudo اجراش کنید، باید کاربر توی گروههای libvirt و libvirt-qemu باشه.
اینجوری کاربر خودتون رو به اون گروهها اضافه کنید. (اشتباه تایپی ویرایش شد. دستور اشتباهی chmod به usermod تغییر کرد.)
sudo usermod -aG libvirt USERNAME
sudo usermod -aG libvirt-qemu USERNAME
بهجای USERNAME کاربری رو بزارید که میخواهید توی اون گروهها باشه. بعد برای اینکه این تغییرات جواب بدن، یهبار از اون کاربر خارج بشید و دوباره وارد بشید. یا اینکه دستور زیر رو بزنید.
newgrp
برای باز کردن ماشین مجازیِ داخل virt-manager، میتونید از این دستور استفاده کنید
virt-manager --connect qemu:///system --show-domain-console NAME
بهجای NAME باید اسم ماشینمجازی رو بزارید. البته نمیدونم اگه اسم ماشینمجازی شامل فاصله هم باشه باز هم کار میکنه یا نه. شاید در اونصورت لازم باشه اسم رو بین "" قرار بدید.
این دستور برای وقتی هست که از qemu/kvm داره برای مجازیسازی استفاده میشه. اگه از xen یا چیزی دیگه استفاده شده باشه، باید جلوی connect-- چیز دیگهای بنویسید.
پنجره رو هم فکر کنم اگه باز کنید و بعد برید توی حالت full screen و بعد ببندیدش، دیگه توی همون حالت full screen باز میشه. مگه اینکه خودتون اندازه پنجره رو تغییر بدید و بعد ببندیدش.
یهکاری هم باید بکنید تا ماشینمجازی، موقع روشن شدن سیستم اصلی روشن بشه. فکر کنم توی همون تنظیمات مربوط به ماشینمجازی توی خود virt-manager چنین چیزی وجود داشته باشه. ولی احتمالا اینکار باعث میشه که مدت بوت شدن سیستم بیشتر بشه.
برای فیلتر خروجی wmctrl -l میتونید از grep استفاده کنید. اینجوری که خروجی wmctrl رو با استفاده از پایپ میفرستید به grep. یعنی اینطوری
wmctrl -l | grep "something in text"
اگه هم میخواهید، به حروف بزرگ و کوچیک حساس نباشه، از سوئیچ i- همراه grep استفاده کنید.
فکر کنم راهحل اینه که دستور زیر رو بزارید توی یه اسکریپت و بعد کاری کنید که موقع لاگین به اون کاربر، اسکریپت زیر اجرا بشه و virt-manager نمایان بشه. و همینطور کاری کنید که اون ماشینمجازی، موقع روشن شدن سیستم اصلی، روشن بشه.
virt-manager --connect qemu:///system --show-domain-console NAME
اما به نظرم این راه زیاد مناسبی نیست.اگه dual boot کنید فکر کنم بهتره. عملکرد بهتری هم از اون توزیع میگیرید.
اگه چنتا لینوکس رو dual boot میکنید، به نظرم بهتره که دایرکتوری /boot/grub/ یه bind mountpoint به دایرکتوری /boot/efi/grub/ باشه. اینجوری تنظیمات روی esp ذخیره میشه و بین همهی توزیعها هم یکسان میشه. (به شرطی که esp روی /boot/efi/ سوار شده باشه. توی توزیعهای مبتنی بر دبیان که اینجوریه ولی توی توزیعهای مبتنی بر آرچ، ممکنه esp رو /efi/ سوار بشه که در اونصورت باید bind mountpoint روی /efi/grub/ تنظیم بشه)
البته باید توی فایل fstab روی همهی توزیعها تنظیم کنید تا /boot/efi/grub/ (یا /efi/grub/) به صورت bind روی /boot/grub/ سوار بشه تا درست کار کنه. اگه درباره این سوال دارید، توی یه موصوع دیگه بپرسید.
-
با سپاس مجدد از همه دوستان محترم.
۱-
نمیدانم چرا این دو تا دستوری که گذاشته بودید کار نکردند. شاید یک جایی من اشتباه کرده ام.
sudo usermode -aG libvirt USERNAME
sudo chmod -aG libvirt-qemu USERNAME
( نام کاربر مودنظر در عکسی که پایین گذاشته ام، a می باشد.)
۲-
virt-manager --connect qemu:///system --show-domain-console NAME
دستور فوق العاده ای بود،ممنون. ولی حیف که قدرت باز کردن و اجرای ماشین مجازی موردنظر را از حالت خاموش ندارد.
۳-
پنجره رو هم فکر کنم اگه باز کنید و بعد برید توی حالت full screen و بعد ببندیدش، دیگه توی همون حالت full screen باز میشه. مگه اینکه خودتون اندازه پنجره رو تغییر بدید و بعد ببندیدش.
نه، متأسفانه با restart ماشین مجازی ، از حالت full screen خارج می شود.
۴-
یهکاری هم باید بکنید تا ماشینمجازی، موقع روشن شدن سیستم اصلی روشن بشه. فکر کنم توی همون تنظیمات مربوط به ماشینمجازی توی خود virt-manager چنین چیزی وجود داشته باشه
متأسفانه گشتم، ولی چیزی ندیدم.
۵-
و همینطور کاری کنید که اون ماشینمجازی، موقع روشن شدن سیستم اصلی، روشن بشه.
این موضوع خفه ام کرده، مغزم هم هنگ کرده!!!
۶-
اما به نظرم این راه زیاد مناسبی نیست.اگه dual boot کنید فکر کنم بهتره.
دستت درد نکنه ولی نمیخواهم سیستمم را دو زنه کنم!!
-
نمیشه فقط دسکتاپ مانجارو رو نصب کنی و وفتی اون کاربر خاص میخواد از سیسستم استفاده کنه دسکتاپ خودشو تغییر بده؟ اصلا دسکتاپ پیشفرض مانجارو چیه؟
اون کاری که شما میخواید انجام بدید برای یه کاربر مبتدی مثل من یا شما بدرد نمیخوره. و کاربرهای حرفهای هم شاید فقط برای آزمایش اینکارارو انجام بدن.
نصب یه دسکتاب تهش دوخط دستور تو ترمینال نیاز داره ولی کاری که شما میخواین انجام بدین حداقل چند روز باید راهنماهای سایتهای مختلف رو بخونید، و چند ماه هم باید مشکلاتش رو برطرف کنید.
-
اون دستورات یکم اشتباه تایپی داشتند. ;D
اون e آخر توی usermode رو پاک کنید. chmod رو هم اشتباه نوشتم. منظورم usermod بوده.
-
نمیشه فقط دسکتاپ مانجارو رو نصب کنی و وفتی اون کاربر خاص میخواد از سیسستم استفاده کنه دسکتاپ خودشو تغییر بده؟ اصلا دسکتاپ پیشفرض مانجارو چیه؟
اون کاری که شما میخواید انجام بدید برای یه کاربر مبتدی مثل من یا شما بدرد نمیخوره. و کاربرهای حرفهای هم شاید فقط برای آزمایش اینکارارو انجام بدن.
نصب یه دسکتاب تهش دوخط دستور تو ترمینال نیاز داره ولی کاری که شما میخواین انجام بدین حداقل چند روز باید راهنماهای سایتهای مختلف رو بخونید، و چند ماه هم باید مشکلاتش رو برطرف کنید.
شما و سایر دوستان درست می فرمایید.
ولی این مسایل برایم انگیزه می دهد و روحیه ام را زنده نگه می دارد.
در ترمینال با دستور:
wmctrl -l | grep "manjaro on QEMU/KVM"
خروجی زیر را بمن می دهد:
0x052000ea 0 sun manjaro on QEMU/KVM
چه دستوری را میتوانم بکار ببرم که تنها ده کارکتر اول را بعنوان خروجی بمن بدهد؟
-
میتونید از awk که یه زبان برای پردازش متن هست استفاده کنید. باز هم خروجی رو با پایپ بفرستید به دستور awk. اینجوری
wmctrl -l | grep "manjaro on QEMU/KVM" | awk '{print $1}'
چیزی که جلوی awk نوشته شده میگه که اولین قسمت از متن رو نمایش بده. به طور پیشفرض، فاصله به عنوان جداکننده به حساب میاد. پس اگه بهجای 1$ مینوشتید 2$ عدد 0 نمایش داده میشد و اگه 3$ بود، sun نمایش داده میشد.
البته فکر کنم با دستور cut هم بتونید اینکار رو انجام بدید. شاید با grep هم بشه.
-
به نظرم cut راحتتره.
-
خیلی لطف فرمودید.
یک مشکل دیگری که هم دارم این است که میخواهم pid برنامه qemu-system-x86 را بعنوان یک
متغیر داشته باشم .با دستور:
pidof qemu-system-x86
هیچ خروجی به من نمی دهد، نمیدانم چرا نمیدهد ، پس چرا مثلاً به firefox و cinnamon میدهد ولی به این یکی نمی دهد؟!
-
با pgrep امتحان کنید.
pgrep qemu-system-x86
-
ممنون، درست شد.
بازهم چند سوال:
۱-
آیا از توابع if ، for و …. بصورت مستقیم در محیط ترمینال میتوان استفاده کرد. یا اینکه در محیط ترمینال همینجوری نمیشود آنها را بکار برد و بایستی فقط در داخل یک فایل اسکریپت آنها را نوشت.
۲-
برای اینکه یک فایل اسکریپت تنها برای یک کاربر در هنگام لاگین به سیستم اجرا شود، بعد از نوشتن آن فایل، بایستی آنرا در کجا قرار داد؟
۳-
در اسکریپت نویسی برای پوسته (Bash) ،جاهای خالی (space) در نظر گرفته می شود؟
۴-
در اسکریپت نویسی و همچنین ویرایش فایلهای کانفیگ بهتر است از Text Editor استفاده کرد
یا از nano ؟
-
۱- اونها تابع نیستند و بله میتونید توی محیط ترمینال هم از اونها استفاده کنید.
۲- نمیدونم. ولی معمولا خود میزکار چنین قابلیتی داره.
۳- بستگی داره فاصله کجا باشه. کلی نمیشه چیزی گفت. اطلاعات بیشتری درباره این بدید.
۴- خود nano یه text editor هست. :) بهتره که فایلهای کانفیگ رو با ویرایشگر گرافیکی تغییر ندید. چون احتمال تغییر تصادفی فایل به دست کاربر بیشتره. بعضی از اونها هم نقص امنیتی دارند که اگه فایلی که ویرایش میکنید مهم باشه، ممکنه بشه به سیستم نفوذ کرد ولی به همین راحتی هم نیست.
-
ممنون که جواب میدهید و من را شرمنده می فرمایید.
ببخشید، در صورت امکان میخواستم فرمانی بنویسم زمانیکه کاربر مربوطه، ماشین مجازی
را shutdown کند( در اینجا مانجارو)، بعد از خاموشی ماشین مجازی، سیستم اصلی ( در اینجا مینت) هم بصورت اتوماتیک وار خاموش بشود.
نظر من در این رابطه این است که متغیری را ایجاد کنم که مقدار آن pid مربوط
به qemu-system-x86 در آن قرار گرفته باشد. بنظرم بایستی با خاموشی ماشین مجازی مقدار مربوط به این به حالت null خواهد شد. ولی فکر میکنم متغیر را درست نمیتوانم تعریف کنم.
هر چند الکی ولی تا این حد از دستم برمی آمد. اگر این دستورات را تصحیح یا هر دستور دیگری که بنظرتان مناسب می باشد را بفرمایید،خیلی ممنون خواهم شد.
VAR=$(pgrep qemu-system-x86) | if [ $(VAR) = null ] | then poweroff
-
۱-
آیا از توابع if ، for و …. بصورت مستقیم در محیط ترمینال میتوان استفاده کرد. یا اینکه در محیط ترمینال همینجوری نمیشود آنها را بکار برد و بایستی فقط در داخل یک فایل اسکریپت آنها را نوشت.
۲-
برای اینکه یک فایل اسکریپت تنها برای یک کاربر در هنگام لاگین به سیستم اجرا شود، بعد از نوشتن آن فایل، بایستی آنرا در کجا قرار داد؟
۳-
در اسکریپت نویسی برای پوسته (Bash) ،جاهای خالی (space) در نظر گرفته می شود؟
۴-
در اسکریپت نویسی و همچنین ویرایش فایلهای کانفیگ بهتر است از Text Editor استفاده کرد
یا از nano ؟
۱: گفتن جوابتونو
۲: همونطور که گفتن میتونید از تنظیمات میزکار بزارید به غیر از این میتونید از init سیستم هم کمک بگیرید احتمالا (systemd)
۳: گفتن باز
۴: کلا با نرم افزار گرافیکی رو با دسترسی بالا باز نکنید دلیلش رو هم گفتن همین نانو خوبه یا اگه امکانات بیشتری میخواید ویم و ایمکس و....
ببخشید، در صورت امکان میخواستم فرمانی بنویسم زمانیکه کاربر مربوطه، ماشین مجازی
را shutdown کند( در اینجا مانجارو)، بعد از خاموشی ماشین مجازی، سیستم اصلی ( در اینجا مینت) هم بصورت اتوماتیک وار خاموش بشود.
من چیز سرراستی به ذهنم نمیرسه ( مگر یه اسکریپت که هر چند ثانیه بیاد چک کنه ببینه پنجره باز هست یا نه و اگر نبود shutdown کنه ) ولی با توجه به صحبت های قبلی، فکر کنم اون ماشین مجازی رو با یه اسکریپت اجرا کردید کافیه دستورش رو به این تغییر بدید
YOUR_OLD_COMMAND && shutdown now
که فکر کنم برای شما بشه این
virt-manager && shutdown now
-
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 رو هم بنویسید تا قبل از اینکه برنامه وارد حلقه بشه، ۵ ثانیه صبر کنه تا از اجرا شدن ماشینمجازی مطمئن بشید.
-
با تشکر فراوان از اسکریپت هایی که لطف کرده و نوشته بودید، همه آنها بدرستی کار می کنند.
اگر حوصله داشتید سوالاتی در مورد این اسکریپت ها داشتم.
۱-
با
VAR="$(pgrep qemu-system-x86)"
ما متغیری بنام VAR$تعریف کردیم. در زمانیکه ماشین مجازی در حالت روشن می باشد، هر دو
"$(pgrep qemu-system-x86)"
و همچنین
$VAR
یک مقدار را برمی گردانند.
ولی وقتی که ماشین مجازی را خاموش می نماییم. نتایج متفاوتی دارند.
"$(pgrep qemu-system-x86)"
مقدار null را برمیگرداند، که درست است. ولی
$VAR
همان مقدار قبلی را برمی گرداند، در صورتی که بنظرم بایستی null را برگرداند.
علت این امر را نمی دانم.
( عکس شماره ۱ )
۲-
if [ -z "$VAR" ]
اگر امکان داشته باشید توضیح مختصری در این باره بدهید، خیلی ممنون خواهم شد.
چیزی سردرنیاوردم.
۳-
در صورت امکان میخواستم این اسکریپت ها را بصورت فایل دربیاورم که در موقع بوت سیستم بصورت خودکار اجرا بشوند. آیا از لحاظ محتوایی بنظرتان اشکالی ندارند؟
touch script1.sh
chmod 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
-
اولا که اسم متغیر 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 هست رو فکر کنم بتونید بردارید یا اینکه زمانش رو کمتر کنید. این دست خودتونه.
-
۱-
با تشکر فراوان بخاطر توضیحات مفید و ارزشمندتان .
۲-
یه دستور sleep که بین virt-manager و wmctrl هست رو فکر کنم بتونید بردارید یا اینکه زمانش رو کمتر کنید. این دست خودتونه.
این زمان ضروری می باشد. اگر sleep نگذاریم و یا مقدار آن برابر یک بگذاریم، عمل fullscreen صورت نمی گیرد، ولی در زمانهای دو ثانیه و بالاتر این عمل صورت می گیرد.
۳-
بصورت علمی و محاسباتی از کجا میتوان فهمید سرعت سیستم پایین آمده است یا بالا رفته است؟
مثلاً من یک توزیع را بصورت اصلی در کامپیوترم نصب میکنم و همچنین همان توزیع را در ماشین مجازی نصب میکنم ، آیا راهی وجود دارد که سرعت عملکرد آندو سیستم را نسبت بهم بسنجم ؟ (میگوییم سیستمم سنگین شده، بغیر از ظاهر قضایا که مثلاً مربوط به باز شدن پنجره ها و اجرای ظاهری آنها میشود ، آیا راه دقیقتری برای دیدن این تفاوتها هم هست؟)
۴-
میخواستم در صورت امکان این کارم را بر روی یک window manager بعنوان یک پلت فرم انجام دهم. بنظرتان از بین window manager های گوناگون کدامیک برای این کار من مناسبتر است؟
آیا بغیر از window manager برای این کار پیشنهاد مناسبتر دیگری میتوان داشت؟
-
۲- خب بزاریدش روی ۳ یا ۴ تا کمتر منتظر بمونید.
۳- benchmark بگیرید. میتونید اینجا (https://linuxconfig.org/how-to-benchmark-your-linux-system) رو ببینید. خودتون هم میتونید جستوجو کنید.
۴- تجربهای ندارم.
-
گام های لازم برای اجرا را بصورت خلاصه برای استفاده در اینجا قرار می دهم.
چنانکه دوستان به من آموختند ،خوشحال خواهم شد ، آموخته هایم را در اختیار سایرین بگذارم.
هدف:
میخواهیم وقتی کاربر،در سیستم اصلی،وارد حساب کاربری خود بشود، بطور اتوماتیک وار وارد توزیع نصب شده در ماشین مجازی بشود. یعنی ابتدا توزیع مربوطه اجرا شده، بعد به حالت تمام صفحه نشان داده شود و هر وقت که کاربر ماشین مجازی را خاموش نماید ، سیستم اصلی هم بطور اتوماتیک وار خاموش شود.
توضیحات جانبی:
سیستم اصلی: 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 mytest
sudo 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 می شویم.
-
برای اجرای ماشینمجازی، کاربری که ساختید لازم نیست توی گروه 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 وجود داشته باشه.
اگه هم حذفش نکنید، نباید تاخیری ببینید چون داره توی پشت صحنه اجرا میشه.
-
بابت راهنماییهای مفیدتان و وقتیکه گذاشتید، ممنون و سپاسگزارم.