محمد نصیری
بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

RunLevel چیست؟ معرفی init process و انواع RunLevel در لینوکس

init در لینوکس چیست؟ runlevel در لینوکس به چه معناست؟ چند نوع Runlevel در لینوکس داریم؟ در مقاله های قبلی که در توسینسو منتشر کردیم در خصوص فرآیند Boot سیستم عامل لینوکس و مراحلی که طی می شود صحبت کردیم ، در آنجا کمی در خصوص init process و همچنین بصورت بسیار مختصر در خصوص runlevel های مختلف لینوکس صحبت کردیم

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

اما امروز می خواهیم در این مقاله بصورت اختصاصی در خصوص اینکه init process چیست و چطور کار می کند و چطور می توانیم برخی از موارد را در این process عوض کنیم و همچنین معرفی انواع runlevel های لینوکس صحبت کنیم.زمانیکه Kernel و درایورها Load شدند لینوکس شروع به Load کردن سایر قسمت های سیستم عامل می کند.

اینکار همانطور که قبلا هم اشاره کردیم با اجرا کردن اولین Process در سیستم عامل به نام init شروع می شود ، هر پردازش یا Process در سیستم عامل برای خود دارای یک شناسه یا ID است که هر چقدر این عدد پایینتر باشد به منزله اولویت پردازش مورد نظر است. عدد یا شناسه یا بهتر بگوییم Process ID ای که به init داده می شود شماره 1 است

یعنی بلافاصله بعد از Kernel لینوکس که دارای شناسه 0 یا بالاترین اولویت است init اجرا می شود . دقت کنید که شما در سیستم عامل لینوکس می توانید با استفاده از دستور ps تعداد و Process ID های هر کدام از Process های روی سیستم را مشاهده کنید اما Kernel را نمی توانید ببینید.

Init process تمامی کنترل عملیات boot سیستم عامل را در نهایت در دست می گیرد. در لینوکس های مختلف اسکریپت های اصلی مختلف به اسامی مختلفی وجود دارند که در نهایت وظایف اصلی سیستم عامل را انجام می دهند. در واقع init process در فرآیند Boot سیستم عامل به سراغ این Master Script می رود و تمامی اسکریپت های وابسته به آن را اجرا می کند

و این Master Script در لینوکس توزیع Red Hat Enterprise در مسیر etc/rc.d/rc/sysinit/ قرار دارد اما در لینوکس توزیع Debian که مورد بحث ما است در مسیر etc//init.d//rcS// قرار دارد که همانطور که قبلا اشاره کردیم به این نوع اسکریپت ها که خودشان به یک سری اسکریپت دیگر اشاره می کنند symlinked scripts گفته می شود.

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

توسط تنظیمات موجود در محل etc// و از درون یک فایل به نام inittab خوانده می شوند. Init process برای اینکه بتواند runlevel پیشفرض سیستم را مشخص کرده و آن را Load کند به مشخصات تنظیمات موجود در این فایل نگاه می کند. توجه کنید که شما در حال عادی نمی توانید init process را حذف یا غیرفعال کنید و از بدو شروع سیستم عامل تا خاموش شدن آن این process در سیستم در حال اجرا می باشد. در زیر runlevel هایی که معمولا در اکثر سیستم عامل های لینوکس وجود دارند را می توانید مشاهده کنید :

معرفی Runlevel های مختلف در لینوکس

همانطور که در تصویر بالا مشاهده می کنید runlevel شماره صفر به Halt اختصاص یافته است که در صورتیکه این Runlevel اجرا شود در واقع سیستم عامل شما shutdown خواهد شد. Runlevel شماره 1 که به حالت تک کاربره نیز معروف است زمانی استفاده می شود که کاربر مدیر قصد انجام پیکربندی های مدیریتی را بر روی سیستم عامل دارد. Runlevel شماره 2 زمانی است که init کارت شبکه و تنظیمات شبکه ای شما را فعال می کند اما آنها را پیکربندی نمی کند و شما برای استفاده از آنها باید بصورت دستی برخی تنظیمات را انجام دهید.

