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

معرفی فرآیند 6 مرحله ای بوت لینوکس : لینوکس چگونه Boot می شود؟

GRUB چگونه Boot می شود؟ مراحل بوت لینوکس به چه شکل است؟ تا به حال چندین مطلب در خصوص اینکه Boot Loader چیست و معرفی GRUB و LILO و تفاوت های آنها و همچنین روش کار GRUB در لینوکس مطالبی را در توسینسو قرار داده ایم اما بد نیست در این میان در نهایت به این موضوع برسیم که سیستم عامل لینوکس در نهایت چگونه Boot می شود

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

و فرآیند Startup این سیستم عامل از بدو روشن کردن سیستم تا استفاده از خط فرمان داخلی آن چگونه انجام می شود. البته با یک جستجوی ساده ممکن است مطالب زیادی در خصوص معرفی روش Startup و Boot لینوکس در اینترنت پیدا کنید.دانستن اینکه یک سیستم چگونه Boot می شود

هم می تواند به درک شما در برقراری ارتباط بین سخت افزار و نرم افزار و همچنین رفع مشکلات ناشی از Boot نشدن سیستم عامل بسیار کمک کند . امروز قصد داریم در انجمن تخصصی فناوری اطلاعات ایران با جزئیات بیشتری این فرآیند را قسمت به قسمت به شما معرفی کنیم.

فرآیند کلی Boot سیستم عامل لینوکس شامل شش مرحله اصلی است که همانطور که در تصویر زیر نیز مشاهده می کنید این مراحل به BIOS ، MBR ، GRUB به عنوان Boot Loader پیشفرض ، Kernel ، Init و Runlevel تقسیم بندی می شود که در ادامه هر کدام از این مراحل را با ذکر جزئیات با هم مرور می کنیم.

فرآیند Boot سیستم عامل لینوکس چگونه انجام می شود

مرحله اول بوت سیستم عامل لینوکس - System Startup یا BIOS

اولین فاز فرآیند Boot شدن سیستم فرآیند Startup سیستم است. زمانیکه شما دکمه Power سیستم را می زنید یا اینکه سیستم را Restart می کنید ، قدرت برق به SMPS یا Switched Mode Power Supply می رسد که در این قسمت برق تبدیل به AC یا DC می شود. برق DC به تمامی تجهیزات سیستم اعم از Motherboard ، هارد دیسک ها ، CD-ROM ، ماوس و کیبورد و ... داده می شود و آنها روشن می شوند.

هوشمند ترین قطعه کامپیوتر شما قطعا پردازنده یا همان CPU شما است ، به محض اینکه برق به این دستگاه برسد این دستگاه شروع به انجام عملیات هایی می کند که در حافظه یا ROM سیستم وجود دارد. اولین دستوری که این مرحله از طرف CPU صادر می شود این است

که کنترل سیستم به دست BIOS سیستم داده شود ، BIOS مخفف کلمات Basic Input//Output System است. دستور CPU به BIOS این است که عملیات POST یا Power On Self-Test را انجام دهد. در این عملیات تجهیزات ضروری سیستم برای فرآیند Boot کاملا آزمایش می شوند. بعد از اینکه کنترل به دست BIOS سیستم افتاد دو چیز اتفاق می افتد :

  1. فرآیند آزمایش POST یا Power On Self-Test
  2. انتخاب اولین دستگاه قابل Boot در سیستم
وب سایت توسینسو

عملیات POST یا Power On Self-Test در سیستم چیست ؟

عملیات POST یا Power On Self-Test یک سری فرآیند پردازشی است که در دسترس بودن سخت افزارهای سیستم را بررسی می کند. BIOS لیستی از سخت افزارهایی که در آخرین Boot موفق سیستم فعال بوده اند را همیشه در خود دارد ، برای اینکه بررسی شود که یک سخت افزار برای انجام فرآیند Boot سیستم در دسترس است یا خیر برای هر کدام از این سخت افزارها که در لیست قرار دارند یک پالس الکتریکی فرستاده می شود .

