منبع اصلی نوشتار زیر در این لینک قرار دارد

آموزش فارسی LPIC 1 : قسمت پنجم

سلام دوستان . مدتی آموزش این دوره متوقف شده بود اما دوباره این آموزش ها رو در پیش رو داریم . هم چنین قرار شده که حجم مطالب هر قسمت را کم تر کنیم یعنی به جای این که داخل هر قسمت به 3 الی 5 مبحث بپردازیم , تمرکز خودمون رو روی یک مبحث قرار دهیم لذا در این قسمت به مبحث 101.3 Change runlevels and shutdown or reboot system خواهیم پرداخت .

طبق روال گذشته ابتدا به متن زیر که از وب سایت اصلی LPIC تهیه شده است توجه کنید :

101.3 Change runlevels and shutdown or reboot system
Description : Candidates should be able to manage the runlevel of the system. This objective includes changing to single user mode, shutdown or rebooting the system. Candidates should be able to alert users before switching run level and properly terminate processes. This objective also includes setting the default run level. It also includes basic feature knowledge of potential replacements to init.
Key Knowledge Areas :
Set the default runlevel.
Change between run levels including single user mode.
Shutdown and reboot from the command line.
Alert users before switching runlevels or other major system event.
Properly terminate processes.
Knowledge of basic features of systemd and Upstart
Terms and Utilities
/etc/inittab | shutdown | init |‌ /etc/init.d |‌ telinit

مقدمه :

ابتدا باید در مورد مفهوم runlevel صحبت کنیم چرا که پایه و اساس دیگر قسمت های این مبحث از همین runlevel شروع می شود . به عنوان مثال خاموش و یا ریست کردن سیستم و …

در گنو لینوکس هفت runlevel داریم که از صفر شروع شده و 6 ختم می شود . هر یک از این runlevel ها را می توان همانند یک طبقه در نظر گرفت . در هر یک از این طبقات یک سری از ابزار ها و برنامه ها و سرویس ها و … فعالیت می کنند . یعنی از قبل برایشان تعریف شده که مثلا سرویس آپاچی در این طبقه و یا runlevel شروع به کار کند . طبیعتا می توان داخل این طبقات شد و نظم اجرای برنامه در هر طبقه را تغییر داد و یا این که اولویت اجرای یک برنامه را از یک طبقه به طبقه ای بالاتر و یا پایین تر تغییر داد .

پس می توان این طور جمع بندی کرد که runlevel همانند طبقاتی می ماند که در هر یک از این طبقات , برنامه ها و سرویس ها و … در یک صف منظم و با اولویت هایی مشخص اجرا می شوند .

ابتدا فرض می کنیم که معنی runlevel شماره ی 0 یعنی طبقه ی همکف برابر با خاموش بودن سیستم است . یعنی اگر من سیستم را به runlevel شماره ی 0 ببرم , عملا سیستم را خاموش کرده ام . دقیقا مانند زمانی که به صورت گرافیکی اقدام به خاموش کردن سیستم می کنیم .

همچنین این گونه فرض می کنیم که runlevel شماره ی 6 برابر با ریست و یا reboot شدن سیستم است . یعنی اگر من سیستم را به runlevel شماره ی 6 ببرم , عملا سیستم را یک بار reboot کرده ام . دقیقا همانند زمانی که به صورت گرافیکی اقدام به ریست کردن سیستم می کنیم .

پس می توان این نکته را استخراج کرد که هر برنامه ای که باعث شود سیستم ریست و یا خاموش بشود , از این مفهوم یعنی runlevel ها ی 0 و 6 پیروی کرده است . ( از برنامه های تحت خط فرمان بگیرید تا خاموش و ریست کردن سیستم به صورت گرافیکی )

با توجه به گفته های بالا می توان نتیجه گرفت که 5 طبقه و یا runlevel دیگر باقی می ماند که در مورد آن ها بحث خواهیم کرد .

