پارامترهای Boot-Time در لینوکس


پارامترهای 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[=value1][,value2]…[,value10]
  • بخش name یک کلید یا کلمه کلیدی است (مثلاً root, init, rw).
  • بخش value مقداری است که به آن کلید نسبت داده می‌شود.
  • هر کلید می‌تواند تا ۱۰ مقدار جدا شده با ویرگول داشته باشد.

مثال ساده

root=/dev/sda1 ro init=/bin/bash

در این مثال:

  • root=/dev/sda1 می‌گوید فایل‌سیستم Root روی پارتیشن /dev/sda1 قرار دارد.
  • ro می‌گوید Root Filesystem در ابتدا فقط خواندنی باشد.
  • init=/bin/bash می‌گوید به‌جای اجرای /sbin/init، مستقیم Shell /bin/bash اجرا شود.

🔹 مراحل Boot در لینوکس

برای درک بهتر اینکه پارامترها کجا به کار می‌روند، باید مراحل Boot در لینوکس را بشناسیم:

  1. BIOS/UEFI Initialization

    سیستم روشن می‌شود، سخت‌افزارها تست می‌شوند (POST – Power On Self Test)، سپس BIOS/UEFI یک دستگاه بوت (مثل HDD، SSD، USB یا Network) را انتخاب می‌کند.
  2. Load Bootloader

    برنامه بوت‌لودر (GRUB یا LILO) از دستگاه انتخاب‌شده اجرا می‌شود.
  3. Bootloader Loads Kernel

    Bootloader هسته لینوکس را از دیسک به حافظه بارگذاری می‌کند و پارامترهای Boot-Time را به آن تحویل می‌دهد.
  4. Kernel Initialization

    کرنل شروع به راه‌اندازی سخت‌افزار و زیرسیستم‌های اصلی می‌کند (CPU، حافظه، درایورها).
  5. 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=/sbin/init

🔸 اجرای حالت عادی (مدیریت سرویس‌ها توسط init/systemd).

init=/bin/bash

🔸 اجرای مستقیم یک Shell (برای مواقعی که سیستم خراب شده و نیاز به تعمیر دستی داریم).

کاربرد عملی: اگر فایل‌های init خراب یا پاک بشن، سیستم بوت نمی‌شه. در این شرایط می‌تونیم init=/bin/bash بذاریم و بعد فایل‌های خراب رو تعمیر کنیم.

🔹 ۲. پارامتر nfsaddrs

وقتی بخوایم سیستم لینوکس رو از طریق شبکه و با استفاده از NFS Root بوت کنیم، نیاز داریم که هسته بدونه آدرس IP، Gateway، Subnet Mask و نام میزبان (Hostname) چی هست.

ساختار کلی:

nfsaddrs=client-ip:server-ip:gateway-ip:netmask:hostname

مثال:

nfsaddrs=192.168.1.10:192.168.1.1:192.168.1.1:255.255.255.0:linux-client

کاربرد عملی: در محیط‌هایی مثل کلاینت‌های بدون دیسک (Diskless Clients) یا Thin Clientها، سیستم‌ها از روی شبکه بوت می‌شن و این پارامتر الزامیه.

🔹 ۳. پارامتر nfsroot

این پارامتر مسیر Root Filesystem رو روی سرور NFS مشخص می‌کنه. به این صورت هسته می‌دونه که فایل‌سیستم اصلی رو از روی شبکه بارگذاری کنه.

ساختار کلی:

nfsroot=server-ip:/path/to/rootfs

مثال:

nfsroot=192.168.1.1:/export/rootfs

🔸 این یعنی Root Filesystem در مسیر /export/rootfs روی سرور 192.168.1.1 قرار داره.

کاربرد عملی: در دیتاسنترها یا کلاس‌های آموزشی که صدها سیستم باید سریع بوت بشن، معمولاً Root روی یک سرور مرکزی ذخیره می‌شه و با NFS به همه کلاینت‌ها داده می‌شه.

🔹 ۴. پارامتر root

این مهم‌ترین پارامتره چون مشخص می‌کنه Root Filesystem سیستم روی کدوم پارتیشن قرار داره.

مثال‌ها:

root=/dev/sda1

🔸 بوت از پارتیشن اول روی دیسک اول.

root=/dev/nfs

🔸 بوت از طریق شبکه با استفاده از NFS.

root=UUID=1234-5678

🔸 بوت از پارتیشنی که شناسه یکتا (UUID) مشخصی داره (ایمن‌تر از /dev/sda1 چون ترتیب دیسک‌ها ممکنه تغییر کنه).

کاربرد عملی: اگر سیستم شما چندین دیسک یا RAID داشته باشه، استفاده از UUID یا LABEL مطمئن‌تره.