اگر پالس الکتریکی به درستی پاسخ داده شود به معنی در دسترس بودن دستگاه مورد نظر و آماده بودن سخت افزار برای انجام فرآیند Boot است. اما اگر از سخت افزاری پالس دریافت نشود ، سخت افزار مورد نظر به عنوان سخت افزار معیوب یا مشکل دار در نظر گرفته می شود و فرض بر این گذاشته می شود که از سیستم جدا شده است.اینکار برای همه سخت افزارهای موجود در لیست BIOS انجام می شود و لیست جدید بر اساس آزمایش های جدید ایجاد می شود و در حافظه BIOS برای فرآیند Boot بعدی استفاده خواهد شد.

وب سایت توسینسو

انتخاب اولین دستگاه قابل Boot

زمانیکه عملیات های مربوط به POST کامل شدند ، BIOS لیست دستگاه هایی در دسترس هستند را خواهد داشت. در اینصورت BIOS به راحتی قادر خواهد بود اولین دستگاهی که در CMOS به عنوان Boot Device معرفی شده است را انتخاب کند. در این مرحله BIOS همیشه اولین دستگاه قابل Boot را انتخاب میکند و کنترل سیستم را مجددا به پردازنده یا CPU می سپارد.

اگر فرض کنیم که اولین دستگاه قابل Boot بر روی سیستم پیدا نشود ، بصورت خودکار BIOS به دنبال دومین دستگاه و به همین ترتیب همه دستگاه های قابل Boot را آزمایش می کند تا به نتیجه مورد نظر برسد. اگر BIOS سیستم نتواند هیچ دستگاه قابل Boot ای بر روی سیستم پیدا کند به شما پیامی به شکل No boot device found به معنی عدم پیدا کردن دستگاه قابل Boot نمایش خواهد داد.

مرحله دوم Boot سیستم عامل لینوکس – MBR یا Master Boot Record

زمانیکه BIOS مجددا اختیار یا کنترل سیستم را در اختیار CPU قرار می دهد ، BIOS سعی می کند MBR یا Master Boot Record را از اولین دستگاه قابل Boot بخواند و Load کند ، ما در اینجا فرض را بر این گذاشته ایم که دستگاه Bootable ما هارد دیسک ما است. MBR یک قسمت کوچک از هارد دیسک ها است که فقط اندازه ای برابر 512 بایت دارد 

تاکید می کنم 512 بایت نه کیلو بایت ، این سکتور از هارد دیسک یا MBR در اولین نقطه شروع اطلاعات در هارد دیسک یا در انتهای هارد دیسک بر اساس نوع سازنده هارد دیسک قرار می گیرد. در واقع می توان به MBR یک Boot Loader اولیه گفت که وظیفه اصلی آن فراخوان کردن Boot Loader ثانوی سیستم است.

MBR پیش زمینه اجرا شدن GRUB را فراهم می کند و این امکان را می دهد که GRUB به داخل حافظه Load شود و باعث بالا آمدن Kernel شود. از 512 بایت فضایی که به MBR اختصاص یافته است در حدود 434 تا 446 بایت آن به Primary Boot Loader اختصاص یافته است ، 64 بایت آن به Partition Table و در نهایت 6 بایت آن برای اعتبارسنجی MBR یا MBR Validation و Timestamp آن اختصاص یافته است.

خوب تا اینجای کار MBR به درستی Load شدن است اما MBR هیچگونه درکی از Kernel و نحوه Load کردن آن ندارد و نمی تواند مفهوم فایل سیستم را درک کند و در اینجاست که کار یک Boot Loader دیگر برای درایوهای فایل سیستم و Load کردن Kernel دیده می شود و این Secondary Boot Loader چیزی جز GRUB نیست. MBR معمولا در هارد دیسک های لینوکسی در مسیر devhda یا devsda قرار گرفته است و مهمترین وظیفه آن Load کردن و اجرای GRUB است.

معرفی GRUB Bootloader

مرحله سوم Boot سیستم عامل لینوکس – GRUB یا Grand Unified Boot Loader

اگر با سیستم عامل لینوکس کمی کار کرده باشید یا آن را بصورت Dual Boot با ویندوز نصب کرده باشید حتما دیده اید که در مرحله ای از Boot سیستم از شما نوع سیستم عاملی که می خواهید آن را Boot کنید سئوال می شود. در واقع این همان GRUB ای است که در موردش صحبت کردیم.

GRUB یک Boot Loader است با قابلیت Boot کردن چندین سیستم عامل بصورت همزمان که حتی می تواند ویندوز را نیز در کنار لینوکس Boot کند. اگر شما در صفحه انتخاب سیستم عامل هیچ گزینه را انتخاب نکنید . GRUB بصورت خودکار سیستم عامل پیشفرض را انتخاب و آن را Boot می کند.

