پارامترهای Boot-Time در لینوکس – مقدمه جامع
وقتی شما یک سیستم لینوکس را روشن میکنید، اولین چیزی که اتفاق میافتد، فرآیند بوت (Boot Process) است. فرآیند بوت در لینوکس پیچیدهتر از سیستمعاملهایی مثل ویندوز است، چون لینوکس یک هسته (Kernel) دارد که مستقل از سختافزار طراحی شده و برای کارکرد صحیح نیاز به اطلاعات اضافهای دارد. این اطلاعات بهصورت «پارامترهای Boot-Time» یا همان Kernel Boot Parameters به هسته منتقل میشوند.
این پارامترها در واقع کلیدهایی هستند که به کرنل میگویند «چه کاری باید انجام دهد»، «چه سختافزاری را نادیده بگیرد»، «چطور فایلسیستم Root را بارگذاری کند» و حتی «سیستم در چه حالتی اجرا شود». بدون این پارامترها، کرنل نمیتواند بهدرستی راهاندازی شود یا ممکن است وارد حالت Kernel Panic شود.
🔹 Bootloader چیست؟
سیستمعامل لینوکس بهطور مستقیم از BIOS یا UEFI بوت نمیشود. در این میان یک ابزار واسطه وجود دارد که به آن Bootloader گفته میشود. Bootloader در واقع برنامهای است که هسته لینوکس را از روی دیسک سخت (یا شبکه یا CD و USB) بارگذاری کرده و همراه با آن پارامترهای Boot-Time را به کرنل منتقل میکند.
دو Bootloader معروف در لینوکس عبارتاند از:
- GNU GRUB
مخفف GNU GRand Unified Bootloader. این ابزار به شما اجازه میدهد چندین سیستمعامل یا چندین نسخه مختلف از کرنل لینوکس را بوت کنید. GRUB پیکربندی بسیار انعطافپذیری دارد و میتواند پارامترهای مختلف را به کرنل منتقل کند. - LILO
مخفف Linux Loader. یک بوتلودر قدیمیتر که سادهتر است و فایل پیکربندی آن بهصورت متن ساده نوشته میشود. LILO قابلیت بوت سیستمعاملهای مختلف مثل ویندوز، BSD و یونیکس را هم دارد، اما امروزه بیشتر جای خود را به GRUB داده است.
🔹 چرا پارامترهای Boot-Time مهم هستند؟
کرنل لینوکس برای اجرا به یکسری اطلاعات اولیه نیاز دارد. برای مثال:
- باید بداند Root Filesystem در کدام دیسک یا پارتیشن قرار دارد.
- باید بداند آیا باید Root را فقط خواندنی (Read-Only) یا قابلنوشتن (Read-Write) سوار کند.
- باید تصمیم بگیرد که سیستم در حالت Single User Mode (مناسب برای تعمیرات) اجرا شود یا در حالت چندکاربره.
- باید بداند مقدار حافظه سیستم چقدر است.
- یا مثلاً در سناریوهای خاص مثل بوت از شبکه (Netboot) باید آدرس سرور NFS را دریافت کند.
این اطلاعات همه از طریق پارامترهای Boot-Time به هسته داده میشوند.
🔹 شکل کلی پارامترها
پارامترهای Boot-Time معمولاً بهصورت زیر به هسته داده میشوند:
- بخش name یک کلید یا کلمه کلیدی است (مثلاً root, init, rw).
- بخش value مقداری است که به آن کلید نسبت داده میشود.
- هر کلید میتواند تا ۱۰ مقدار جدا شده با ویرگول داشته باشد.
مثال ساده
در این مثال:
- root=/dev/sda1 میگوید فایلسیستم Root روی پارتیشن /dev/sda1 قرار دارد.
- ro میگوید Root Filesystem در ابتدا فقط خواندنی باشد.
- init=/bin/bash میگوید بهجای اجرای /sbin/init، مستقیم Shell /bin/bash اجرا شود.
🔹 مراحل Boot در لینوکس
برای درک بهتر اینکه پارامترها کجا به کار میروند، باید مراحل Boot در لینوکس را بشناسیم:
- BIOS/UEFI Initialization
سیستم روشن میشود، سختافزارها تست میشوند (POST – Power On Self Test)، سپس BIOS/UEFI یک دستگاه بوت (مثل HDD، SSD، USB یا Network) را انتخاب میکند. - Load Bootloader
برنامه بوتلودر (GRUB یا LILO) از دستگاه انتخابشده اجرا میشود. - Bootloader Loads Kernel
Bootloader هسته لینوکس را از دیسک به حافظه بارگذاری میکند و پارامترهای Boot-Time را به آن تحویل میدهد. - Kernel Initialization
کرنل شروع به راهاندازی سختافزار و زیرسیستمهای اصلی میکند (CPU، حافظه، درایورها). - Execute init Process
کرنل در نهایت برنامه init (یا جایگزینهای مدرن مثل systemd) را اجرا میکند. از اینجا به بعد کنترل به فضای کاربر منتقل میشود.
🔹 چرا باید پارامترها را بشناسیم؟
شناخت این پارامترها برای مدیران سیستم (Sysadmins)، کاربران حرفهای لینوکس و حتی توسعهدهندگان ضروری است. چون در موقعیتهای زیر به کار میآیند:
- تعمیر سیستم در مواقعی که بوت نمیشود.
- اجرای سیستم در حالت امن (Safe Mode لینوکس معادل Single User Mode است).
- تست سختافزار یا نادیده گرفتن سختافزارهای معیوب.
- بوت سیستم از روی شبکه (Network Boot).
- افزایش امنیت (مثلاً محدود کردن دسترسی به کنسول).
🔹 نمونهای از جدول پارامترهای مهم
| پارامتر | توضیح | مثال |
|---|---|---|
| init | مسیر برنامه init یا Shell که باید اجرا شود. | init=/bin/bash |
| root | مسیر پارتیشن Root Filesystem | root=/dev/sda1 |
| single | اجرای سیستم در حالت تککاربره (Single User Mode) | single |
| ro | Mount کردن Root بهصورت Read-Only | ro |
| rw | Mount کردن Root بهصورت Read-Write | rw |
| mem | مقدار کل حافظه سیستم (RAM) | mem=2G |
| console | تعیین پورت کنسول سریال برای دیباگ یا مدیریت | console=ttyS0 |
توضیح تکبهتک پارامترها
در بخش قبل گفتیم که پارامترهای Boot-Time برای هسته لینوکس مثل «دستورالعملهای اولیه» هستند. در این بخش میخوایم تکتک مهمترین این پارامترها رو بررسی کنیم، با مثال توضیح بدیم، و کاربردهای عملی اونها رو در مدیریت سیستم نشون بدیم.
🔹 ۱. پارامتر init
این پارامتر مشخص میکنه که بعد از اتمام راهاندازی هسته، چه برنامهای باید بهعنوان اولین پروسه اجرا بشه. بهطور پیشفرض کرنل لینوکس برنامه /sbin/init یا در سیستمهای جدیدتر systemd رو اجرا میکنه.
مثالها:
🔸 اجرای حالت عادی (مدیریت سرویسها توسط init/systemd).
🔸 اجرای مستقیم یک Shell (برای مواقعی که سیستم خراب شده و نیاز به تعمیر دستی داریم).
کاربرد عملی: اگر فایلهای init خراب یا پاک بشن، سیستم بوت نمیشه. در این شرایط میتونیم init=/bin/bash بذاریم و بعد فایلهای خراب رو تعمیر کنیم.
🔹 ۲. پارامتر nfsaddrs
وقتی بخوایم سیستم لینوکس رو از طریق شبکه و با استفاده از NFS Root بوت کنیم، نیاز داریم که هسته بدونه آدرس IP، Gateway، Subnet Mask و نام میزبان (Hostname) چی هست.
ساختار کلی:
مثال:
کاربرد عملی: در محیطهایی مثل کلاینتهای بدون دیسک (Diskless Clients) یا Thin Clientها، سیستمها از روی شبکه بوت میشن و این پارامتر الزامیه.
🔹 ۳. پارامتر nfsroot
این پارامتر مسیر Root Filesystem رو روی سرور NFS مشخص میکنه. به این صورت هسته میدونه که فایلسیستم اصلی رو از روی شبکه بارگذاری کنه.
ساختار کلی:
مثال:
🔸 این یعنی Root Filesystem در مسیر /export/rootfs روی سرور 192.168.1.1 قرار داره.
کاربرد عملی: در دیتاسنترها یا کلاسهای آموزشی که صدها سیستم باید سریع بوت بشن، معمولاً Root روی یک سرور مرکزی ذخیره میشه و با NFS به همه کلاینتها داده میشه.
🔹 ۴. پارامتر root
این مهمترین پارامتره چون مشخص میکنه Root Filesystem سیستم روی کدوم پارتیشن قرار داره.
مثالها:
🔸 بوت از پارتیشن اول روی دیسک اول.
🔸 بوت از طریق شبکه با استفاده از NFS.
🔸 بوت از پارتیشنی که شناسه یکتا (UUID) مشخصی داره (ایمنتر از /dev/sda1 چون ترتیب دیسکها ممکنه تغییر کنه).
کاربرد عملی: اگر سیستم شما چندین دیسک یا RAID داشته باشه، استفاده از UUID یا LABEL مطمئنتره.
🔹 ۵. پارامتر single
این گزینه سیستم رو در حالت تککاربره (Single User Mode) بالا میاره.
در این حالت:
- فقط یک کاربر (root) میتونه وارد بشه.
- بیشتر سرویسهای شبکه و پسزمینه اجرا نمیشن.
- برای تعمیرات و عیبیابی استفاده میشه.
مثال:
🔸 این دستور در GRUB باعث میشه سیستم در حالت تعمیراتی اجرا بشه.
کاربرد عملی: وقتی پسورد root فراموش بشه یا فایلهای سیستمی خراب شده باشن، این گزینه حیاتی میشه.
🔹 ۶. پارامتر ro
این گزینه به کرنل میگه که Root Filesystem رو بهصورت Read-Only سوار کنه.
مثال:
🔸 سیستم بالا میاد اما Root فقط خواندنیه. بعداً توسط fsck بررسی میشه و در صورت نیاز به حالت قابلنوشتن تغییر میکنه.
کاربرد عملی: برای جلوگیری از آسیب بیشتر به فایلسیستم در زمان بوت (مثلاً بعد از قطع برق یا کرش سیستم).
🔹 ۷. پارامتر rw
برعکس ro، این گزینه Root Filesystem رو مستقیم بهصورت Read-Write سوار میکنه.
مثال:
کاربرد عملی: در مواقعی که مطمئنیم فایلسیستم سالمه و نیاز نداریم اول به حالت Read-Only بررسی بشه.
🔹 ۸. پارامتر hdx
این پارامتر برای مشخص کردن ویژگیهای دیسکهای IDE (قدیمی) استفاده میشه. هر دیسک با hdX شناخته میشه (hda, hdb, hdc, …).
زیرگزینهها:
- hdx=noprobe → نادیده گرفتن کامل دیسک.
- hdx=cdrom → اعلام اینکه دیسک از نوع CD-ROM هست.
- hdx=cyl,head,sect → تعیین هندسه دیسک بهصورت دستی.
مثال:
🔸 سیستم دیسک دوم رو نادیده میگیره.
کاربرد عملی: اگر دیسک خراب باشه و باعث هنگ کردن سیستم بشه، میتونیم اون رو نادیده بگیریم.
🔹 ۹. پارامتر reserve
این پارامتر برای رزرو کردن آدرسهای I/O یا IRQهاست تا کرنل اونها رو به دستگاههای دیگه اختصاص نده.
ساختار کلی:
مثال:
🔸 این یعنی محدوده I/O از آدرس 0x300 تا 0x31F رزرو بشه.
کاربرد عملی: در سیستمهای قدیمی که چندین کارت شبکه یا کارت جانبی داشتند، ممکن بود آدرسهای I/O با هم تداخل کنن. با reserve میشه جلوی این مشکل رو گرفت.
🔹 ۱۰. پارامتر console
این پارامتر مشخص میکنه که خروجی کنسول سیستم (پیغامهای Boot و لاگها) روی کجا نمایش داده بشه.
مثالها:
🔸 نمایش روی صفحه اصلی (پیشفرض).
🔸 نمایش روی پورت سریال ttyS0 با سرعت 9600bps.
🔸 همزمان هم روی مانیتور و هم روی پورت سریال نمایش داده بشه.
کاربرد عملی: در دیتاسنترها معمولاً سرورها بدون مانیتور هستن، پس لاگها روی پورت سریال یا حتی شبکه ارسال میشن.
🔹 ۱۱. پارامتر mem
این پارامتر میزان حافظه (RAM) قابلاستفاده برای کرنل رو مشخص میکنه.
مثالها:
🔸 فقط ۵۱۲ مگابایت RAM استفاده بشه.
🔸 فقط ۲ گیگابایت RAM استفاده بشه.
کاربرد عملی:
- تست کردن برنامهها روی مقدار حافظه محدود.
- دور زدن مشکل شناسایی اشتباه RAM توسط BIOS/UEFI.