🔹 ۵. پارامتر single

این گزینه سیستم رو در حالت تک‌کاربره (Single User Mode) بالا میاره.

در این حالت:

  • فقط یک کاربر (root) می‌تونه وارد بشه.
  • بیشتر سرویس‌های شبکه و پس‌زمینه اجرا نمی‌شن.
  • برای تعمیرات و عیب‌یابی استفاده می‌شه.

مثال:

linux single

🔸 این دستور در GRUB باعث می‌شه سیستم در حالت تعمیراتی اجرا بشه.

کاربرد عملی: وقتی پسورد root فراموش بشه یا فایل‌های سیستمی خراب شده باشن، این گزینه حیاتی می‌شه.

🔹 ۶. پارامتر ro

این گزینه به کرنل می‌گه که Root Filesystem رو به‌صورت Read-Only سوار کنه.

مثال:

root=/dev/sda1 ro

🔸 سیستم بالا میاد اما Root فقط خواندنیه. بعداً توسط fsck بررسی می‌شه و در صورت نیاز به حالت قابل‌نوشتن تغییر می‌کنه.

کاربرد عملی: برای جلوگیری از آسیب بیشتر به فایل‌سیستم در زمان بوت (مثلاً بعد از قطع برق یا کرش سیستم).

🔹 ۷. پارامتر rw

برعکس ro، این گزینه Root Filesystem رو مستقیم به‌صورت Read-Write سوار می‌کنه.

مثال:

root=/dev/sda1 rw

کاربرد عملی: در مواقعی که مطمئنیم فایل‌سیستم سالمه و نیاز نداریم اول به حالت Read-Only بررسی بشه.

🔹 ۸. پارامتر hdx

این پارامتر برای مشخص کردن ویژگی‌های دیسک‌های IDE (قدیمی) استفاده می‌شه. هر دیسک با hdX شناخته می‌شه (hda, hdb, hdc, …).

زیرگزینه‌ها:

  • hdx=noprobe → نادیده گرفتن کامل دیسک.
  • hdx=cdrom → اعلام اینکه دیسک از نوع CD-ROM هست.
  • hdx=cyl,head,sect → تعیین هندسه دیسک به‌صورت دستی.

مثال:

hdb=noprobe

🔸 سیستم دیسک دوم رو نادیده می‌گیره.

کاربرد عملی: اگر دیسک خراب باشه و باعث هنگ کردن سیستم بشه، می‌تونیم اون رو نادیده بگیریم.

🔹 ۹. پارامتر reserve

این پارامتر برای رزرو کردن آدرس‌های I/O یا IRQهاست تا کرنل اون‌ها رو به دستگاه‌های دیگه اختصاص نده.

ساختار کلی:

reserve=iobase,extent[,iobase,extent]…

مثال:

reserve=0x300,32

🔸 این یعنی محدوده I/O از آدرس 0x300 تا 0x31F رزرو بشه.

کاربرد عملی: در سیستم‌های قدیمی که چندین کارت شبکه یا کارت جانبی داشتند، ممکن بود آدرس‌های I/O با هم تداخل کنن. با reserve می‌شه جلوی این مشکل رو گرفت.

🔹 ۱۰. پارامتر console

این پارامتر مشخص می‌کنه که خروجی کنسول سیستم (پیغام‌های Boot و لاگ‌ها) روی کجا نمایش داده بشه.

مثال‌ها:

console=tty0

🔸 نمایش روی صفحه اصلی (پیش‌فرض).

console=ttyS0,9600

🔸 نمایش روی پورت سریال ttyS0 با سرعت 9600bps.

console=tty0 console=ttyS0,9600

🔸 همزمان هم روی مانیتور و هم روی پورت سریال نمایش داده بشه.

کاربرد عملی: در دیتاسنترها معمولاً سرورها بدون مانیتور هستن، پس لاگ‌ها روی پورت سریال یا حتی شبکه ارسال می‌شن.

🔹 ۱۱. پارامتر mem

این پارامتر میزان حافظه (RAM) قابل‌استفاده برای کرنل رو مشخص می‌کنه.

مثال‌ها:

mem=512M

🔸 فقط ۵۱۲ مگابایت RAM استفاده بشه.

mem=2G

🔸 فقط ۲ گیگابایت RAM استفاده بشه.

کاربرد عملی:

  • تست کردن برنامه‌ها روی مقدار حافظه محدود.
  • دور زدن مشکل شناسایی اشتباه RAM توسط BIOS/UEFI.

✍️ نویسنده: حسین سیلانی

🔗 درباره من: seilany.ir

📢 نویسندگی و مشارکت در وبلاگ: t.me/seilany