首先認清楚各rpm包的內容和用途 kernel-*.rpm ------------- 內核二進制包,沒有的話系統都起不來 kernel-sourcecode-*.rpm------------------- 內核源代碼包,安裝到/usr/src/linux-*下面的,包含內核源代碼,編譯內核必須(當然是不考慮用kernel.tar.gz編譯的情況),但高版本RedHat Linux不再提供此rpm,原因參見官方Release Note,這篇文章的最終目的就是要我們自己把這個包搞出來。 kernel-devel-*.rpm----------------內核開發包,安裝到/usr/src/kernels,用於內核模塊開發,組織形式跟內核源代碼包類似,包含了部分內核源代碼。注意很多人誤認為這個就是內核源代碼包,直接拿它來編譯內核,當然不可能成功。這個包只是用於內核模塊一級開發,例如驅動程序等,雖然也可以make menuconfig make dep等,但make bzImage是不可能成功的,因為缺失了核心源代碼。 kernel-*.src.rpm---------------RedHat提供的用於建立rpm的源代碼包,安裝到/usr/src/redhat中,使用rpmbuild可以從這個包中build出上面所說的所有包。
現在就來從src.rpm編譯出上面的所有的包,除了sourcecode這個包其他的包都可以在不用修改任何地方的情況下直接rpmbuild出來,唯有sourcecode這個比較麻煩,一定要按照下面的步驟來做,我以RedHat AS4 所帶的版本為例,其他版本相同。
#首先安裝src.rpm rpm -ivh kernel-2.6.9-5.EL.src.rpm #進入相應目錄,要修改spec文件 cd /usr/src/redhat/SPECS vi kernel-2.6.spec #主要修改如下地方: 1,define buildsource 0------------我的這個在第8行,改為1,這就是為什麼沒有源代碼包的原因,因為默認不生成源代碼包 2, Requires: qt-devel, gtk2-devel readline-devel ncurses-devel-------我的在572行,如果沒用用X的話,把這句注釋掉,這樣編譯出來的包就不依賴於X-window的某些包,因為內核配置是可以make xconfig的,所以默認依賴X-window,我沒裝X-window,因此這個就去掉了。 #保存退出 touch /etc/beehive-root #這句命令非必須,如果不做的話,最後編譯出來的包都會變成kernel-*.*-root.rpm,多了個root,據說是為了標示包的編譯人的,如果touch了這個文件,就沒有這個問題了,命名和官方rpm一樣。 rpmbuild -ba --target=i686 ./kernel-2.6.spec #編譯i686平台的所有包,這樣上面介紹的所有包都會生成,或者換成rpmbuild -bb --target=i686 ./kernel-2.6.spec只編譯非src.rpm。 #所有包就會生成到/usr/src/redhat/RPMS/i686下面
#如果只需要sourcecode而並非所有rpm包,那在修改spec文件時還要修改如下行:
48 %ifarch noarch 49 %define builddoc 1 50 %define buildsource 0----------------這裡0修改為1 在編譯的時候使用rpmbuild -ba --target=noarch ./kernel-2.6.spec,這樣僅僅編譯soucecode和doc包,會節省很多時間。
注意,此篇文章所講所有內容僅適用於使用2.6內核的新版本RedHat Linux,2.4版本內核代碼組織方式不同,不適用此文章。
摘自:chinaunix.net