چرا باید یک هسته سفارشی بسازیم؟

هسته FreeBSD یک هسته Monolithic است. این حرف یعنی اینکه هسته یک برنامه بزرگ بوده و تمام قابلیت‌ها به صورت ثابت در آن گنجانده شده‌اند و فقط از سخت‌افزارهای مشخصی پشتیبانی می‌کند. به این ترتیب اگر می‌خواهید قابلیتی جدید یا پشتیبانی از یک سخت‌افزار خاص را در هسته فعال یا غیرفعال کنید، می‌بایست هسته را مجددا کامپایل نمایید. خب مسلماً این زیاد خوب نیست. برای رفع این مشکل، هسته به صورت ماژولار طراحی شده است. به این ترتیب که قابلیت‌ها و درایورها به صورت ماژول طراحی شده‌اند و این ماژول‌ها می‌توانند در مواقع لزوم در هسته بارگذاری شده و پس از اتمام کار مجدداً باراندازی شوند. به این ترتیب هم حجم هسته کمتر می‌شود و هم قابلیت‌های اضافی و غیرکاربردی غیرفعال هستند. به این صورت که تنها قابلیت‌های اساسی و پرکاربرد و همچنین درایورهای رایج در یک هسته کوچک قرار داده می‌شوند و تمام دیگر اجزا به صورت ماژول در دسترس هستند و هر وقت به آن‌ها نیاز داشته باشیم می‌توانیم آن‌ها را فعال کرده و پس از اتمام کار مجدداً آن‌ها را غیرفعال کنیم.

هسته FreeBSD می‌تواند سفارشی شود. برای این کار باید فایل پیکربندی هسته را ویرایش کرده و تغییرات مورد نیاز خود را در آن ایجاد کنید. سپس باید هسته را با استفاده از این فایل پیکربندی کامپایل کرده و سیستم خود را با استفاده از این هسته جدید بوت کنید. هسته پیش فرض در FreeBSD با نام GENERIC شناخته می‌شود که این هسته از قابلیت‌ها و سخت‌افزارهای رایج پشتیبانی می‌کند. ممکن است این هسته جواب گوی نیازهای شما نباشد. مثلاً سخت‌افزار یا همین طور قابلیت مورد نظر شما در این هسته وجود نداشته باشد یا همچنین ممکن است هسته GENERIC از قابلیت‌ها و سخت‌افزارهایی پشتیبانی کند که مورد نیاز شما نباشند. در کل می‌توانید با کامپایل کردن یک هسته سفارشی قابلیت‌های مورد نیاز خود را فعال کرده و قابلیت‌های اضافی را غیرفعال کنید. این کار می‌تواند تأثیر چشمگیری در عملکرد کلی سیستم داشته باشد. از این رو توانایی پیکربندی و سفارشی سازی هسته یکی از مهارت های پایه برای یک مدیر سیستم محسوب می‌شود. به طور کلی تعدادی از مزایای استفاده از یک هسته سفارشی عبارتند از:

سریعتر شدن فرایند بوت:

از آنجا که سخت‌افزارهای اضافه پشتیبانی نمی‌شوند و هسته فقط سخت‌افزارهای سیستم شما را شناسایی می‌کند، سرعت بوت شدن سیستم افزایش خواهد یافت.

مصرف حافظه کمتر:

یک هسته سفارشی معمولاً حافظه کمتری نسبت به هسته GENERIC مصرف می‌کند. چون قابلیت‌ها و درایورهای اضافه در آن غیرفعال هستند و هسته از حجم کمتری برخوردار است. این مسأله مهمی است چون هسته در تمام مدت زمان روشن بودن کامپیوتر در حافظه مقیم بوده و باعث می‌شود تا برنامه‌ها نتوانند از قسمتی از حافظه استفاده کنند. به همین دلیل یک هسته سفارشی برای کامپیوتری که حافظه کمی در اختیار دارد می‌تواند بسیار مفید واقع شود.

پشتیبانی از سخت‌افزارهای بیشتر:

هسته GENERIC تنها از سخت‌افزارهای رایج پشتیبانی می‌کند. اگر سخت‌افزاری دارید که توسط هسته GENERIC پشتیبانی نمی‌شود، می توانید یک هسته سفارشی ایجاد کرده و پشتبانی از سخت‌افزار مورد نظر خود را در آن فعال کنید.