قبلا بصورت مفصل در خصوص مراحلی که در Boot شدن GRUB انجام می شود مقاله ای نوشته ایم که می توانید به آن مراجعه کنید ، تمامی تنظیمات مربوط به GRUB در فایل تنظیمات آن یا GRUB Configuration File در لینوکس وجود دارد که معمولا در مسیر etc//grub.conf// وجود دارد. GRUB محتوی فایل های Image مربوط به سیستم عامل ها و initrd است و وظیفه اصلی آن نیز اجرا و Load کردن همین Image ها است. در ادامه نمونه ای از فایل grub.conf موجود در سیستم عامل لینوکس RedHat را مشاهده می کنید :

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-194.26.1.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-194.26.1.el5 ro root=/dev/VolGroup00/root clocksource=acpi_pm divisor=10
        initrd /initrd-2.6.18-194.26.1.el5.img
title Red Hat Enterprise Linux Server (2.6.18-194.11.4.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-194.11.4.el5 ro root=/dev/VolGroup00/root clocksource=acpi_pm divisor=10
        initrd /initrd-2.6.18-194.11.4.el5.img
title Red Hat Enterprise Linux Server (2.6.18-194.11.3.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-194.11.3.el5 ro root=/dev/VolGroup00/root clocksource=acpi_pm divisor=10
        initrd /initrd-2.6.18-194.11.3.el5.img 

تا اینجای کار هنوز هیچ قسمتی از سیستم عامل لینوکس فعال نشده است ، در واقع همه فرآیندی که مربوط به سیستم عامل می شود در مرحله بعدی انجام می شود که GRUB کارهای خود را انجام می دهد و نوبت به Kernel سیستم عامل لینوکس می رسد که توسط GRUB در حافظه RAM سیستم Load شده است . در ادامه در خصوص ادامه مراحل که Load شدن Kernel و همچنین فرآیند Init است توضیحاتی را ارائه خواهیم کرد.

مرحله چهارم Boot سیستم عامل لینوکس – Kernel

همانطور که قبلا هم در توسینسو در خصوص تفاوت های Kernel و Operating System و همچنین تفاوت های Kernel و Shell مطالبی نوشته ایم قطعا شما به این موضوع پی برده اید که در واقع Kernel یا هسته یک سیستم عامل قلب تپنده سیستم عامل شما است و تمامی فرآیندهای سیستم عامل شما را این Kernel است که مدیریت می کند.

در مرحله قبلی که در مقاله قبلی به آن پرداختیم GRUB به جایی رسید که Image های مربوط به Kernel و initrd را به داخل حافظه RAM سیستم Load کرد و از این مرحله به بعد همگی کارها بر عهده Kernel می باشد. Kernel به محض Load شدن تنظیمات مربوط به حافظه RAM اختصاص یافته به سیستم

و همچنین پیکربندی کلیه سخت افزارهای سیستم را انجام می دهد سپس image مربوط به initrd را از حالت فشرده خارج می کند ، در حالت پیشفرض این image در حالت فشرده به شکل zlib یا zImage قرار گرفته است بعد از اینکه از حالت فشرده خارج کرد با mount کردن آن درایورهای ضروری را Load می کند.

 

فرآیند Boot سیستم عامل لینوکس چگونه انجام می شود

Load کردن و Unload کردن ماژول های Kernel سیستم عامل لینوکس با استفاده از برنامه هایی به نام insmod و rmmod انجام می شود که در initrd image قرار گرفته اند. سپس Kernel به دنبال هارد دیسک می رود و بررسی می کند که در حالت LVM قرار دارند و یا اینکه RAID شده اند. سپس initrd را Unmount می کند

و فضای اختصاص یافته توسط این Image را نیز خالی می کند. سپس Kernel پارتیشن ریشه یا root partition ای که در فایل grub.conf وجود دارد را در حالت فقط خواندنی یا read only به سیستم Mount می کند و در نهایت فرآیند init را اجرا می کند. توجه کنید که Kernel تا زمانیکه سیستم شما خاموش نشده باشد بر روی حافظه RAM شما باقی می ماند.

 

کاربرد init در لینوکس

مرحله پنجم Boot سیستم عامل لینوکس - init process

اگر دقت کرده باشید بعد از اینکه از صفحه انتخاب سیستم عامل GRUB عبور کردید به یکباره یک سری خطوط به شما نمایش داده می شود و در کنار آنها بعضا کلماتی مثل OK و Failed را مشاهده می کنید که به سرعت از جلوی چشم شما عبور می کند ، انگار که سیستم در حال Start کردن سرویس های لازم جهت اجرای سیستم عامل باشد.

این دقیقا درست است ، به محض اینکه Kernel شما Load شد یک فرآیند یا Process به نام init توسط Kernel اجرا می شود که اولین Process ای است که توسط Kernel اجرا می شود. init مخفف کلمه initialization است که در ترجمه فارسی به معنی مقدار دهی اولیه است اما شما در اینجا از init به عنوان پردازشی یاد کنید که همه پردازش های دیگر مورد نیاز سیستم عامل را فراخوانی و اجرا می کند.

زمانیکه init اجرا شد به عنوان فرآیند والد یا Parent Process یا فرآیند جد بزرگوار ( باور کنید ترجمه Grandparent Process همین میشه دیگه D: ) در سیستم عامل لینوکس در نظر گرفته می شود. اولین کاری که init انجام می دهد این است که محتویات فایل تنظیمات خودش یا initialization file ای که در مسیر etc//inittab// وجود دارد را بخواند.

محتویات این فایل به init می گوید که یک اسکریپت تنظیمات اولیه محیطی یا environment configuration script را اجرا کند که در این اسکریپت تعیین مسیرها یا path ها ، فرآیند Swapping ، بررسی فایل سیستم و ... انجام می شود. تقریبا می توان گفت اجرای این اسکریپت هر چیزی که سیستم شما نیاز دارد تا فرآیند مقداردهی اولیه یا همان initialization را انجام دهد را شامل می شود ، حتی تعیین کردن ساعت سیستم ، پورت های سریال و ... همه م همه در این مرحله انجام می شود.

منظور از run level در سیستم عامل لینوکس چیست ؟

Init همچنان به خواندن فایل etc//inittab// ادامه می دهد ، در ادمه این فایل به init گفته می شود که سیستم قرار است چگونه در هر run level پیکربندی شود و همچنین run level پیشفرض را نیز تنظیم می کند. Run level در واقع پیکربندی فرآیند ها یا پردازش های موجود در سیستم است.

تمامی سیستم عامل های خانوانده Unix توانایی این را دارند که با پیکربندی های پردازشی مختلف اجرا شوند برای مثال ما می توانیم به سیستم عامل لینوکس بگوییم که در حالت تک کاربره یاsingle user mode اجرا شود که در این حالت اگر init اجرا شود ما می گوییم init در run level 1 اجرا شده است ، در زبان دیگر به run level ای که single user mode است run level S نیز گفته می شود.

در این حالت ( Single User Mode ) فقط مدیر سیستم می تواند به سیستم متصل شود. معمولا زمانی از چنین run level ای استفاده می شود که می خواهیم وظایف نگهداری سیستم یا maintenance task های سیستم را بدون ریسک تخریب سیستم یا داده های کاربران انجام دهیم.

طبیعتا در چنین run level ای ما نمی خواهیم هیچگونه سرویسی به کاربران ارائه دهیم و سرویس های کاربری معمولا در این run level غیرفعال یا Disable هستند. Run Level دیگری که استفاده می شود به نام reboot run level شناخته می شود یا run level 6 که وظیفه آن shutdown کردن همه سرویس ها و دستورالعمل های وابسته به آن و همچنین restart کردن سیستم است. همانطور که در مثال زیر مشاهده می کنید شما می توانید با استفاده از دستور who متوجه شوید که در چه run level ای قرار دارید :

root@itpro-kali:~$ who -r
	run-level 2 2015-11-17 09:52		last=S

در ادامه در خصوص run level ها مختلفی که در لینوکس وجود دارند بیشتر صحبت خواهیم کرد این ویژگی ITPRO است. بعد از اینکه run level پیشفرض برای سیستم در نظر گرفته شد ، init با توجه به محتویات دایرکتوری rc ای که به run level مربوطه اختصاص یافته است تمامی پردازش ها یا Process های پس زمینه ای که برای اجرا شدن سیستم مورد نیاز هستند را اجرا می کند.

Init هر کدام از اسکریپت های kill را که با حرف K شروع می شوند را با یک پارامتر stop اجرا می کند و سپس تمامی اسکریپت های Start را که با S شروع می شوند را اجرا می کند و سرویس ها و برنامه های کاربردی که در run level مربوطه وجود خواهند داشت را اجرا خواهد کرد.

نکته جالب در خصوص این اسکریپت ها این است که همانند سرویس های ویندوز شما می توانید آنها را بعد از وارد شدن به سیستم عامل لینوکس بصورت دستی نیز stop و یا start کنید ، اینکا براحتی با استفاده از دستور service httpd stop یا service httpd start در مسیر etc//init.d//httpd// قابل اجرا است

البته دقت کنید که در این مثال ما سرویس httpd را مثال زدیم ، شما می توانید هر سرویس دیگری را به همین شکل start یا stop کنید فقط فراموش نکنید که برای انجام اینکار حتما با کاربر root بایستی وارد سیستم شوید.توجه کنید که در زمان startup سیستم دور اسکریپت rc2.d و rc3.d معمولا اجرا می شوند.

در این حالت هیچ سرویسی در حالت stopped قرار نمی گیرد یا حداقل می توان گفت بصورت دائمی در حالت stopped قرار نمی گیرد. هیچکدام از اسکریپت هایی که در پوشه etc//rc<x>.d// قرار گرفته اند سرویس ها را stop یا start نمی کنند. در عوض تمامی فایل هایی که در پوشه etc//rc<x>.d// قرار گرفته اند به عنوان یک لینک عمل می کنند که به اسکریپت هایی که در پوشه etc//init.d// قرار گرفته اند اشاره می کنند.

در این حالت به اینگونه لینک ها symbolic link گفته می شود ، یک symbolic link چیزی بیشتر از یک فایل که به یک فایل دیگر اشاره می کند نیست و زمانی استفاده می شود که شما می خواهید بدون ایجاد کردن و یا حذف کردن یک فایل اسکریپت آن را اجرا کنید و سرویس ها را start و یا stop کنید. در نهایت در این قسمت اسکریپت های مربوط به run level مورد نظرتان انتخاب و اجرا خواهند شد و سیستم به سراغ مرحله بعدی می رود.لیست run level های مختلف در سیستم عامل لینوکس را می توانید در زیر با مشخصات آنها مشاهده کنید :

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault: 

 

معرفی run level های لینوکس

مرحله ششم Boot سیستم عامل لینوکس - Run Level

همانطور که در مرحله قبل مشاهده کردید در فرآیند init یک run level انتخاب می شود که بر حسب انتخابی که انجام می شود یک سری اسکریپت از پوشه های مورد نظر اجرا می شوند . startup script های مربوط به init در پوشه etc//rc.d// قرار گرفته اند اما اسکریپت هایی که برای run level ها استفاده می شوند

در subdirectory هایی به شکل etc//rc.d//rc0.d// تا etc//rc.d//rc6.d// بر اساس انتخاب init از بین run level های 0 تا 6 اجرا می شوند. در آخر نیز init هر چیزی که در پوشه etc//rc.d//rc.local// پیدار می کند را فارق از اینکه در چه run level ای کار می کند اجرا خواهد کرد. در زیر پوشه های مربوط به انواع run level script لیست شده است که متناسب با run level انتخاب شده در init اجرا خواهند شد.

Runlevel  Directory
0 /etc/rc.d/rc0.d
1 /etc/rc.d/rc1.d
2 /etc/rc.d/rc2.d
3 /etc/rc.d/rc3.d
4 /etc/rc.d/rc4.d
5 /etc/rc.d/rc5.d
6 /etc/rc.d/rc6.d 

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


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

هکر کلاه سفید ، کارشناس امنیت اطلاعات و ارتباطات

هکر کلاه سفید ، کارشناس امنیت اطلاعات و ارتباطات و کشف جرائم رایانه ای ، بیش از 12 هزار ساعت سابقه تدریس در بیش از 40 سازمان دولتی ، خصوصی و نظامی ، علاقه مند به یادگیری بیشتر و عاشق محیط زیست ، عضو کوچکی از مجموعه توسینسو

22 بهمن 1393 این مطلب را ارسال کرده

نظرات