خصوصی سازی هسته لینوکس(1917 مجموع کلمات موجود در متن) (1839 بار مطالعه شده است) 
تاکنون در مقالههای مختلفی به روشهای نصب هسته لینوکس اشاره شده است و هدف ما از این نوشتار بازگویی مطالب پیشین نمیباشد. در این مقاله فرض می کنیم که شما با روش نصب هسته آشنا هستید و بیشتر بر روی نصب ماژول راهانداز سختافزارهای شما متمرکز میشویم.
یکی از آسانترین روشهای که برای پیدا کردن ماژولها مورد نیاز شما وجود دارد، استفاده از پیکربندی هسته توزیع کنونی شما است. همچنین به کمک هستهای که در حال حاظر استفاده میکنید، همچنین به کمک هستهای که در حال حاضر استفاده میکنید، میتوان ماژولهای راهانداز سختافزاری را شناسایی کرد.
اگر در حال حاضر شما توزیع لینوکس نصب شده در اختیار ندارید میتوانید از توزیعهای لینوکس زنده استفاده کنید. با این روش لینوکس راهاندازها و ماژولهای مورد نیاز را شناسایی کرده و سیستمعامل را بروی ماشین شما اجرا میکند.
پیکربندی هسته در کجا قرار دارد؟
تقریبا تمام توزیعهای لینوکسی فایل پیکربندی هسته را همراه با بسته(Package) هسته نصب می کنند. میتوانید با کمک مستندات توزیعتان محل استقرار فایل پیکربندی را پیدا کنید. معمولا این فایل در آدرس usr/src/linux/ قرارمیگیرد.
استفاده از این فایل پیکربندی باعث میشود که تصویرهسته (Kernel Image) جدید جایگزین تصویرهسته کنونی شود یعنی تمامی ماژولها و راهاندازهای که نصب یا اضافه می کنید بر روی هسته کنونی شما تاثیر میگذارد.
از آنجایی که این پیکربندی فقط بر روی سیستم شما اجرا خواهد شد میتوانید راهاندازها و خصوصیات اضافی را حذف نمایید. به شما پیشنهاد میکنیم که تنها تنظیماتی را که مطمئن هستید به آنها نیازی ندارید غیرفعال کنید.
یافتن ماژولهای مورد نیاز
ایجاد هسته با استفاده از تنظیمات فایل پیکربندی پیشفرض توزیع، زمان زیادی می برد زیرا راهاندازهای مختلفی باید نصب شود. اما شما می خواهید تنها راهاندازها سختافزارهایی را که دارید نصب کنید با این روش در زمان ایجاد هسته و در حافظه مصرفی صرفهجویی میکنید و همچنین با پیکربندی صحیح میتوانید سرعت اجرا سیستمعامل را افزایش دهید، برای اینکار شما باید در ابتدا بدانید که که به چه ماژول های نیاز دارید تا بتوانید سختافزارهایتان را کنترل کند. در ادامه با ارئه دو مثال به نحوه یافتن راهاندازهای مناسب سختافزارتان میپردازیم.
محلهای زیادی در سیستم شما وجود دارد که میتوان به کمک آنها راهاندازهایی که به هسته متصل شدهاند را مشخص کرد. یکی از مهمترین این محل های فایلسیستم مجازی است که با نام sysf خوانده می شود. sysf توسط اسکریپت های آغازی که در زمان بوت هسته اجرا می شوند در شاخه sys/ سوار(Mount) می شود. به کمک ساختار sysf میتوان به چگونگی ارتباط قسمتهای مختلف هسته پی برد.
مثال : تعیین کردن راهانداز شبکه
کارت شبکه یکی از عمومیترین و مهمترین دستگاههای موجود بر روی سیستمها می باشد. برای نصب، فعال سازی و اجرای مناسب آن شناختن نوع دستگاه امری ضروریمی باشد.
ابتدا باید به صورت معکوس تعداد و نام دستگاههای شبکه را پیدا کنید، برای این کار میتوانید با دستور زیر نام این دستگاه را ببنید :
$ ls /sys/class/net/
eth0 eth1 eth2 lo
شاخه lo نشان دهنده loopback میباشد و به دستگاه شبکه واقعیای مرتبط نمیباشد. شاخههای eth0, eth1, eth2 آدرسهای هستند که باید به آنها توجه نمایید و نشان دهنده دستگاههای های شبکه واقعی شما می باشند.
برای اینکه جزئیات بیشتری در مورد دستگاههای شبکه بیابید میتوانید از ابزار ifconfig استفاده کنید:
# /sbin/ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:12:3F:65:7D:C2
inet addr:192.168.0.13 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2720792 errors:0 dropped:0 overruns:0 frame:0
TX packets:1815488 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:3103826486 (2960.0 Mb) TX bytes:371424066 (354.2 Mb)
Base address:0xdcc0 Memory:dfee0000-dff00000
eth1 Link encap:UNSPEC HWaddr 80-65-00-12-7D-C2-3F-00-00-00-00-00-00-00-00-00
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
eth2 Link encap:UNSPEC HWaddr 00-02-3C-04-11-09-D2-BA-00-00-00-00-00-
00-00-00
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:60 errors:0 dropped:0 overruns:0 frame:0
TX packets:60 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0
RX bytes:13409 (13.0 Kb) TX bytes:13409 (13.0 Kb)
با کمک خط زیر شما میتوانید متوجه شوید دستگاه شبکه که با نام eth0 نامگذاری شده است فعال است و در حال کار کردن میباشد :
eth0 Link encap:Ethernet HWaddr 00:12:3F:65:7D:C2 inet addr:192.168.0.13 Bcast:192.168.0.255 Mask:255.255.255.0
خروجی نشان میدهد که eth0 یک دستگاه اترنت است و میتوانید IP آن را مشاهده نمایید.
اکنون که مشخصات دستگاه را تعیین کردیم میخواهیم متوجه شویم که آیا دستگاه eth0 در هسته جدید به درستی نصب شده است وکار خواهد کرد یا خیر. برای این کار نیاز داریم، نوع راهاندازی را که این دستگاه را مدیریت می کند پیدا کنیم. این عمل به راحتی با کمک لینک های موجود در فایلسیستم sysf و در یک خط فرمان انجام پذیر است :
$ basename `readlink /sys/class/net/eth0/device/driver/module`
e1000
حال که نام ماژول را میدانیم، باید پیکربندیی از هسته که مربط به آن است را پیدا کنیم. شما میتوانید در بین پیکربندیهای شبکه های مختلف جستجو کنید و یا اینکه مستقیما در میان کدهای هسته به دنبال آن بگردید:
$ cd ~/linux/linux-2.6.17.8
$ find -type f -name Makefile | xargs grep e1000
./drivers/net/Makefile:obj-$(CONFIG_E1000) += e1000/
./drivers/net/e1000/Makefile:obj-$(CONFIG_E1000) += e1000.o
./drivers/net/e1000/Makefile:e1000-objs := e1000_main.o e1000_hw.o e1000_
ethtool.o e1000_param.o
بخاطر داشته باشید که در هنگام اجرای این دستورات نام ماژول کارت شبکه را با e1000 جابجا نمایید.
مهمترین نکتهای که از خروجیهای قبل باید توجه کنید خطوطی است که دارای _CONFIG میباشد. آنها تنظیمات پیکربندیهای هستند که برای ایجاد ماژول باید آنها را فعال کنید. در همان مثال CONFIG_E1000 خصوصیتی است که باید آن را در پیکربندی فعال نمایید.
اکنون شما اطلاعاتی را که برای پیکربندی هسته نیاز داشتید پیدا کردید. ابزار پیکربندی را اجرا کنید:
$ make menuconfig
سپس دکمه / را فشار دهید و نامی را که از مرحله قبل پیدا کردیم بدون _CONFIG در آن بنویسید.
ابزار پیکربندی هسته به شما تنظیماتی را که لازم است فعال کنید نشان می دهد:
اولین گزینهای که در شکل بالا نمایش داده شده دقیقا همان خصیصهای است که شما به دنبال آن میگردید. در همان گزینه به شما محل دقیق آن تظیم نشان داده شده است:
Device Drivers
Network device support
[*] Network device support
Ethernet (1000 Mbit)
[*] Intel(R) PRO/1000 Gigabit Ethernet support
مثال : راهانداز USB
به عنوان مثال دیگر اجازه دهید به نصب راهانداز دستگاههای USB سیستم شما بپردازیم. فرض میکنیم که سیستمعامل به دستگاه شما آدرس dev/ttyUSB0/ را نسبت داده باشد. دستور زیر را اجرا کنید تا از وجود دستگاه مطمئن شوید:
$ ls /sys/class/tty/ | grep USB
ttyUSB0
میتوانید برای پیدا کردن ماژول کنترلکننده این دستگاه از دستور زیر استفاده کنید:
$ basename `readlink /sys/class/tty/ttyUSB0/device/driver/module`
pl2303
سپس کدهای هسته را برای پیدا نمودن پیکربندی مربوطه جستجو کنید:
$ cd ~/linux/linux-2.6.17.8
$ find -type f -name Makefile | xargs grep pl2303
./drivers/usb/serial/Makefile:obj-$(CONFIG_USB_SERIAL_PL2303) += pl2303.o
از ابزار پیکربندی هسته استفاده کنید و مانند شکل ۷-۳ نام تنظیم را جستجو کنید:
نتیجه جستجوی قبل را در شکل ۷-۴ می بینید:
به کمک آن میتوانید محل دقیق تنظیم USB Prolific 2303 Single Port Serial Driver را پیدا کنید و آن را فعال نمایید.
خلاصهای از یافتن راهانداز
به صورت خلاصه مراحلی را که برای پیدا نمودن راهانداز دستگاههای که هماکنون به هسته شما متصل هستند را مرور می کنیم:
- کلاس دستگاه مناسب در sysf پیدا کنید. دستگاههای شبکه در شاخه sys/class/net/ و دستگاههای tty در شاخه sys/class/tty/ لیست شده اند. انواع دیگر دستگاهها با توجه به نوعشان در شاخههای دیگر sys/class/ لیست شدهاند.
- درون شاخههای sysf به دنبال نام ماژول کنترلکننده آن دستگاه بگردید. که معمولا در آدرسی شبیه به /sys/class/class_name/device_name/device/driver/module/ قرار دارد و این آدرس را به عنوان ورودی به برنامه readlink و basename دهید:
$ basename `readlink /sys/class/class_name/device_name/device/driver/ module`
- در فایلهای Makefiles هسته به دنبال تنظیمات مربوط به این ماژول بگردید:
$ find -type f -name Makefile | xargs grep module_name
- در سیستم پیکربندی هسته به دنبال پیکربندیی که در مرحله قبل بود بگردید و آن را فعال نمایید.
به هسته اجازه دهید به ما بگوید به چه نیاز دارد
اکنون که به میزان لازم به ساختار sysf ها و نحوه پیدا کردن ماژول های مربوطه آشنا شدید در ادامه یک اسکریپت بسیار ساده را معرفی می کنیم که تمام مراحل را به روش دیگر اما سادهتر انجام می دهد:
#!/bin/bash #
# find_all_modules.sh
#
for i in `find /sys/ -name modalias -exec cat {} \;`; do
modprobe --config /dev/null --show-depends $i ;
done | rev | cut -f 1 -d '/' | rev | sort -u
این اسکریپت درون sysf جستجو میکند و تمام فایلهایی با نام modalias را پیدا میکند. فایلهای modalias حاوی نام مستعار برای ماژولهای میباشند که به دستور modprobe نشان میدهند که کدام ماژول برای کنترل یک دستگاه باید بارگذاری شود. نام مستعار ماژول از مخلوطی از نام سازنده، ID, Class type و دیگر خصوصیات یکتای این نوع دستگاههای میباشد. تمامی ماژولهای راهانداز هسته دارای لیستی از دستگاههایی که پشتیبانی میکنند هستند. modprobe به آن لیست نگاهی می اندازد و سعی می کند که آن را با نام مستعاری که دارد تطبیق دهد. در صورتی این دو بدرستی تطبیق داده شده باشد ماژول را لود میکند.
در این اسکریپت قبل از اینکه ماژول لود شود برنامه modprobe پایان میپذیرد و تنها نام ماژول را در خروجی چاپ میکند و در پایان لیستی از ماژولهایی را که برای برای کنترل دستگاههای این سیستم لازم است به شما ارئه می کند:
$ find_all_modules.sh
8139cp.ko
8139too.ko
ehci-hcd.ko
firmware_class.ko
i2c-i801.ko
ieee80211.ko
ieee80211_crypt.ko
ipw2200.ko
mii.ko
mmc_core.ko
pcmcia_core.ko
rsrc_nonstatic.ko
sdhci.ko
snd-hda-codec.ko
snd-hda-intel.ko
snd-page-alloc.ko
snd-pcm.ko
snd-timer.ko
snd.ko
soundcore.ko
uhci-hcd.ko
usbcore.ko
yenta_socket.ko
این اسکریپت ممکن است خطاهای مانند زیر را در خروجی نمایش دهد:
FATAL: Module pci:v00008086d00002592sv000010CFsd000012E2bc03sc00i00 not found.
FATAL: Module serio:ty01pr00id00ex00 not found.
که به این معنا است که نتوانسته ماژولی برای کنترل کردن آن دستگاه پیدا کند. زیاد نگران نباشید زیرا بعضی از دستگاهها راهانداز هسته ندارند.
مترجم: میلاد راستیان
rastian AT gmail DOT com
منبع:
PDF Version
|