کسب اطلاعات درباره سخت‌افزار سیستم:
قبل از اینکه درگیر پیکربندی هسته شوید، بهتر است کمی درباره سخت‌افزار سیستم خود اطلاعات کسب کنید. اگر FreeBSD سیستم‌عامل اصلی شما نیست، می‌توانید این اطلاعات را از سیستم‌عامل فعلی خود کسب کنید. برای مثال در سیستم‌عامل ویندوز می‌توانید وارد قسمت Device Manager شده و اطلاعات مختلفی را درباره سخت‌افزار سیستم خود بدست آورید.

نکته: در برخی از نسخه‌های Microsoft Windows آیکونی به نام System وجود دارد که می‌توانید از طریق آن به قسمت Device manager دسترسی داشته باشید

اگر سیستم‌عامل دیگری بر روی کامپیوتر شما نصب نیست، باید این اطلاعات را به صورت دستی بدست آورید. یک روش ساده استفاده از dmesg و man است. در FreeBSD بیشتر درایورها یک صفحه manual دارند. از طریق این صفحه می‌توانید ببینید که چه سخت‌افزارها و دستگاه‌هایی توسط آن درایور پشتیبانی می‌شود و چطور می‌توان از آن درایور استفاده کرد و … . در هنگام بوت شدن سیستم، لیست سخت‌افزارهای شناسایی شده چاپ می‌شود. به عنوان مثال خطوط زیر به این معنی است که درایور psm یک ماوس شناسایی کرده است:

psm0: <PS/2 Mouse> irq 12 on atkbdc0
psm0: [GIANT-LOCKED]
psm0: [ITHREAD]
psm0: model Generic PS/2 mouse, device ID 0

این درایور یا باید در فایل پیکربندی هسته قرار داده شود و یا ماژول آن از طریق فایل /boot/loader.confبارگذاری شود.

در بعضی مواقع دستور dmesg پیام‌های سیستمی را در عوض پیام‌های هنگام بوت نمایش می‌دهد، در این گونه مواقع می‌توان پیام‌های هنگام بوت را از فایل /var/run/dmesg.boot به دست آورد.

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

ath0@pci0:3:0:0: class=0x020000 card=0x058a1014 chip=0x1014168c rev=0x01 hdr=0x00
vendor = ‘Atheros Communications Inc.’
device = ‘AR5212 Atheros AR5212 802.11abg wireless’
class = network
subclass = ethernet

خروجی بالا که از دستور pciconf -lv به دست آمده است، نشان می‌دهد که درایور ath یک کارت شبکه بی‌سیم شناسایی کرده است. برای خواندن صفحه ath کافی است دستور man ath را تایپ کنید.

فراخوانی دستور man به همراه گزینه k- اطلاعات مفیدی را در اختیار شما قرار می‌دهد. به عنوان مثال برای دیدن لیستی از صفحاتی که حاوی یک کلمه مشخص هستند کافی است بنویسید:

# man -k Atheros
ath(4) – Atheros IEEE 802.11 wireless network driver
ath_hal(4) – Atheros Hardware Access Layer (HAL)

با داشتن این اطلاعات مفید در مورد سخت‌افزار سیستم، عملیات کامپایل و پیکربندی هسته کمتر سخت به نظر می‌رسد.

ماژول‌ها و درایورهای هسته:
قبل از اینکه یک هسته سفارشی ایجاد کنید کمی تأمل کرده و دلیل انجام این کار را از خود بپرسید. آیا قصد دارید که پشتیبانی از یک سخت‌افزار را فعال کنید؟ اگر این طور است بهتر است فعلاً دست نگه دارید. ممکن است درایور آن سخت‌افزار به صورت ماژول موجود باشد. در این صورت احتیاجی به هسته سفارشی نیست و می‌توانید از همان ماژول استفاده کرده و در وقت خود صرفه جویی کنید.

ماژول ها در مسیر /boot/kernel نگهداری می‌شوند. خودِ هسته هم در مسیر /boot/kernel/kernel قرار دارد. ماژول‌ها فایل‌هایی با پسوند ‎ .ko هستند. ko به معنی kernel object است. این ماژول ها می توانند در هر زمانی توسط کاربر ریشه در هسته بارگذاری شوند. برای بارگذاری کردن یک ماژول از دستور kldload استفاده کنید. به عنوان مثال ماژولی به نام smbfs.ko وجود دارد. همان طور که از نامش پیداست، پشتیبانی از فایل‌سیستم SMB را فعال می‌کند. هسته GENERIC از این فایل‌سیستم پشتیبانی نمی‌کند. بنابراین شما برای mount کردن این نوع فایل‌سیستم می‌بایست ماژول smbfs.ko را در هسته بارگذاری کنید. کافی است دستور زیر را اجرا کنید تا این ماژول در هسته بارگذاری شود:

