پرش به محتویات

۳.۳ مدیریت Runlevelها و shutdown و reboot

لینوکس مفهوم runlevel (سطح‌های اجرایی) به همان شکلی که اکثر سیستم‌های یونیکسی ارائه می کنند دارد.این مفهوم راه های مختلفی را برای استفاده از سیستم با کنترل این که چه سرویس هایی در حالت اجرا باشند مشخص می‌کند.برای مثال یک سیستم که در حالت عادی به صورت یک وب سرور عمل می‌کند طوری پیکربندی شده که بوت شده و وارد runlevelی شود که برای سرویس دهی صفحات وب طراحی شده،در این حالت وب سرور اجرا شده.ولی همین سیستم می‌تواند به ranlevelی بوت شود که برای مدیریت فوری طراحی شده که در آن اکثر سرویس های پایه غیر فعال‌اند و وب سرور اجرا نمی‌شود.

یکی از استفاده های runlevelها جدا کردن سیستمی است که فقط یک میزکار متنی (text console) را فراهم می‌کند با سیستمی که یک رابط کاربری گرافیکی بر پایه X را فراهم می کند.اکثر سیستم هایی که توسط کاربر نهایی استفاده می‌شوند دارای رابط کاربری گرافیکی هستند اما سرور ها معمولا بدون رابط کاربری گرافیکی امن‌تراند و بازده بهتری دارد.حالا با طراحی دو runlevel می‌توان هر دو محیط را در یک سیستم محیا کرد و بین آن‌ها در صورت نیاز جابه‌جا شد.

runlevel ها با اعداد 0 تا 6 مشخص می شود.اعداد 0 و 6 به ترتیب مشخص کننده حالت های انتقالی shutdown و restart هستند، یعنی سیستم در آن سطوح باقی نمی ماند و فقط به سمت shutdown یا restart هدایت می‌شود.وقتی مدیرسیستم به لینوکس می‌گوید که وارد runlevel 0 شود سیستم روال shutdown کردن را آغاز می کند.همین حالت برای runlevel 6 هم صدق می‌کند.بقیه runlevel‌ها در توزیع های مختلف عملکرد متفاوتی دارند.

وقتی یک سیستم لینوکسی بوت می‌شود اولین پروسه‌ای که اجرا می‌شود پروسه init است که کلیه پروسه‌های دیگر را اجرا می‌کند.پروسه init مسئول است تا سیستم را در سطح‌اجرایی (runlevel) پیش‌فرض قرار دهد که سطح‌اجرایی می‌تواند بسته به توزیع یا هدف 2 ، 3 یا 5 باشد.در جدول زیر سطوح‌اجرایی رایج معرفی شده‌اند

سطح‌اجرایی (runlevel) توضیحات
0 توقف سیستم.سطح‌اجرایی 0 یک حالت انتقالی است که توسط مدیر سیستم استفاده شده تا سیستم را به سرعت shutdown کند. مشخصا 0 نباید سطح‌اجرایی پیش‌فرض باشد چون به محض اینکه کرنل init را راه‌اندازی کند سیستم shutdown می‌شود.
1,s,or S Single-user mode،یا maintenance mode.در این سطح سرویس های سیستمی مانند networking ، web servers و file sharing اجرا نمی‌شوند.این حالت معمولا برای نگهداری فایل‌سیستم استفاده می‌شود.
2 Multiuser.در سیستم های Debain-base این سطح‌اجرایی پیش‌فرض است.در سیستم های RedHat-base حالت چندکاربره ولی بدون اجرا شدن سرویس های NFS file sharing یا X Windowing System است.
3 در سیستم های RedHat-base این سطح ، سطح پیش‌فرض چندکاربره است که در آن تمامی سرویس ها جز X Windowing System اجرا می‌شود.این سطح اجرایی در سیستم‌های Debian-base معمولا استفاده نمی‌شود.
4 معمولا استفاده نمی‌شود
5 در سیستم های RedHat-base این سطح‌اجرایی چندکاربره با محیط گرافیکی است.این سطح‌اجرایی مانند سطحاجرایی 3 است با این تفاوت که در این سطح‌ X11 اجرا شده و قابلیت login گرافیکی را داریم.
6 Reboot.این سطح مانند سطح‌اجرایی 0 یک سطح انتقالی است با این تفاوت که سیستم را به reboot شدن هدایت می‌کند.