نظم و اولویت اجرای برنامه ها در هر توزیع متفاوت است یعنی ممکن است یک سرویس در runlevel شماره ی 4 یک توزیع red hat بیسی اجرا شود در حالی که همان سرویس در runlevel شماره ی 3 یک توزیع debian بیسی اجرا شود . به معنای دیگر به طور 100٪ یک نظم همگانی در میان تمامی توزیع ها وجود ندارد . همراه با این که هر شخص می تواند بسته به کار و نیاز خود , این اولویت ها را تغییر دهد . پس به طور حتم نمی توان گفت که یک سرویس و یا یک برنامه در چه runlevel ای اجرا می شود اما به طور کلی می توان برای هر سطح وظایفی را در نظر گرفت که البته این در توزیع های مختلف متفاوت است .

به عنوان مثال :

Ubuntu runlevels :
Code	Information
0	Halt
1	Single-user mode
2	Graphical multi-user with networking
3-5	Unused but configured the same as runlevel 2
6	Reboot

و یا
Red Hat Linux/Fedora runlevels :
Code	Information
0	Halt
1	Single-user text mode (without networking)
2	Not used (user-definable)
3	Full multi-user text mode
4	Not used (user-definable)
5	Full multi-user graphical mode (with an X-based login screen)
6	Reboot

برای اطلاعات بیش تر به لینک زیر مراجعه کنید :

http://en.wikipedia.org/wiki/Runlevel

 

Change between run levels including single user mode …

اما برای مشاهده ی runlevel ای که سیستم در آن واقع است از دستور runlevel استفاده می کنیم . به عنوان مثال من از centos 6.3 استفاده می کنم و به صورت پیش فرض پس از نصب مشاهده می کنم که runlevel ای که در آن قرار دارم شماره ی 5 است .
001حال برای تغییر سطح runlevel باید از دستور init استفاده کنیم . به عنوان مثال می خواهیم از runlevel شماره ی 5 به runlevel شماره ی 3 برویم . برای این منظور با استفاده از یوزر روت به شکل زیر عمل می کنیم :
init 3

اگر مراحل رو دنبال کرده باشید خواهید دید که محیط گرافیکی غیرفعال شده و محیط کنسول برای ما باز می شود . دلیل این امر این است که محیط گرافیکی در runlevel شماره ی 5 اجرا می شود . هم چنین اگر دوباره دستور runlevel را اجرا کنیم , خروجی ای مانند عکس زیر دریافت خواهیم کرد :

002خروجی دستور بالا یعنی از runlevel شماره ی 5 به runlevel شماره ی 3 آمده ایم و هم اکنون در runlevel شماره ی 3 هستیم .

نکته : می توان همین روند با استفاده از دستور telinit انجام داد .

 

اگر به جدولی که ویکی پدیا برای centos در نظر گرفته است توجه کنید , خواهید دید که جلوی runlevel شماره ی 4 عبارت Not used user-definable نوشته شده است که یعنی در حالت عادی استفاده نمی شود و برای تغییرات یوزر در نظر گرفته شده است .
پس می توان این حدس را زد که تمامی برنامه ها و … که در runlevel شماره ی 3 اجرا می شوند , به همان اولویت در runlevel شماره ی 4 نیز اجرا می شوند . برای چک کردن این مورد به دو دایرکتوری زیر رفته و محتویات داخل آن ها را با هم مقایسه کنید .

 

/etc/rc3.d/
/etc/rc4.d/

اگر کمی توجه کنید خواهید دید که تمامی فایل های داخل این دایرکتوری با دو حرف S یا K شروع شده اند که حرف S مشخصه ی فعال و حرف K مشخصه ی غیر فعال بودن آن برنامه و یا سرویس و … را دارد . یعنی اگر سرویسی در ابتدای اسمش K داشته باشد , اجرا نخواهد شد . پس برای مقایسه ی برنامه و سرویس ها و … در این دو runlevel باید به دنبال لینک هایی باشیم که با حرف S شروع شده اند . یعنی :

ls -lh S*

