منبع اصلی نوشتار زیر در این لینک قرار دارد

پیکربندی و نصب کرنل لینوکس

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

واژهٔ «هسته»، به سامانهٔ نرم‌افزاری سطح پایینی (به معنی نزدیک‌تر به سخت‌افزار در رده‌بندی معماری سیستم‌عامل) اشاره می‌کند که لایه‌ای در معماری سیستم‌عامل به نام لایه انتزاع سخت‌افزار را تأمین می‌کند و دیسک‌ها وسامانهٔ پرونده‌گردانی را بررسی می‌نماید و تراز کردن (Balancing) ذخیره‌سازی داده‌ها و شبکه‌بندی و برقراری امنیت را برعهده دارد. [ویکی]

چرا باید هستهٔ لینوکس را دوباره کامپایل کنیم؟

شاید این سؤال برای شما پیش بیاید که با وجود این که یک هستهٔ کامپایل شده در توزیع گنو/لینوکس وجود دارد، چرا بخواهیم دوباره هسته را کامپایل کنیم؟ دلایل زیادی برای این کار وجود دارد. از جمله بهبود کارایی و شخصی‌سازی.

هسته‌هایی که با توزیع‌های معروف گنو/لینوکس منتشر می‌شوند معمولاً با یک پیکربندی بسیار عمومی کامپایل شده‌اند. این یعنی تقریباً تمام سخت‌افزارهای مدرن موجود در بازار رایانه‌ها پشتیبانی می‌شوند. بنابراین وقتی شما یک توزیع گنو/لینوکس نصب می‌کنید، صدها ماژول اضافی برای سخت‌افزارها، استانداردها و پروتکل‌های مختلف به‌همراه کرنل شما نصب می‌شود که هیچ نیازی به آن‌ها ندارید. به‌عنوان مثال اگر کارت صوتی شما از درایورهای FM801 استفاده می‌کند دیگر نیازی به درایورهای cm109 و یا Zoltrix ندارید. با این حال درایورهای تمامی این چیپ‌ست‌ها در کرنل شما موجود است البته این درایورها همیشه بارگذاری نمی‌شود. بارگذاری ماژول مناسب برعهدهٔ برنامه‌ای به نام udev است. این برنامه در هنگام بوت شدن سیستم‌عامل، در فضای هسته اجرا می‌شود و با تطبیق کد وقفه‌های حاصل از اسکن سخت‌افزار، درایور مناسب را لود می‌کند. این کار طبیعتاً وقت‌گیر است. علاوه‌بر آن وجود ماژول‌های اضافی در کرنل، فضا را به هدر می‌دهد. بنابراین پیکربندی هسته برای یک مجموعهٔ سخت‌افزاری خاص، سرعت بوت سیستم را تا حد زیادی افزایش می‌دهد و حجم کرنل را تا حدودی کاهش می‌دهد. بهبود کارایی بوت برای سیستم‌های Real Time حیاتی است. در یک مورد خاص، با حذف روال UDev بهبود زمان بوت از ۴۵ ثانیه به ۵ ثانیه (۸۸٪ بهبود زمانی) در کرنل فدورا کور ۶ روی یک کامپیوتر قدیمی مشاهده شده است. شاید بهبود حجم هسته برای رایانه‌های شخصی امروزی چندان اهمیت نداشته باشد. اما برای سیستم‌های غیر PC مانند، گاهی اوقات ۱۰ مگابایت فضای بسیار زیادی به حساب می‌آید! بنابراین عاقلانه است که در صورت امکان کرنل توزیع گنو/لینوکس خود را برای دلایل متعدد بهینه کنیم.

\"\"