نکته مهم این است که سطوح‌اجرایی مانند دیگر چیز ها در لینوکس قابل پیکربندی‌اند.

‌Single-User Mode

سطح‌اجرایی 1 یا سطح‌اجرایی تک کاربر محیط عملیاتی اصلی در نظر گرفته شده برای تعمیر و نگهداری سیستم است.در این سطح‌اجرایی remote login و networking غیر فعالند و بسیاری از سرویس ها start نشده‌اند.این حالت برای پیکربندی وظایفی (tasks) استفاده می شود که نیاز دارند هیچ فعالیتی از سمت کاربران انجام نشود.یکی دلایلی که باعث می‌شود شما وارد این سطح‌اجرایی شوید وجود مشکل در فایل‌سیستم است طوری که سیستم به صورت خودکار توانایی حل آن را نداشته باشد.

برای اینکه بتوانید در زمان بوت سیستم وارد حالت single-user شوید باید پارامتر های کرنل را مانند دستور های زیر تغییر دهید.

    kernel /vmlinuz-2.6.27.21-170.2.56.fc10.i686 ro root=/dev/hda1  quiet
to 
    kernel /vmlinuz-2.6.27.21-170.2.56.fc10.i686 ro root=/dev/hda1  quiet 1
or 
    kernel /vmlinuz-2.6.27.21-170.2.56.fc10.i686 ro root=/dev/hda1  quiet single
or
    kernel /vmlinuz-2.6.27.21-170.2.56.fc10.i686 ro root=/dev/hda1  quiet s

برای وارد شد از یک سطح‌اجرایی به sigle-user از دستور زیر استفاده کنید :

 # init 1
با استفاده از دستور init می‌توان بین سطوح‌اجرایی جابه‌جا شد:

 # init 4

دستور telinit مشابه دستور init است

 # telinit 4
برای اینکه بفهمیم در حال حاضر در چه سطح‌اجرایی(runlevel) هستیم از دستور runlevel استفاده می‌کنیم.

 # runlevel
 N 2 
 # init 4 
 # runlevel 
 2 4 

در دستورات بالا عدد اول نشان دهنده سطح‌اجرایی قبلی است و اگر به جای آن N باشد به این معناست که ما در سطح‌اجرایی پیش‌فرض هستیم.عدد دوم سطح‌اجرایی در حال حاضر را نشان می‌دهد.

شخصی سازی runlevelها

پس از این که کرنل پروسه init را اجرا می‌کند این پروسه ابتدا به سراغ پوشه /etc/rc.S/ رفته و اسکریپت‌های درون آن را اجرا می‌کند.پس از آن با توجه به سطح‌اجرایی پیش‌فرض اسکریپت‌های درون /etc/rcX.d/ را اجرا می‌کند که X در واقع شماره سطح‌اجرایی است.این پوشه‌ها در واقع حاوی لینک هایی به اسکریپت های درون پوشه /etc/init.d/ هستند.این اسکریپت‌ها پارامترهای خاصی را دریافت می‌کنند شامل start،restart،stop و غیره...

در نهایت وقتی همه‌ی اسکریپت های درون /etc/rcX.d/ اجرا شدن پروسه init فایل etc/rc.local/ را اجرا می‌کند

لینک‌های درون پوشه‌های سطوح‌اجرایی نام‌گذاری خاصی دارند.هر لینک با حروف S یا K شروع می‌شود.لینک‌هایی که با S شروع شده‌اند با پارامتر startو لینک‌هایی که با K شروع می‌شوند با پارامتر stop توسط init اجرامی‌شوند.بعد از حروف S و K با استفاده از یک عدد دورقمی ترتیب اجرای لینک‌ها را مشخص می‌شود و در آخر هم نام لینک ،‌اسم پروسه قرار دارد.