هم چنین می توانیم از طریق تعداد خطوط نیز این مقایسه را انجام دهیم . یعنی :

ls -lh S* | wc -l

از روی مشاهده ها می توان نتیجه گرفت که runlevel شماره ی 4 همان runlevel شماره ی 3 می باشد .

نکته : دایرکتوری های مربوط به runlevel شماره ی 0 , 1 , 2 , 3 , 4 , 5 , 6 به ترتیب برابر است با :

/etc/rc0.d/
/etc/rc1.d/
/etc/rc2.d/
/etc/rc3.d/
/etc/rc4.d/
/etc/rc5.d/
/etc/rc6.d/

حال فرض کنید که برنامه ای ساختیم که باید در runlevel شماره ی 3 اجرا شود . با توجه به نکات بالا , برنامه ی خودمون رو در runlevel شماره ی 4 قرار می دهیم سپس runlevel پیش فرض سیستم را از شماره ی 5 به 4 تغییر می دهیم .
به عنوان مثال می خواهیم تاریخ و ساعت دقیق هر بار روشن شدن سیستم در فایلی متنی واقع در home directory یوزر روت قرار بگیرید :
#! /bin/bash
date >> /root/date.text

در مرحله ی بعد باید به این اسکریپت پرمیشن اجرا بدیم پس :

chmod +x date.sh

حال برای این که این اسکریپت کوچیک در هر بار روشن شدن سیستم , اجرا شود باید آن را به دایرکتوری مربوط به runlevel شماره ی 4 کپی کنیم .
نکته : فرض کردیم که می خواهیم runlevel پیش فرض سیستم را از 5 به 4 تغییر دهیم .
برای این منظور به صورت زیر عمل می کنیم :
cp date.sh /etc/rc4.d/S99date

نکته : می توانید به جای کپی کردن اسکریپت به دایرکتوری rc4.d از آن یک symlink تهیه کنیم .

Set the default runlevel …

 

در آخر برای این که runlevel پیش فرض سیستم را از 5 به 4 تغییر دهیم ابتدا فایل زیر را با یک ویرایشگر باز می کنیم :
/etc/inittab

سپس عبارت id:5:initdefault: را به id:4:initdefault: تغییر می دهید . حال پس از هر بار راه اندازی مجدد سیستم , runlevel سیستم شماره ی 4 خواهد بود و اسکریپت ما نیز هر بار اجرا می شود .
دایرکتوری های مربوط به هر runlevel در بالا گفته شد . حال اگر دستور ls -lh را در هر کدام از دایرکتوری های بالا اجرا کنیم , خواهیم دید که تمامی فایل ها یک symlink از فایلی اجرایی در مسیر زیر هستند :

/etc/init.d/

معمولا فایل های اجرایی سرویس ها و … مثل apache و mysql و ssh و … در این مسیر قرار می گیرند . فایل اجرایی ای که کار با این سرویس ها را برای ما آسان تر می کند . به این صورت که معمولا این فایل ها از 4 دستور start ,stop, restart, reload جهت مدیریت آن سرویس پشتیبانی می کنند . به عنوان مثال :

/etc/init.d/sshd restart

 

Shutdown and reboot from the command line …

 

در بالا گفته شده که دو runlevel شماره ی 0 و 6 به ترتیب برای خاموش و ریبوت کردن سیستم هستند , هم چنین دیدیم که با استفاده از دستور init می توان سطح runlevel خودمون رو تغییر بدیم , پس با توجه به مطالب گفته شده می توانیم از دو دستور زیر ( به ترتیب ) برای خاموش و ریبوت کردن سیستم استفاده کنیم :

init 0
init 6

هم چنین می توان از دستور reboot برای ریست کردن سیستم استفاده کرد . اما دستور shutdown :
ابتدا به سینتکس این دستور توجه کنید :

shutdown [OPTION]... TIME [MESSAGE]

