作者: Baron. Wan
先將新的驅動程式下載下來, 一般會用到的, 像是 新式的網路卡, 最新的SATA or SAS 硬碟, 這些在 舊式的 kernel 可能都尚未包進去, 而新的驅動程式也要確認有包含在多少的 kernel 版本當中 (2.4 or 2.6), 確認之後, 先給它依照驅動裡面說明 (REAMDE) 來進行安裝, 看是否可正常運作, 如無問題, 則可接下去操作啦.
可以先到 kernel.org 處下載 kernel source code, 通常是 linux-{版本號}.tar.gz , 我習慣將它解到 /usr/src/kernels/ 當中, 緊接著還要去下載需要加入的驅動程式, 將驅動程式放到 /usr/src/kernels/linux-{版本}/drivers/..., 比如: 這個新的驅動程式是屬於 sata, 則放到 scsi/ 的 folder 當中, 建議最好整個 driver 's folder 都 copy 過去, 裡面通常都會有 Makefile, .h, .c or .o 等等可供 compiler 的完整資訊; 編輯 scsi/ folder 裡面的 Makefile, 添加一筆 新的裝置, 內容應該像這樣:
obj-$(CONFIG_SCSI_{your device name}) += libata.o {your device folder}/
[註] libata.o 是否需要加入, 可查看剛剛測試加入新的 module 之後, 在 /lib/modules/`uname -r`/module.dep 裡面, 該 device 是否有延伸的 module 需要驅動, 理論上所有 sata driver 都需要添加 libata.o 這一筆.
之後是添加一筆新的裝置到 Kconfig, 它負責顯示在我們選擇功能上 make *config 的內容裡:
config {device_name}
tristate "show device information,only english"
depends on SCSI_SATA && PCI -- 歸屬於哪個裝置或設備上
default {y|m|n} -- 可設定預設值
help -- 當移到該功能時, 會秀出以下的資訊
........(以下省略)
在要編譯的 kernel-{version}/linux-{version}/ source_code 中,
使用 make oldconfig or make menuconfig 來將剛剛新建的 driver 含入, 存成 .config
我習慣先行利用 make clean modules;make modules_install install 來產生新的 kernel, 重新開機 try try 確定沒有問題.
重新進入 kernel-{version}/linux-{version}/ , 將 .config 先行備份 config-default, 執行 make mrproper 做清理的動作, 將 config-default copy 到 .config, 執行 make rpm-pkg . 執行的結果是存在 /usr/src/redhat/RPMS/i386/ 與 SRPMS/ 當中各產生一個 rpm 檔案, 當然是要給它執行確認是否可以用!!
# rpm -ivh --nodeps kernel-{version}.i386.rpm
請務必加入這個 --nodeps 參數, 否則會出現 error:
error: Failed dependencies:
kernel >= 2.6.10 conflicts with lksctp-tools-1.0.2-6.4E.1.i386
** 經由 2.6 kernel compiler 之後的 modules , 眼尖的人可能發現到, 怎麼每個 .ko 檔都變肥了 ? 我也是因為這個原因找了很多網站, 一次想說放棄的心情下, 無意中找到這個網站, 內容直接說明一個指令 strip , 經由這個網站的大大說明, 請不要直接使用 strip 下去跑, 因為沒帶參數的這個指令, 是個殺傷力極大的...; 後來我從 [Linux 指令參考手冊-O'Reilly] 當中, 找到了關於這個指令的描述: 從目的檔 files 中, 將符號移除。哇! 的確很強, 如果不帶參數, module 裡面所有的符號統統被刪除, 那還能用嗎 ?!! 所以, 我決定採用那位網站的大大所說: strip -g -s -d *.ko 照此方式操作, 結果很好, 另外, 我又將它給發揚光大, 把 strip 跟 find 結合, 哈哈...就可以修改所有的 .ko 囉.
方法如下:
strip -v -x(or -g -S -d) `find kernel/ -name *.ko`
希望以後會有更加便利的方式, 讓整合資源簡單化, 這樣 Linux 就會越來越普及。