امروز می خواهیم به برسی بوت در لینوکس (Boot Process) بپردازیم، میخواهیم برسی کنیم از وقتی که شما دکمه پاور سیستم را میزنید تا وقتی که سیستم آماده کار کردن می شود چه مراحلی را طی می کند.
در شکل زیر سعی شده تقریبا تمام مراحل بوت در لینوکس را نمایش دهیم:
بعد از زمانی که سیستم را روشن می کنیم (Power ON) وارد مرحله بایوس (BIOS) یا Basic Input/Output System می شویم که سخت افزار های سیستم را برسی و همچین مموری سیستم را نیز تست می کنید.
بایوس یا سامانه ورودی/خروجی پایه به مجموعهای از رویهها یا برنامههای ذخیره شده در تراشه حافظه فقط خواندنی یا «رام» ROM در رایانههای شخصی گفته میشود. این برنامهها همه عملکردهای ورودی/خروجی را اداره میکنند. وجود این برنامهها در رایانه موجب میشود که برنامههای کاربردی بهطور مستقیم برای کنترل سختافزار، برنامه نداشته باشند و از سرویسهای رایانه استفاده کنند. بایوس یک رایانه، نخستین کدی است که هنگام روشن کردن آن اجرا میشود و وظیفه ابتدایی آن بارگذاری و آغاز کردن سیستم عامل است. وقتی رایانه روشن میشود، نخستین کار بایوس، تشخیص قطعات سیستم مانند کارت گرافیکی، صفحه کلید و موشواره، دیسک سخت، دیسکگردانهای نوری و سایر سخت افزارهاست.
اصطلاح BIOS (پایههای ورودی / خروجی سیستم) توسط Gary Kildall برای اولین بار اختراع شده بود و در سیستم عامل CP/M در سال ۱۹۷۶ ظاهر شد، به این مرحله POST یا Power On Self Test نیز گفته می شود.
boot loader اولین برنامه ای است که در هنگان روشن شدن کامپیوتر (بوت شدن لینوکس) اجرا می شود. مسئولیت boot loader بارکردن و انتقال کنترل به کرنل سیستم عامل می باشد. پس از اینکه کرنل کنترل سیستم را به دست گرفت، سایر قسمتهای باقی مانده سیستم عامل را بارگذاری و اجرا می کند.
boot loader بر روی Master Boot Record ذخیره می شود. خب حالا سئوال دوتا شد؟ این MBR دیگه چیه؟
MBR یک بوت سکتور ۵۱۲ بایتی است که در ابتدای هارد دیسک قرار دارد.
boot loader در واقع شامل یکسری درایورهای بسیار ساده برای شناختن فایل سیستم است. البته منظور در این مرحله تنها شناخت فایل سیستم منطقه ای است که در آن kernel image و initRD image ذخیره شده است.
لینوکس ها در گذشته از ابزای به نام lilo برای boot loader استفاده می کردند. اما با ظهور Grub این ابزار جایگزین lilo شد. هم اکنون اکثر توزیع های لینوکس از Grub استفاده می کنند.
حالا اصلا خود کرنل چیست؟ کرنل چی کار میکنه؟کرنل چه نقشی در بوت در لینوکس دارد؟ Kernel در فارسی به معنی هسته میباشد. هسته یک سیستم عامل را میتوان هسته مرکزی اصلی سیستم عامل نامید. کرنل مدیریت و کنترل تمام منابع سخت افزاری، سیستم عامل و نرم افزار ها را بر عهده دارد. کرنل را میتوان واسط کاربری مابین نرم افزارهای اجرا شده در سیستم عامل و سخت افزار کامپیوتر در نظر گرفت.
هر برنامه ای در سیستم عامل به هنگام اجرا نیاز به منابع سخت افزاری دارد. به هنگام اجرای یک برنامه درخواست منابع مورد نیاز به کرنل ارسال میگردد که البته این درخواست بصورت مستقیم توسط خود برنامه ارسال نمیگردد و از طریق واسط سیستم عامل به کرنل ارسال میگردد. پس از تخصیص منابع توسط سیستم عامل و کرنل، برنامه اجرا میگردد. در عمل این درخواست System Call نامیده میشود.
دسترسی به منابع سخت افزاری بصورت مستقیم فقط توسط کرنل امکان پذیر میباشد. بنابراین برخی از دسترسی های کرنل را میتوان اجرای درخواست پردازش و صف دستورات اجرایی CPU و یا ایجاد دسترسی تصادفی و آدرسی دهی به برنامه های اجرا شده در RAM، یا ذخیره سازی اطلاعات در دیسک نام برد.
با توجه به اینکه کرنل لایه بعد از اسمبلر یا زمان ماشین میباشد، حتی درخواست منابع توسط خود سیستم عامل نیز توسط کرنل بررسی و ایجاد میگردد. هنگام اجرای عملیات اپلیکیشن ها یا سیستم عامل، تمامی دستورات توسط اسمبلر ها به زبان ماشین تبدیل میگردد تا توسط سخت افزار کامپیوتر قابل درک باشد.
همچنین زمانی که اطلاعاتی توسط ورودی های سخت افزاری، قصد انتقال به سیستم عامل را دارند؛ ابتدا به کرنل ارسال و سپس توسط کرنل به برنامه مد نظر تحویل میگردد.
بطور کل میتوان اینطور هسته سیستم عامل را مطرح نمود که کرنل، واسط کامل میان سخت افزار و سیستم عامل میباشد که تمامی مدیریت ها، کنترل ها و … توسط هسته انجام میگیرد.
init چیست؟
init در زمان بوت لینوکس چه نقشی دارد؟ در لینوکس، init یک مخفف برای مقداردهی اولیه است. init یک پروسه سرویس است که به محض استارت کامپیوتر شروع می شود و اجرای آن تا خاموش شدن کامپیوتر ادامه دارد. در حقیقت init اولین پروسه ای است که موقع بوت شدن کامپیوتر آغاز می شود، آن را سرچشمه تمامی دیگر پروسه های در حال اجرای مستقیم و غیر مستقیم می کند و از این رو به طور معمول“pid=1“ به آن اختصاص داده شده است.
اگر به نحوی سرویس init نتوانست شروع شود، هیچ پروسه ای آغاز نمی شود و سیستم به مرحله ای به نام “Kernel Panic“ می رسد. init رایج ترین مرجع برای System V init است. System V اولین سیستم عامل یونیکس تجاری است که طراحی شد و کاربردهای init در بسیاری از توزیع های لینوکس امروزی مشابه سیستم عامل System V است با مورد استثنایی همچون Slackware با استفاده از BSD-style و Gentoo با استفاده از custom init.
مدل SysV
سیستم ۵ در فایل /etc/inittab به دنبال ورودی ::initdefault:: میگردد که به init میگوید سطح اجرایی پیشفرضی وجود دارد یا نه. اگر سطح اجرایی پیشفرضی نباشد کاربر در یک کنسول سیستمی قرار داده میشود که در آن باید سطح اجرایی را به طور دستی وارد کرد.
سطوح اجرایی
سطوح اجرایی در سیستم ۵ وضعیتهای خاصی از دستگاه را ترسیم میکنند که با پروسههایی که باید اجرا شوند تعیین میشوند. عموماً ۸ سطح اجرایی وجود دارد: سطح اجرایی ۰ تا ۶ و S یا s که هر دو نام مستعار یک سطح اجرایی هستند. از این هشت تا، ۳ تاشان سطوح اجرایی به اصطلاح «رزرو شده» هستند:
- ۰: توقف و خاموشی
- ۱: مد تککاربره
- ۶: راهاندازی مجدد (ریبوت)
جدای از سطوح اجرایی ۰ و ۱ و ۶ هر سیستم یونیکس و مبتنی بر یونیکسی با سطوح اجرایی اندکی متفاوت برخورد میکند. حداقل مشترک در همهٔ این سیستمها فایل /etc/inittab است؛ که تعیین میکند هر سطح اجرایی چه کاری انجام میدهد (اگر اصلاً آن سطح اجرایی کاری انجام دهد).
سطوح اجرایی پیشفرض
سیستم عامل | سطح اجرایی پیشفرض |
---|---|
AIX | ۲ |
آرچلینوکس | ۳ |
سنتاواس | ۳ یا ۵ |
دبیان | 2 |
جنتو لینوکس | 3 |
HP-UX | ۳ |
اواس ده | ۳ |
مندریوا لینوکس | ۵ |
لینوکس ردهت / فدورا | ۳ یا ۵ |
اسلکور | ۳ |
سولاریس | ۳ |
لینوکس سوزه | ۵ |
ابونتو (سرور و رومیزی) | ۲ |
لزوم جایگزینی init با چیزی کامل تر، از مدت ها احساس می شد و جایگزین های مختلفی مرحله به مرحله توسعه داده شد، که برخی جایگزین native init توزیع شدند، بعضی از آنها عبارتند از :
- Upstart : یک سرویس جایگزین init که در اوبونتو گنو/لینوکس اجرا شد و برای شروع پروسه غیر همزمان طراحی شده است.
- Epoch : یک سرویس جایگزین init که از همه طرف سادگی و مدیریت سرویس ایجاد کرده، این برای شروع پروسه تک نخی طراحی شده است.
- Mudar : یک سرویس جایگزین init که به زبان پایتون نوشته شده است، در پاردوس گنو/لینوکس اجرا شده و برای شروع پروسه های غیر همزمان طراحی شده است.
- Systemd : یک سرویس جایگزین init که برای شروع پروسه های موازی طراحی شده و در تعدادی از توزیع های استاندارد (Fedora, OpenSuSE, Arch, RHEL, CentOS وغیره) اجرا شده است.
Systemd چیست؟
Systemd در زمان بوت لینوکس چه نقشی دارد؟ Systemd یک سرویس مدیریت سیستم است که توسط مجمع یونیکس برای افزودن ‘d‘ در پایان سرویس نام گذاری شده است. بنابراین می توانند به راحتی تشخیص داده شوند. در ابتدا تحت لایسنس عمومی همگانی گنو GNU منتشر شد، اما اکنون نسخه ها تحت لایسنس GNU Lesser General Public License ساخته می شوند. شبیه به init، systemd نیز سرچشمه همه پروسه های مستقیم و غیر مستقیم دیگری است که هنگام بوت آغاز می شوند از این رو معمولا “pid=1“ به آن اختصاص داده شده است.
systemd، ممکن است با تمام پکیج ها، سرویس ها و کتابخانه های پیرامون سرویس ارتباط داشته باشد. Systemd برای غلبه بر کاستی های init طراحی شده است. این به خودی خود یک پیش زمینه برای پروسه هایی است که برای شروع فرآیندها به طور موازی، طراحی شده است، در نتیجه زمان بوت و overhead محاسباتی کاهش می یابد. Systemd دارای ویژگی های بسیار دیگری می باشد که قابل مقایسه با init است.
چرا init باید تعویض شود؟
پروسه init به راحتی آغاز می شود، یک task درست بلافاصله بعد از آخرین task ای که با موفقیت در startup است، شروع می شود و در حافظه لود می گردد. این اغلب به تاخیر و طولانی شدن مدت زمان بوت، منجر می شود. با این حال، systemd برای سرعت بخشیدن به انجام کارها به طور منظم طراحی نشده است که از تمام تاخیرهای غیرضروری اجتناب کند.
ویژگی های systemd
- شفاف، stateforward و طراحی کارآمد
- پروسه بوت ساده تر
- پردازش همزمان و موازی در هنگام بوت
- API بهتر
- نحو واحد ساده
- قابلیت حذف اجزای اختیاری
- رد پاهای حافظه کم
- تکنیک بهبود یافته برای بیان نیازمندی ها
- آموزش اولیه نوشته شده در فایل کانفیگ و نه در in shell script
- ایجاد امکان استفاده از سوکت دامنه یونیکس
- برنامه ریزی شغلی با استفاده از تایمرهای تقویم systemd
- رویداد لاگین با journald
- انتخاب رویدادهای سیستم لاگین با systemd و همچنین syslog
- لاگ ها در فایل باینری ذخیره می شوند
- حالت systemd می تواند حفظ شود تا در آینده به آن رجوع شود
- پروسه Track با استفاده از cgroup کرنل و نه PID
- لاگین کاربرها توسط systemd-logind
- تلفیق بهتر با Gnome برای
تنگناهای systemd
- همه چیز در یک جا
- نبود استاندارد POSIX
ادغام Systemd و Distro
توزیع لینکس | ادغام |
Fedora | بله، اولین توزیع برای |
Arch | بله |
RedHat | بله |
CentOS | بله |
Debian | بله، Debian 8 با اسم رمز Jessie به طور پیش فرض system را خواهد داشت |
Gentoo | بله، اما لازم است دانلود شود، نصب و کانفیگ side با custom init |
OpenSUSE | بله |
Slack | نه (اگرچه هنوز تا کنون درslackware اتخاذ نشده است، اما چه اتخاذ بشود چه نشود Patric Volkerding هیچ علامتی را نشان نمی دهد) |
Ubuntu | بله، لازم است تا با Upstream نصب و کانفیگ شود. |
مناظره
Linus Torvalds، معمار ارشد کرنل لینوکس، به شیوه توسعه دهنده اصلی نسبت به کاربران معتقد است و گزارش های باگ، خوب به نظر نمی رسد. همچنین گزارش شده است که فلسفه systemd، روش عجیب و ناآشنایی برای پروسه سیستم کنترل است. همانطور که از روی Patric Volkerding ثبت شده است و قابل توجه کاربران و توسعه دهندگان لینوکس و همچنین گاهی اوقات فروم های آنلاین، می باشد.
Systemd در مقایسه با init
systemd | init | Features |
Yes | No | DBus Dependency – Mandatory |
Yes | No | Device based Activation |
Yes | No | Device dependency configuration with udev |
Proprietary | Cron/at | Timer based Activation |
Yes | No | Quota Management |
Yes | No | Automatic Service Dependency Handling |
Yes | No | Kills users Process at logout |
Yes | No | Swap Management |
Yes | No | SELinux integration |
Yes | No | Support for Encrypted HDD |
Yes | No | Static kernle module loading |
Yes | No | GUI |
Yes | No | List all the child processes |
Yes | Yes | Sysv compatible |
Yes | No | Interactive booting |
No | Yes | Portable to non x86 |
Several Distro | Several Distro | Adopted on |
Yes | No | Parallel service startup |
Yes | No | Resource limit per service |
No | Yes | Easy extensible startup script |
No | Yes | Separate Code and Configuration File |
Yes | No | Automatic dependency calculation |
No | Yes | Verbose debug |
V44+ | N/A | Version |
N/A | 560 KB | Size |
900 files + glib + DBus | 75 files | Number of Files |
224000 (Approx) (inc Codes, comments and white space) 125000 (Approx) (acctual code) | 15000 (Approx) | Lines of code – LOC |
هیچ چیز در حال اجرایی که pid=1 است نباید شکست بخورد، نباید آشفته باشد و می بایست کاربران به طور موثر و کارآمد آن را کنترل کنند. بسیاری از کاربران بر این باورند که جایگزینی init با systemd چیزی بیش از دوباره کاری چرخه زمان به عنوان تاثی جانبی لینوکس نیست. اما این ماهیت متنوع لینوکس است. به این دلیل است که لینوکس بسیار قدرتمند است. تغییر خوب است و اگر به دلیل خوبی انجام می شود باید آن را درک کنیم.
شل در لینوکس چیست؟