Runlevel شماره 3 حالتی است که سیستم در حالت عادی Boot و استفاده می شود ، یعنی دقیقا چیزی که یک کاربر از یک سیستم عامل انتظار دارد. Runlevel شماره چهار یا 4 بدون استفاده است البته در برخی موارد از این Runlevel به عنوان Runlevel مصارف خاص نیز نام برده می شود. Runlevel شماره 5 مشابه Runlevel شماره 3 است با این تفاوت که رابط کاربری گرافیکی ای GUI را به همراه خود Load می کند و در نهایت Runlevel شماره 6 سیستم عامل شما را Reboot می کند.

همانطور که در قسمت قبلی مشاهده کردید بعد از اینکه کرنل Boot می شود همیشه یک برنامه به نام init را اجرا می کند. بعد از اجرای init این برنامه تنظیماتی که باید انجام دهد را از داخل یک فایل به نام inittab می خواند و اجرا می کند که این فایل در مسیر //etc//inittab قرار گرفته است.

شما به عنوان شخصی که می خواهید وارد دنیای لینوکس شوید باید با ساختار داخلی و نحوه کاری تنظیمات این فایل آشنا شوید به همین دلیل می توانید در ادامه مثالی از محتویات یک فایل inittab که از سیستم عامل لینوکس توزیع Debian گرفته شده است را می توانید مشاهده کنید ، توجه کنید که در فایل های پیکربندی سیستم عامل لینوکس هر جا ابتدای خط علامت # مشاهده کردید یعنی خط مورد نظر فقط توضیحات است و اجرا نمی شود :

root@cdn-bov1:~# cat /etc/debian_version 
6.0.3
root@cdn-bov1:~# cat /etc/inittab 
# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.
id:2:initdefault:

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS

# What to do in single-user mode.
~~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6

# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  :::
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3


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

id:runlevels:action:process

تمامی خطوطی که در فایل مثال بالا مشاهده می کنید و با علامت # در ابتدای آنها مشخص شده اند به هیچ عنوان اجرا نمی شوند و به عنوان توضیحات فایل در نظر گرفته می شوند اما در خصوص ساختار و قالبی که در خط بالا عنوان کردیم هر کدام معنی و مفهوم خاصی را می رسانند که به صورت زیر تشریح می شوند :

  1. Id یا شناسه : یک موجودیت منحصر به فرد و ترتیبی است که در inittab است و می تواند بین 1 تا 4 کاراکتر باشد
  2. runleveles : سطح runlevel ای را مشخص می کند که action یا فعالیت مورد نظر ما باید در آن انجام شود
  3. action : مشخص کننده عملیات یا فرآیند هایی است که قرار است انجام شود
  4. process : همانطور که از نامش هم پیداست مشخص کننده process ای هست که قرار است اجرا شود ، اگر فیلد process با استفاده از یک کاراکتر + شروع شود init برای آن process فرآیند های utmp و wtmp را انجام نخواهد داد. در خصوص این فرآیندها بعدا بصورت مفصل صحبت خواهیم کرد.

فیلد runleveles می تواند شامل چندین کاراکتر مختلف به عنوان runlevel های مختلف باشد برای مثال اگر شما 123 را در این فیلد مشاهده کردید به این معنا است که process مورد نظر در runlevel های 1 و 2 و 3 می تواند شروع شود . runlevel هایی که بصورت موجودیت های ondemand مشخص شده اند با استفاده از کاراکترهای A ، B و C مشخص می شوند.

