هر روز بارها کامپیوترمان را روشن کرده و برای چند ثانیه تا چند دقیقه شاهد بوت شدن سیستم عامل روی آن هستیم، اما تاکنون از خودمان سؤال کرده ایم در پس این بوت شدن چه اتفاقی می افتد تا سیستم عامل آماده اجرای دستورات شود؟ فرآیند بوت( Bootstrapping)چیست و شامل چه مراحل و پروسه هایی است؟ تفاوت فرآیند بوت در سیستم عامل های مختلف چیست؟ چرا یک سیستم عامل در چند ثانیه و دیگری در چند دقیقه بوت می شود؟ کاربران لینوکس در هر بار روشن کردن کامپیوتر شاهد چندین ده خط هستند که پشت سر هم روی صفحه نمایش ظاهر شده و رد می شوند؛ بدون این که بدانند این خطوط چه می گویند.در این شماره می خواهیم به سراغ فرآیند بوت لینوکس برویم و از چند و چون آن مطلع شویم!
مراحل بوت
در لینوکس فرآیند بوت در چندین مرحله صورت می گیرد یا دست کم می توانیم فرآیند بوت را به چندین مرحله مجزا کنیم که درک و تصور بهتری از آن داشته باشیم.در تصویر 1 مراحل بوت لینوکس به صورت کلی ترسیم شده است .هنگامی که برای اولین بار کامپیوتر روشن یا ریستارت می شود، یک سری کد اجرایی از روی حافظه ROM یا دستگاه های ذخیره سازی دیگر مانند حافظه فلش فراخوانی و اجرا می شود.اولین کاری که این کدها انجام می دهند، دستور دادن به CPU برای یافتن اولین دستگاه قابل بوت است.CPU با مراجعه به بایوس مادربورد، آدرس اولین دستگاه قابل بوت را فراخوانی کرده و به آنجا اشاره می کند.سپس محتویات اولین سکتور دستگاه قابل بوت یا MBR به حافظه منتقل می شود.اندازه MBR کمتر از 512 بایت و وظیفه آن اجرا کردن برنامه مدیریت بوت است.
در مرحله بعد برنامه مدیریت بوت به حافظه منتقل شده و شروع به اجرا شدن می کند .در این هنگام است که شما اولین صفحه بوت لینوکس را مشاهده خواهید کرد.برنامه مدیریت بوت به منتقل کردن فایل های بوت مربوط به هسته لینوکس و فایل های ریشه به درون حافظه اقدام می کند.این فایل ها در قالب یک فایل ایمیج هستند که هنگام انتقال به حافظه گشوده شده و به طور کامل در حافظه مستقر می شوند.از این زمان به بعد مدیریت بوت لینوکس برعهده برنامه مدیریت بوت( GRUB یا LILO)است.این برنامه سخت افزار سیستم، سخت افزارهای متصل به سیستم، متصل کردن پارتیشن ها به سیستم و اجرا کردن ماژول های موردنیاز هسته در حافظه را بررسی می کند.مرحله آخر فرآیند بوت متعلق به اجرای برنامه سطح کاربری یا همان رابط های کاربری است.پیش از این که به سراغ تشریح هریک از مراحل گفته شده برویم، به یک نکته اشاره کنم:همان طور که دیدید، سرعت بوت شدن سیستم عامل با اندازه حافظه سیستم و سرعت جا به جا کردن اطلاعات از روی ROM و هارددیسک به حافظه ارتباط مستقیمی دارد.
شروع به کار سیستم
این مرحله وابستگی شدیدی به سخت افزاری دارد که لینوکس روی آن نصب شده است.در سیستم های پیشرفته برای شروع به کار سیستم شامل روشن شدن یا ریستارت سیستم و روشن شدن صفحه نمایش از نرم افزارهای مخصوصی مانند U-Boot، RedBoot و Micromonitor استفاده می کنند، اما غالباً سیستم ها این مرحله را با روشن شدن صفحه نمایش شروع می کنند.سپس شناسایی اولیه سخت افزار و اجرا شدن بایوس مادربورد شروع می شود.در کامپیوترهای شخصی بوت لینوکس از آدرس 0xFFFF0 بایوس شروع می شود.اولین کار بایوس عملیات POST یا Power-on Self Test است که به شناسایی سخت افزار و بررسی آن می پردازد.بایوس پس از عملیات POST به سراغ شناسایی سخت افزارهای جدید و سخت افزارهای قابل بوت می رود.در این هنگام بایوس سرویس های جدید در حافظه را راه اندازی می کند.
یکی از مهم ترین سرویس هایی که باید در این لحظه اجرا شود، سرویس شناسایی سیستم عاملی است که برای کاربر در اولویت دار قرار دارد.ممکن است دستگاه های مختلفی مانند CD/DVD-ROM، فلاپی دیسک، حافظه فلش و هارددیسک روی سیستم نصب شده باشند.بایوس با استفاده از تنظیمات CMOS روی مادربورد به ترتیب دستگاه های قابل بوت را برای یافتن برنامه مدیریت بوت سیستم جست و جو می کند.اگر برنامه مدیریت بوت روی سایر دستگاه های قابل بوت وجود نداشته باشد، برنامه مدیریت بوت لینوکس از روی MBR(Master Boot Record)در حافظه اجرا می شود. MBR اولین سکتور روی اولین سیلندر و اولین هد هارد دیسک است که ظرفیت آن 512 بایت بیشتر نبوده و موجب اجرای برنامه مدیریت بوت می شود.در این مرحله بایوس، کنترل بوت سیستم را به عهده برنامه مدیریت بوت می سپارد.
اشاره:برای مشاهده محتویات MBR می توانید از دستورات dd و od به صورت زیر استفاده کنید. دستور dd می تواند 512 بایت اول روی dev/hda/ را بخواند یا درون فایل mbr.bin بنویسد.دستور od نیز محتویات فایل mbr.bin را به فرمت کدهای اسکی یا هگزادسیمال نمایش می دهد.توجه کنید، برای اجرای این دستورات به مجوز ریشه نیاز دارید:
dd if=/dev/hda of=mbr.bin bs=512 #
count=1
od -xa mbr.bin #
برنامه مدیریت بوت
برنامه مدیریت بوت که از روی MBR به درون حافظه منتقل و اجرا می شود، شامل جدول پارتیشن های سیستم و کدهای اجرایی خود برنامه است.همان طور که در تصویر 2 مشاهده می کنید، 446 بایت اول MBR متعلق به برنامه مدیریت بوت و پیغام های خطا است.جدول پارتیشن های سیستم نیز در یک فضای 64 بیتی ذخیره می شود.این جدول شامل چهار رکورد پارتیشن شانزده بایتی است.دو بایت انتهایی MBR نیز یک شماره مانند 0xAA55 برای محافظت و اعتبار سنجی محتویات روی MBR است.هر پارتیشن نیز به فیلدهایی تقسیم شده و شامل آدرس پارتیشن، اندازه پارتیشن، وضعیت پارتیشن، فرمت و اطلاعات ضروری دیگر است.برنامه مدیریت بوت در مرحله دوم، هسته لینوکس و فایل های مورد نیاز را در حافظه اجرا می کند.برنامه های مدیریت بوت در لینوکس LILO(Linux Loader) و GRUB(GRand Unifield Bootloader) نامیده می شوند.به این دلیل که LILO در مقایسه با GRUB دارای ضعف ها و کاستی هایی است، در این بخش به بررسی GRUB می پردازیم.مهم ترین تفاوت GRUB در مقایسه با LILO در استفاده از سیستم فایل لینوکس است. LILOبرنامه ای است که از روی ردیف هایی از سکتورهای هارددیسک اجرا می شود و بیشتر مبتنی بر اطلاعات ثابت ذخیره شده روی هارددیسک است، اما GRUB از سیستم فایل لینوکس( Ext3/Ext2)برای اجرای هسته سیستم عامل بهره می برد.نمونه ای از فایل پیکربندی LILO را در تصویر 3 مشاهده می کنید.
GRUB شامل سه مرحله است:مرحله اول بوت از روی سکتور MBR به درون حافظه است، مرحله دوم شامل کسب اطلاعاتی از وضعیت پارتیشن ها و فایل سیستم لینوکس برای اجرای هسته لینوکس است.این مرحله شامل اجرای فایل هایی مانند reiserfs_stage 1_5 از روی ژورنالینگ فایل سیستم و e2fs_stage 1_5 از روی سیستم فایل های Ext2 و Ext3 است. عدد 1/5 در نام این دو فایل به معنای مرحله 1/5 و میان مرحله 1و 2 است.
مرحله سوم نیز اجرای هسته لینوکس و نمایش فهرستی از هسته ها از روی فایل های etc/grub.conf/ و etc/grub/menu.lst/ است( تصویر4).در این مرحله است که شما رابط GRUB را دیده و می توانید یکی از انواع سیستم عامل ها با هسته های مختلف و حتی سیستم عامل لینوکس را برای اجرا انتخاب کنید.رابط GRUB گرافیکی است، اما می توانید به رابط خط فرمان این برنامه نیز سوییچ کرده و دستورات خط فرمان مانند دستورات تعمیر GRUB یا انتخاب یک هسته خاص را وارد و اجرا کنید.
اشاره:دایرکتوری boot/grub/ شامل اطلاعات و فایل های سه مرحله گفته شده در بالا است.شما می توانید به راحتی با ویرایش فایل ها در این دایرکتوری کارهای جالبی را انجام دهید.برای نمونه اطلاعات مربوط به CD-ROM در فایل iso9660_stage_1_5 است.
هسته لینوکس
هنگامی که تصویر هسته لینوکس درون حافظه قرار گرفته و اجرا می شود، لینوکس شروع به کار کرده و مدیریت بوت از دست GRUB خارج می شود.البته استفاده از لفظ « اجرای هسته لینوکس»در این مرحله کاملاً صحیح نیست، زیرا عملاً هسته اجرا نمی شود، بلکه از حالت فشرده خارج شده و چند سرویس محدود مانند سرویس های مرتبط با سخت افزار در حافظه اجرا می شوند.ایمیج هسته لینوکس اگر کمتر از 512 کیلوبایت باشد به آن zImage و اگر بیشتر از این مقدار باشد، bzImage گفته می شود.فایل های ایمیج هسته با استفاده از ابزار zlib فشرده سازی و گشوده می شوند.پس از قرارگیری کامل ایمیج هسته درون حافظه، هسته لینوکس شروع به اجرای چند تابع مهم می کند.
تصویر 5 مهم ترین توابعی را که اجرا و فراخوانی می شوند به همراه نام فایل تابع نشان می دهد.اولین تابع، start است که با اجرای فایل arch/i386/boot/compressed/head.S/ .فراخوانی می شود.این تابع نیز کارهایی مانند اختصاص فضا به متغیرهای پشته( Stack)و پاک کردن BSS(Block Started by Symbol)را انجام می دهد.
تابع سوم به نام decompress_kernel فایل arch/i386/boot/compressed/misc.c/ .اجرا می شود که هسته لینوکس را به طور کامل درون حافظه بازگشایی می کند. توابع دیگر مربوط به فراخوانی هسته، شروع به کار هسته و ارتباط دهی هسته با پردازنده سیستم و آماده بودن پردازنده برای اجرای فرامین است که از تشریح آن ها خودداری می کنیم.
هنگام بوت شدن هسته، پروسه initrd که در مرحله دوم اجرای برنامه مدیریت بوت به درون حافظه انتقال یافته است، فعال می شود.این پروسه یک فایل سیستم ریشه موقت را درون حافظه به وجود می آورد که امکان بوت هسته لینوکس را بدون نیاز به هیچ دسترسی فیزیکی به هارددیسک و بالا بردن سرعت عمل بیشتر هسته فراهم می کند.هنگامی که هسته لینوکس به طور کامل اجرا می شود، این پروسه اصطلاحاً unmount شده و سیستم فایل حقیقی به هسته متصل می شود.در حقیقت پروسه initrd امکان ایجاد یک هسته لینوکس کوچک و فشرده شده را فراهم می کند که به این وسیله می توان لینوکس را به راحتی اجرا یا روی سیستم های دیگر بدون وابستگی به هارد دیسک منتقل کرد.
اشاره:برای اجرای یک هسته خاص لینوکس با استفاده از خط فرمان GRUB به صورت زیر عمل کنید.اگر نام نسخه هسته را نمی دانید، علامت « /» را تایپ و کلید TAB را فشار دهید. GRUB فهرستی از نسخه های هسته موجود و فایل های ایمیج initrd را به شما نمایش خواهد داد:
grub>kernel/bzImage-2.6.14.2
[Linux-bzImage,setup=ox1400,size=0x29672e]
grub>initrd/initrd-2.6.14.2.img
[Linux-initrd @ ox5f13000,0xcc199 bytes]
grub>boot
Uncompressing Linux...Ok,booting the kernel.
سطوح اجرایی لینوکس
پس از اجرای کامل هسته لینوکس، برنامه سطح کاربری یا همان محیط گرافیکی اجرا می شود.این برنامه اولین نرم افزاری است که به وسیله کامپایلر و توابع کتابخانه ای زبان سی اجرا می شود.در محیط گرافیکی دسکتاپ اولین پروسه sbin/init/ است که اجرا می شود.مهم ترین وظیفه پروسه init تعیین نوع اجرای لینوکس یا تعیین سطح اجرایی کاربری لینوکس ( RunLevel)است که شما آن را روی صفحه نمایش می بینید.به طور کلی، لینوکس می تواند در هفت سطح اجرا شود.این سطوح کارهای زیر را انجام می دهند:
سطح 0:خاموش شدن سیستم
سطح 1:اجرای لینوکس در حالت تک کاربره
سطح 2:اجرای لینوکس در حالت چند کاربره بدون دسترسی به شبکه
سطح 3:اجرای لینوکس در حالت چند کاربره با دسترسی به شبکه
سطح 4:غیرقابل استفاده
سطح 5:اجرای لینوکس در حالت چند کاربره با شبکه و xdm
سطح 6:ریستارت سیستم
معمولاً لینوکس به صورت پیش فرض روی سطح اجرایی سه یا پنج تنظیم شده است، اما می توان این وضعیت را تغییر داد.برای تعیین نوع سطح اجرایی لینوکس می توان به فایل پیکربندی etc/inittab/ مراجعه کرد.
لینوکس یکی از پیشرفته ترین برنامه های بوت را دارد.در پروسه بوت، کارایی در کنار استفاده از کمترین منابع سخت افزاری و بالا بردن سرعت همراه با انعطاف پذیری منظور شده است.برنامه بوت لینوکس قابلیت تشخیص و سازگاری با دیگر برنامه های بوت سیستم عامل ها را دارد، به طوری که می تواند چندین سیستم عامل روی یک هارد دیسک را تشخیص و پیکربندی کند.در مورد برنامه بوت لینوکس و پروسه های آن هنوز گفتنی های زیادی وجود دارد.ترفندهای بسیاری می توان با GRUB و دیگر فایل های بوت انجام داد که خود چندین مقاله مفصل را طلب می کند.امیدوارم که با خواندن این مقاله از فرآیند بوت لینوکس و آن خط هایی که پشت سر هم روی صفحه نمایش ظاهر می شوند، آگاهی پیدا کرده باشید!