# kldload smbfs

اگر هیچ پیغامی چاپ نشد و شما به خط فرمان بازگشتید، یعنی ماژول با موفقیت در هسته بارگذاری شده است. شاید قصد داشته باشید بدانید که در حال حاضر چه ماژول هایی در هسته فعال هستند. برای دیدن لیستی از ماژول های فعال از دستور kldstat استفاده کنید:

# kldstat
Id Refs Address Size Name
۱ ۱۲۴ ۰xc0400000 e9ec64 kernel
۲ ۱ ۰xc129f000 192560 zfs.ko
۳ ۲ ۰xc5ccb000 b000 ntfs.ko

۴۳ ۲ ۰xc1bc6000 3000 libiconv.ko
۴۴ ۲ ۰xc1bdc000 3000 libmchain.ko
۴۵ ۱ ۰xc6237000 68000 radeon.ko
۴۷ ۱ ۰xc98ae000 1e000 smbfs.ko

ستون آخر نام ماژول های فعال را نمایش می‌دهد. ممکن است ماژول smbfs.ko به ماژول های دیگری وابسته باشد. در این صورت ابتدا آن ماژول ها بارگذاری شده، سپس ماژول smbfs.ko بارگذاری می‌شود. ستون Size حجم ماژول ها را در قالب یک عدد مبنای ۱۶ نشان می‌دهد. بعضی از ماژول ها مقدار زیادی از حافظه را اشغال می‌کنند. بعضی دیگر ممکن است باعث کاهش کارآیی هسته شوند. بنابرهمین دلایل شاید بخواهید بعد از اتمام کار ماژول‌ها را باراندازی کنید. این کار با استفاده از دستور kldunload امکان‌پذیر است.

# kldunload smbfs

به طور کلی بارگذاری یک ماژول کاری بسیار راحت، سریع و سرراست است. معمولاً وقتی که برنامه‌ای به یک ماژول احتیاج دارد، ماژول مورد نظر خود را به صورت خودکار و بدون دخالت شما بارگذاری می‌کند. ممکن است شما اصلاً متوجه بارگذاری خودکار ماژول ها نشوید. بارگذاری یک ماژول ممکن است مدت زیادی طول بکشد. حتی ممکن است برخی ماژول ها با هم تداخل داشته باشند و نتوان از آن‌ها به صورت همزمان استفاده کرد.

نکته دیگری که ذکر آن لازم به نظر می‌رسد، بارگذاری ماژول ها به صورت خودکار و در هنگام بوت شدن سیستم است. اگر ماژولی را مکررا استفاده می‌کنید، می توانید آن را به صورت خودکار و در هنگام بوت شدن سیستم در هسته بارگذاری کرده تا از انجام کارهای تکراری جلوگیری کنید. برای این کار باید نام ماژول مورد نظر را در فایل /boot/loader.conf وارد کنید. مثلاً برای بارگذاری ماژول های zfs.ko و linux.ko به صورت زیر عمل کنید:

zfs_enable=”YES”
linux_enable=”YES”

قالب کلی به صورت زیر است:

modulename_load=”YES”

نام ماژول نباید حاوی پسوند .ko باشد.

تمام ماژول‌ها یک صفحه راهنما دارند. به کمک دستور man و نام ماژول مورد نظر می‌توانید این صفحه راهنما را مطالعه کنید.

کامپایل و نصب هسته سفارشی
بررسی نصب بودن sourceهای سیستم:

در ابتدا بررسی می كنیم كه source های سیستم نصب هستند یا خیر. به این منظور به مسیر زیر می‌رویم:

/usr/src

در صورت وجود مسیر گفته شده source ها بر روی سیستم نصب هستند. در غیر این صورت با کاربر ریشه وارد سیستم شده و برنامه sysinstall را اجرا می‌كنیم. ابتدا configure و سپس گزینه Distribution انتخاب می‌کنیم و به قسمت src رفته و گزینه All را انتخاب و سپس سورس‌ها را نصب می‌کنیم.

با انجام مراحل گفته شده sourceهای سیستم به صورت كامل نصب مي‌شوند. حال نیاز است که فایل تنظیمات هسته را به منظور ساخت هسته جدید ویرایش کنیم.

ویرایش فایل تنظیمات هسته:

به منظور ویرایش فایل تنظیمات هسته به مسیر زیر می‌رویم :

/usr/src/sys/i386/conf