در واقع وقتی دستور با استفاده از دستور init سطح‌اجرایی را تغییر می‌دهیم پروسه init لینک‌های درون پوشه مربوطه را با توجه به حرف اول اسم لینک و شماره ترتیب اجرا می‌کند.

ما نیز می‌توانیم با استفاده از اسکریپت های درون /etc/init.d/ وضعیت سرویس های مختلف را تغییر دهیم.دستور زیر سرویس networking را غیرفعال می‌کند.

 # /etc/init.d/networking stop

همچنین با استفاده از دستور service نیز می‌توان وضعیت سرویس ها را تغییر داد.در این دستور باید از نام اسکریپت ها استفاده کرد.

 # service networking stop

با استفاده از پارامتر --status-all می‌توان وضعیت سرویس‌ها مشاهده کرد.

در خروجی زیر + یعنی سرویس فعال است. - به مهنی غیرفعال بودن سرویس می‌باشد. علامت ? نیز به این معنی است که از وضیعیت سرویس اطلاعاتی در دسترس نیست.

 # service --status-all
 [ + ]  acpi-fakekey
 [ - ]  acpi-support
 [ + ]  acpid
 [ ? ]  alsa-utils
 [ - ]  anacron
 [ + ]  atd
 [ + ]  avahi-daemon
 [ ? ]  binfmt-support
 [ + ]  bluetooth
 [ - ]  bootlogs
 [ ? ]  bootmisc.sh
 [ + ]  ccpd.dpkg-new
 [ ? ]  checkfs.sh
 [ ? ]  checkroot-bootclean.sh
 [ - ]  checkroot.sh
 [ - ]  console-setup
 [ ? ]  cpufrequtils
 [ + ]  cron
 [ + ]  cups
 [ + ]  dbus
 [ - ]  dnsmasq
 [ + ]  ebtables
 [ - ]  exim4
 [ + ]  gdm3

update-rc.d

با استفاده از دستور update-rc.d می‌توان اسکریپتی را به سطوح‌اجرایی اضافه کرد.قبل از استفاده از این دستور باید اسکریپت مورد نظر را در پوشه /etc init.d/کپی کنید.

 # update-rc.d newService defaults 20

حذف سرویس سطوح‌اجرایی

 # update-rc.d newService remove

همچنین با استفاده از دستور زیر می‌توان وضعیت سرویس های درون سطوح اجرایی را نیز تغییر داد.

 # update-rc.d newService disable 2 

دستورات سیستم های RedHat-base

در سیستم های RedHat-base از دستورات زیر استفاده می‌کنیم.

 # chconfig --add 'NewService'

 # chconfig --del 'NewService'

 # chkconfig --runlevel 2 'NewService' on/off

 # chconfig --list  

shutdown

با استفاده از دستور shutdown می‌توان سیستم را به درستی shutdown کرد فرق این روش با استفاده از init این است که این دستور به کاربران در مورد shutdown شدن هشدار داده و از login کردن کاربران جدید جلوگیری می‌کند.

 shutdown [options] time [warning_message]
 shutdown -h 23:59 "system will shutdown at 23:59"
گزینه ها توضیحات
h- این گزینه باعث خاموش شدن سیستم می‌شود
r- این گزینه باعث ریستارت شدن سیستم می شود
k- واقعا سیستم را خاموش نمی‌کند فقط پیغام های هشدار را ارسال می‌کند
f- باعث می‌شود سیستم در بوت بعدی فایل‌سیستم را چک نکند و عمل بوت سریع تر انجام می‌شود
F- در بوت بعدی حتما فابل‌سیستم چک می‌شود
c- عمل shutdown را کنسل می‌کند

Reboot

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

 # reboot 

بخش‌هایی از این فصل از کتاب بر گرفته از منابع زیر است :

LPIC-1 Linux Professional Institute Study Guide(3rd Edition)
LPI Linux Certification in a Nutshell, 3rd Edition