از طرف دیگر باید در نظر داشته باشیم که کرنل لینوکس یک سامانهٔ نرم‌افزاری بسیار گسترده است. علاوه‌بر این که تعداد زیادی ماژول غیرضروری به همراه کرنل شما وجود دارد، تعداد بسیار بیشتری وجود ندارد! این ماژول‌ها معمولاً آن‌هایی هستند که کاربرد آن‌ها در زمرهٔ فعالیت‌های عادی در روند استفاده از رایانهٔ شخصی قرار نمی‌گیرد. با این حال ممکن است یکی از این‌ها دقیقاً همان چیزی باشد که شما برای کار غیرمعمولی خود نیاز دارید! به‌عنوان مثال شما شاید مایل باشید به دلایلی از یک الگوریتم بسیار قوی برای رمزنگاری تمامی محتویات دیسک سخت خودتان استفاده کنید. در کرنل لینوکس ماژول‌هایی برای پیاه‌سازی چنین مکانیسمی وجود دارد. شما می‌توانید این کار را به سادگی به سیستم‌عامل بسپارید و در فضای کرنل، روی فایل‌سیستم‌ها این رمزنگاری را انجام دهید! (البته برای کاربردهای عادی انجام چنین کارهایی به هیچ‌وجه توصیه نمی‌شود! توجه داشته باشید که در صورت استفاده از این سیستم، کارایی رایانهٔ شما تا حد بسیار زیادی پایین می‌آید و اگر رمز خود را فراموش کنید حتی FBI هم نمی‌تواند اطلاعات شما را برگرداند!)

روند کلی

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

شروع به‌کار: دریافت کد کرنل

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

&lt;/pre&gt;<br />
&lt;code&gt;wget http://www.kernel.org/pub/linux/kernel/v3.0/linux-3.0.4.tar.bz2&lt;/code&gt;<br />
&lt;pre&gt;


البته این آخرین نسخهٔ فعلی کرنل تا امروز (زمان نگارش این مقاله)  است. طبیعتاً شما مایل هستید نسخه‌های جدیدتری را که در آینده منتشر خواهد شد، یا نسخه‌های قدیمی‌تر را دانلود کنید. بهتر است از rsync یا ftp استفاده کنید. در همهٔ توزیع‌های لینوکس و یونیکس ftp وجود دارد. شما می‌توانید به سرور ftp سایت کرنل متصل شوید و لیستی از کرنل‌ها را مشاهده کرده و نسخهٔ موردنظر را دریافت کنید (اجرای دستور در ترمینال):

&lt;/pre&gt;<br />
&lt;code&gt;ftp ftp.kernel.org&lt;/code&gt;<br />
&lt;pre&gt;

با نام کاربری anonymous و گذرواژهٔ خالی وارد شوید:

<br />
Connected to pub2.kernel.org.<br />
220 (vsFTPd 2.3.4)<br />
Name (pub2.kernel.org:soroush): anonymous<br />
331 Please specify the password.<br />
Password:<br />
230 Login successful.<br />
Remote system type is UNIX.<br />
Using binary mode to transfer files.<br />
ftp&gt;</p>
<p>

حالا باید به مسیر کرنل‌های لینوکس بروید. در حال حاضر کرنل‌های نسخهٔ ۳ در مسیر pub/linux/kernel/v3.x و نسخهٔ ۲ در مسیر pub/linux/kernel/v2.6 قرار دارند. با فرمان cd مسیر را عوض کنید و با فرمان ls لیستی از فایل‌های موجود در آن مسیر را چاپ کنید:

<br />
ftp&gt; cd /pub/linux/kernel/v3.x<br />
250 Directory successfully changed.<br />
ftp&gt; ls<br />
200 PORT command successful. Consider using PASV.<br />
150 Here comes the directory listing.<br />
-rw-rw-r--    1 536      536        248483 Oct 23 07:00 ChangeLog-3.0.5<br />
-rw-rw-r--    1 536      536           836 Oct 23 07:00 ChangeLog-3.0.5.sign<br />
-rw-rw-r--    1 536      536           734 Oct 23 07:51 ChangeLog-3.0.6<br />
-rw-rw-r--    1 536      536           836 Oct 23 07:51 ChangeLog-3.0.6.sign<br />
-rw-rw-r--    1 536      536         47149 Oct 23 07:57 ChangeLog-3.0.7<br />
-rw-rw-r--    1 536      536           836 Oct 23 07:57 ChangeLog-3.0.7.sign<br />
-rw-rw-r--    1 536      536         33174 Oct 25 05:14 ChangeLog-3.0.8<br />
-rw-rw-r--    1 536      536           836 Oct 25 05:14 ChangeLog-3.0.8.sign<br />
-rw-rw-r--    1 536      536       6022933 Oct 24 07:32 ChangeLog-3.1<br />
-rw-rw-r--    1 536      536           490 Oct 24 07:32 ChangeLog-3.1.sign<br />
-rw-rw-r--    1 536      536             0 Oct 23 10:23 LATEST-IS-3.0.7<br />
.....<br />
226 Directory send OK.<br />