سویچ k- : فقط برای فرستادن پیغام به تمامی یوزر های فعال
سویج h- : برای خاموش کردن سیستم
سویچ r- : برای ریست کردن سیستم
سویچ c- : برای غیر فعال کردن اثر دستورات استفاده می شود ( به عنوان مثال دستور خاموش شدن سیستم بعد از 15 دقیقه را زده اید , حال برای غیر فعال کردن این امر از سویچ c- استفاده می کنیم )
سویچ f- : ریست کردن سیستم با سرعت بالا ( به این صورت که در هنگام بالا آمدن سیستم , هارد دیسک توسط برنامه ی fsck چک نمی شود و در نتیجه سیستم سریع تر راه اندازی می شود )
سویچ F- : دقیقا بر عکس سویچ قبلی می باشد و fsck در هنگام بوت اجرا می شود .
مثال : ریست کردن سیستم در همین لحظه

shutdown -r now

مثال : خاموش کردن سیستم بعد از 15 دقیقه

shutdown -h +15

مثال : فرستادن پیغام به کاربران همراه با خاموش کردن سیستم در ساعت 16

shutdown -h 16:00 "kar haye khodetono save konid"

نکته : برای محاسبه ی زمان باقی مانده بر حسب ثانیه به شکل زیر عمل می کنیم . مثال : ( ریست شدن سیستم بعد از 30 ثانیه )

shutdown -r -t 30

نکته : ممکن است سویچ t- در نسخه ای که استفاده می کنید نباشد .
پس با مفهوم runlevel ها و همچنین کار با آن و اسکریپت هایی که در هر runlevel اجرا می شوند , آشنا شدیم . همچنین یک برنامه را در runlevel شماره ی 3 اضافه کردیم . تا به این جا مفهوم را بررسی کردیم اما طبیعتا برای کار با runlevel ها و مدیریت برنامه ها و سرویس ها و … ابزارهایی تهیه شده است . ابزار هایی که تغییر runlevel یک اسکریپت و یا فعال و غیر فعال کردن آن را برای ما آسان تر می کند .
در ادامه به معرفی یک مورد از این ابزار ها خواهیم پرداخت . متاسفانه یک ابزار جامع با سینتکسی معیین برای همه ی توزیع ها وجود ندارد اما مفهوم برخورد با runlevel ها در همه ی توزیع ها یکسان است .

 

دستور chkconfig :

 

از این دستور برای مدیریت برنامه ها و … در سطوح runlevel استفاده می شود . لازم به ذکر است که این ابزار فقط تا نسخه ی 6 توزیع centos یافت می شود .
سویچ list– : تمامی اسکریپت ها اعم از فعال و غیر فعال و در هر runlevel ای که باشند را لیست و وضعیت فعال یا غیر فعال بودن آن ها را نمایش می دهد .
برای جست و جو به دنبال سرویسی خاص , کافیست از سویچ list– استفاده کرده و نام سرویس را جلوی سویچ بنویسیم . به عنوان مثال :

chkconfig --list sshd

003همان طور که مشاهده می کنید , سرویس ssh در تمامی runlevel ها غیر فعال است .

سویچ level– : برای مشخص کردن runlevel ای که با آن کار داریم استفاده می شود . به عنوان مثال می خواهیم سرویس ssh را در دو runlevel شماره ی 3 و 5 فعال کنیم . به برای منظور :

chkconfig --level 35 sshd on

حال اگر با استفاده از سویچ list وضعیت سرویس ssh را مشاهده کنید , خواهید دید که در دو runlevel شماره ی 3 و 5 فعال شده است .

004طبیعتا همین روند را می توان برای غیر فعال کردن یک سرویس در runlevel ای خاص استفاده کرد . به این صورت که کافیست از عبارت off به جای on استفاده کنیم .

در آخر اگر قصد نوشتن یک اسکریپت و اضافه کردن آن به chkconfig را دارید , پیشنهاد می شود این ارسال را مطالعه نمایید .

 

منبع : او اس لرن دات آی آر | http://OSLearn.ir

نویسنده :E2MA3N



برچسب ها : ,