نکته: شما باید بسته به معماری پردازنده سیستم‌تان به پوشه مربوط به پردازنده خود بروید. برای مثال برای پردازنده‌های i386 به پوشه مربوط به این معماری می‌رویم.

ابتدا به منظور حفظ فایل اصلی یک نسخه پشتیبان از فایل GENERIC گرفته و تغییرات مورد نظر خود را در آن انجام می‌دهیم. برای این منظور می‌توانیم از دستور زیر استفاده کنیم:

cp GENERIC MYKERNEL

نکته: فایل MYKERNEL یک فایل نمونه است و شما می‌توانید از هر اسم دیگری برای این فایل استفاده کنید.

حال زمان آن است که فایل MYKERNEL را با توجه به نیاز خود ویرایش كنید.

بعد از ویرایش فایل و ذخیره كردن تغییرات، كار تنظیمات به پایان می‌رسد. لطفا برای کسب اطلاعات بیشتر درباره این فایل، بررسی فایل پیکربندی هسته را ببینید.

ساختن كرنل و نصب آن:

برای این منظور به دایرکتوری زیر می‌رویم:

cd /usr/src

و برای شروع فرآیند کامپایل دستور زیر را وارد می‌کنیم:

make buildkernel KERNCONF=MYKERNEL

بعد از به پایان رسیدن فرآیند کامپایل در دایرکتوری جاری دستور زیر را به منظور نصب کردن کرنل وارد می‌کنیم:

make installkernel KERNCONF=MYKERNEL

قسمت KERNCONF=MYKERNEL در دستورات بالا به کامپایلر می‌فهماند که برای نصب کرنل جدید از کدام فایل تنظیمات باید استفاده کند.

اگر اشکالی پیش آمد
در هنگام پیکربندی هسته، چند نوع مشکل ممکن است بوجو بیاید:

  • اشکالات مربوط به پیکربندی:
    ممکن است فایل پیکربندی هسته شما دارای اشکالاتی باشد. فایل پیکربندی هسته توسط config تجزیه می‌شود. config می‌تواند اشکالات نحوی فایل پیکربندی را پیدا کند. خوشبختانه config شماره خطی که دارای اشکال است را چاپ می‌کند و به این ترتیب شما می‌توانید براحتی فایل پیکربندی هسته را اشکال‌زدایی کنید.برای مثال:

config: line 17: syntax error

پیام بالا به این معنی است که در خط هفدهم فایل پیکربندی اشکالی وجود دارد. کافی است این فایل را با ویرایشگر متن باز کرده، سپس به خط هفدهم رفته و آن را بررسی کنید. مطمئن شوید که کلمات کلیدی به درستی تایپ شده باشند. می‌توانید این خط را با هسته GENERIC یا دیگر مراجع مقایسه کرده و از درستی آن مطمئن شوید.

  • هسته بوت نمی‌شود
    اگر هسته بوت نشد، یا نتوانست دستگاه‌ها را به خوبی شناسایی کند، وحشت نکنید! خوشبختانه FreeBSD یک راه کار عالی برای بازیابی کردن هسته‌های خراب در نظر گرفته است. کافی است از منوی بوت هسته سالم را انتخاب کنید. در منوی بوت وقتی پیغام “Escape to a loader prompt” را دیدید، دکمه Escape را فشار دهید. سپس دستور زیر را تایپ کنید (یا نام هر هسته سالم دیگر)

boot kernel.old

بعد از اینکه سیستم را با هسته سالم بوت کردید، پیکربندی خود را بررسی کرده و مجددا برای کامپایل هسته تلاش نمایید. یک منبع مفید برای بدست آوردن اطلاعات فایل /var/log/messages است. این فایل دربرگیرنده پیام هایی است که یک هسته سالم در هنگام بوت سیستم چاپ می‌کند. همچنین dmesg پیغام‌هایی که هسته در هنگام بوت فعلی چاپ کرده را به شما نمایش می‌دهد.

  • هسته کار می‌کند اما ps کار نمی‌کند.
    اگر نسخه هسته با نسخه دیگر برنامه‌ها و کتابخانه‌ها متفاوت باشد، بسیاری از دستورات مانند ps و vmstat کار نخواهند کرد. برای مثال اگر شما هسته ‎-CURRENT را بر روی سیستم ‎-RELEASE کامپایل نصب کنید، این اتفاق خواهد افتاد. برای حل این مشکل کافی است world را متناسب با نسخه هسته کامپایل و نصب کنید. این یکی از دلایلی است که نباید از نسخه هسته با نسخه دیگر ابزارهای سیستم متفاوت باشد.