حالا می‌توانید با دستور get کرنل موردنظر را دانلود کنید:

<br />
ftp&gt; get linux-3.0.1.tar.bz2<br />
200 PORT command successful. Consider using PASV.<br />
150 Opening BINARY mode data connection for linux-3.0.1.tar.bz2 (76754139 bytes).<br />
.....</p>
<p>

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

<br />
tar xvjf linux-3.0.1.tar.bz2</p>
<p>

پیکربندی

پیکربندی عبارت است از انتخاب مجموعه‌ای از ماژول‌ها و تنظیم پارامترهایی برای استفاده کامپایلر. برنامهٔ پیکربندی با پرسش چند سؤال از شما فایل مخفی .config را ایجاد/ویرایش می‌کند. این کار می‌تواند در مقاطع مختلف طی چند روز انجام شود. در صورتی که فایل .config موجود باشد، محتویات آن بارگذاری می‌شود و پس از ویرایش ذخیره می‌شود. با دستور make config وارد برنامهٔ پیکربندی می‌شوید. این برنامه رابط گرافیکی ندارد و با پرسش‌های متعدد از شما در مورد هر ماژول یا مجموعه‌ای از ماژول‌ها پیکربندی را انجام می‌دهد. جواب دادن به ۱۰۰ ~ ۲۰۰ سؤال عجیب و غریب شاید چندان خوشایند نباشد! راه بهتر استفاده از یک رابط گرافیکی برای پیکربندی است. اگر کتابخانهٔ ncurses را نصب کرده باشید، می‌توانید از محیط گرافیکی متنی برای پیکربندی استفاده کنید. این دستور را وارد کنید:

&lt;/pre&gt;<br />
make menuconfig</p>
<p>

وارد چنین محیطی خواهید شد:

\"محیط

در صورتی که در محیط گرافیکی مانند گنوم هستید می‌توانید از محیط gtk برای پیکربندی استفاده کنید:

&lt;/pre&gt;<br />
make gconfig<br />
&lt;pre&gt;

\"پیکربندی

و اگر در کی‌دی‌ای باشید، می‌توانید از برنامهٔ پیکربندی تحت کیوت استفاده کنید:

&lt;/pre&gt;<br />
make xconfig<br />
&lt;pre&gt;

\"محیط

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

  • کامپایل نمی‌شود که در این صورت طبیعتا بارگذاری هم نمی‌شود،
  • کامپایل شده ولی به‌صورت خودکار بارگذاری نمی‌شود. در این صورت ماژول در فضای کرنل موجود خواهید بود. و با دستور modprobe قابل بارگذاری است.
  • کامپایل شده و به‌صورت خودکار بارگذاری می‌شود.

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

کامپایل

روند کامپایل کرنل بسیار ساده است! شما تنها باید دستور make را فراخوانی کنید. در صورتی که از پردازنده‌های چندهسته‌ای استفاده می‌کنید می‌توانید از ویژگی کامپایل همزمان کرنل استفاده کنید که سرعت شما را چند برابر خواهد کرد. مثلا برای پردازنده‌های ۴ هسته‌ای:

&lt;/pre&gt;<br />
make -j4<br />
&lt;pre&gt;

بعد از اتمام کامپایل کرنل، شما باید ماژول‌های کرنل را کامپایل کنید:

&lt;/pre&gt;<br />
make modules<br />
&lt;pre&gt;

و سپس ماژول‌ها را به مکان مناسب در /lib/moduls انتقال دهید تا سیستم‌عامل بتواند آن‌ها را بارگذاری کند:

&lt;/pre&gt;<br />
make modules_install<br />
&lt;pre&gt;

حالا شما باید یک ramdisk بسازید! رم‌دیسک برنامه‌ای است که پیش از بارگذاری کرنل در فضای سخت‌افزار اجرا می‌شود و وظیفهٔ آن بارگذاری کرنل و فایرآپ کردن آن است. دستور مربوط به آن ممکن است در توزیع‌های مختلف متفاوت باشد… برای آرچ دستور

&lt;/pre&gt;<br />
mkinitcpio<br />
&lt;pre&gt;

و برای اوبونتو و دیگر توزیع‌ها معمولا دستور

&lt;/pre&gt;<br />
mkinitrd<br />
&lt;pre&gt;

این کار را انجام می‌دهد. این دستور نام کرنل را به‌عنوان پارامتر دریافت می‌کند. این نام همان نام فولدری است که با دستور make modules_install در شاخهٔ /lib/modules ایجاد شده است. همچنین دستور در حالت عادی به شکل dry run اجرا می‌شود و خروجی تولید نمی‌کند. برای تولید خروجی از سویچ -g استفاده کنید. به‌عنوان مثال در کامپیوتر من دستور به این شکل خواهد بود:

&lt;/pre&gt;<br />
mkinitcpio -g ./my-ramdisk.img 3.0-ARCH<br />
&lt;pre&gt;

با این دستورات فایل my-ramdisk.img در شاخهٔ جاری ایجاد می‌شود. حالا شما یک کرنل کامل دارید و باید آن را نصب کنید!

نصب کرنل

کرنل جدید شما عبارت است از دو فایل! یکی همین ramdisk که در مرحلهٔ قبل ایجاد کرده‌اید و دیگری خود کرنل که  در مسیر arch/$your-architecture/ قرار گرفته است. your-architecture معماری پردازنده‌ای است که کرنل را با آن (یا برای استفاده در آن) کامپایل کرده‌اید. برای پردازنده‌های سازگار با اینتل ۳۲ بیتی x86 است. کرنل را به‌راحتی می‌توایند پیدا کنید (یک فایل image  با حجم بین ۲ تا ۵۰ مگابایت است). این فایل و ramdisk را در مسیر /boot کپی کنید. اسامی آن‌ها هم به‌خاطر بسپارید چون قرار است تایپ‌شان کنید. حالا تنها چیزی که نیاز دارید این است که در منوی بوت‌لودر خودتان، کرنل جدید را معرفی کنید! برای گراب به مسیر /boog/grub بروید و فایل menu.lst را ویرایش کنید. باید چهار خط برای ایجاد گزینهٔ جدید اضافه کنید:

<br />
# Our custom kernel menu entry<br />
title  My very good new kernel<br />
root   (hd0,0) # this depends on your filesystem and partitions<br />
kernel /boot/my-kernel.img root=/dev/sda1 ro<br />
initrd /boot/my-ramdisk.img<br />

طبیعتا مسیرها و شمارهٔ پارتیشن‌ها را باید با توجه به سیستم خودتان اصلاح کنید. hd0 شمارهٔ هارددیسک را نشان می‌دهد و ۱ شمارهٔ پارتیشن / با شروع از صفر.

/dev/sda1 با شروع از ۱ شمارهٔ پارتیشن / را نشان می‌دهد. اگر سردرگم شده‌اید می‌توانید توضیحات ابتدایی فایل menu.lst را در گراب خودتان ملاحظه کنید:

&lt;/pre&gt;<br />
&amp;nbsp;</p>
<p>&amp;nbsp;<br />
&lt;pre&gt;# DEVICE NAME CONVERSIONS #<br />
# Linux Grub<br />
# -------------------------<br />
# /dev/fd0 (fd0)<br />
# /dev/sda (hd0)<br />
# /dev/sda1 (hd0,0)<br />
# /dev/sdb2 (hd1,1)<br />
# /dev/sda3 (hd0,2)</p>
<p>

 

\"ارسال



برچسب ها : , , , ,