Runlevel هایی که در فیلد sysinit ، boot و bootwait وجود دارند صرف نظر می شوند. توجه کنید که زمانیکه system runlevel تغییر کند تمامی process هایی که رای runlevel جدید تعریف نشده اند توسط سیستم kill می شوند و از روند پردازشی خارج می شوند. اما مهمترین فیلد و البته پیچیده ترین فیلدی که در ساختار فایر inittab وجود دارد فیلد action است که Action های معتبری که می توانند در این قسمت قرار بگیرند به شکل زیر می باشند :

  1. respawn : پردازش مورد نظر بعد از اینکه به پایان رسید restart می شود
  2. wait : پردازش مورد نظر یکبار با اجرای runlevel مورد نظر start می شود و init تا زمانیکه process تمام شود صبر می کند
  3. once : پردازش به محض اینکه runlevel مورد نظر وارد شود یکبار اجرا می شود
  4. boot : پردازش در زمان بوت سیستم اجرا می شود و به فیلد runlevel اهمیتی داده نمی شود
  5. bootwait : پردازش در زمان بوت سیستم اجرا می شود و init منتظر پایان یافتن process مورد نظر باقی می ماند ، فیلد runlevel هم اهمیتی داده نمی شود
  6. off : این هیچ کاری نمی کند ( همینجوری واسه قشنگیه )
  7. ondemand : پردازش ای که بصورت ondemand مشخص م ود زمانی اجرا می شوند که runlevel بصورت ondeman اجرا شود.
  8. initdefault : ای قسمت تعریف کننده runlevel ای است که در همگام بوت سیستم بایستی وارد شود ، اگر هیچ موجودیتی در این قسمت وارد نشود init بصورت خودکار از شما در این خصوص سئوال می کند ، در این حالت فیلد process در نظر گرفته نمی شود.
  9. sysinit : پردازش مورد نظر در زمان بوت سیستم اجرا می شود ، sysinit قبل از boot و bootwait اجرا می شود و runlevel هم در این حالت نادیده گرفته می شود
  10. powerwait : پردازش زمانی اجرا می شود که برق از سیستم گرفته می شود ، init از این process به عنوان process ای یاد می کند که با دستگاه UPS ارتباط برقرار می کند. Init منتظر این process می ماند تا اینکه بصورت کامل تمام شود.
  11. powerfail : همانند powerwait است با این تفاوت که init منظر تمام شدن این process نمی ماند
  12. powerokwait : این process زمانی اجرا می شود که init اعلام کند که power یا برق به سیستم برگشته است
  13. powerfail : این process زمانی اجرا می شود که init اعلام کند که برق UPS در حال تمام شدن است یا UPS خالی شده است البته توجه کنید که اینگونه entry ها نیازمند سیستم مانیتورینگی هستند که وضعیت UPS ها را اطلاع دهند.
  14. ctrlaltdel : این process زمانی اجرا می شود که init سیگنال SIGINT را دریافت کند. به این معنی که یک نفر که بصورت کنسولی از سیستم در حال استفاده است همزمان کلیدهای CTRL و ALT و DEL را فشرده است.
  15. kbrequest : این process زمانی اجرا می شود که init متوجه شود که از طرف کیبورد کلید های ترکیبی وارد شده است.


البته هر چند ما این موارد را برای شما تشریح کردیم اما انتظار نداریم به عنوان یک کارشناس سیستم عامل همه موارد را درک کنید ، همینکه با کلیات ساختاری inittab آشنا شوید برای ما کفایت می کند و بیشتر این موارد را صرفا زمانیکه نیاز به پیاده سازی خاصی داشته باشید انجام خواهد داد ، اگر نظر ، انتقاد و یا پیشنهاد خاصی در این خصوص دارید می توانید در ادامه مطرح کنید


محمد نصیری
محمد نصیری

بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

محمد نصیری هستم ، هکر قانونمند و کارشناس امنیت سایبری ، سابقه همکاری با بیش از 50 سازمان دولتی ، خصوصی ، نظامی و انتظامی در قالب مشاور ، مدرس و مدیر پروژه ، مدرس دوره های تخصص شبکه ، امنیت ، هک و نفوذ ، در حال حاضر در ایران دیگه رسما فعالیتی غیر از مشاوره انجام نمیدم و مقیم کشور ترکیه هستم ، عاشق آموزش و تدریس هستم و به همین دلیل دوره های آموزشی که ضبط می کنم در دنیا بی نظیر هستند.

نظرات