在這些高版本的RedHat Linux上,我們如果需要定製內核的話,沒有直接的源代碼rpm可以安裝,只能通過kernel.org下載的tar.gz的包手工安裝,或者通過kernel-*.src.rpm編譯出kernel-source包再來安裝。後面一種方法可以享受到RedHat針對內核的某些參數和代碼的優化,因此對使用RedHat發行版特別是企業版本的,是有一定好處的。
但是目前很多人至今分不清內核,內核開發,內核源代碼一些包之間的關系,因此在編譯內核的時候經常走彎路,同時RedHat官方對於如果得到kernel-source也沒有明確的指示,導致很多人不得要領。
首先認清楚各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版本內核代碼組織方式不同,不適用此文章。
以上這篇文章取自互聯網,我忘了出處,尊敬作者.
⑵ linux 編譯內核幾個常見問題解決方法
第一次把自己編譯的驅動模塊載入進開發板,就出現問題,還好沒花費多長時間,下面列舉出現的問題及解決方案
1:出現insmod: error inserting 'hello.ko': -1 Invalid mole format
法一(網上的):是因為內核模塊生成的環境與運行的環境不一致,用linux-2.6.27內核源代碼生成的模塊,可能就不能在linux-2.6.32.2內核的linux環境下載入,需要在linux-2.6.27內核的linux環境下載入。
a.執行 uname -r //查看內核版本
b.一般出錯信息被記錄在文件/var/log/messages中,執行下面命令看錯誤信息
# cat /var/log/messages |tail
若出現類似下面:
Jun 4 22:07:54 localhost kernel:hello: version magic '2.6.35.6-45.fc14.i686.PAE
' should be '2.6.35.13-92.fc14.i686.PAE'
則把 Makefile里的KDIR :=/lib/moles/2.6.35.6-45.fc14.i686.PAE/build1 改為
KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1 //改成自己內核源碼路徑
(這里的build1是一個文件鏈接,鏈接到/usr/src/kernels/2.6.35.6-45.fc14.i686.PAE和13-92的)
然並卵,我的fedora 14 /usr/src/kernels下並沒有2.6.35.13-92.fc14.i686.PAE,只有2.6.35.13-92.fc14.i686,雖然不知道兩者有什麼區別,但改成2.6.35.13-92.fc14.i686還是不行,照樣這個問題,還好後來在看教學視頻的到啟發
法二:改的還是那個位置
KDIR :=/opt/FriendlyARM/linux-2.6.32.2 //把這里改成你編譯生成kernel的那個路徑
all:
$ (MAKE) -C $ (KDIR) M = $ (PWD) moles ARCH=arm CROSS_COMPILE=arm-linux- //加這句
2. [70685.298483] hello: mole license 'unspecified' taints kernel.
[70685.298673] Disabling lock debugging e to kernel taint
方法:在模塊程序中加入: MODULE_LICENSE("GPL");
3. rmmod: chdir(2.6.32.2-FriendlyARM): No such file or directory 錯誤解決
方法:lsmod 可查看模塊信息
即無法刪除對應的模塊。
就是必須在/lib/moles下建立錯誤提示的對應的目錄((2.6.32.2)即可。
必須創建/lib/moles/2.6.32.2這樣一個空目錄,否則不能卸載ko模塊.
# rmmod nls_cp936
rmmod: chdir(/lib/moles): No such file or directory
但是這樣倒是可以卸載nls_cp936,不過會一直有這樣一個提示:
rmmod: mole 'nls_cp936' not found
初步發現,原來這是編譯kernel時使用make moles_install生成的一個目錄,
但是經測試得知,rmmod: mole 'nls_cp936' not found來自於busybox,並不是來自kernel
1).創建/lib/moles/2.6.32.2空目錄
2).使用如下源碼生成rmmod命令,就可以沒有任何提示的卸載ko模塊了[luther.gliethttp]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
const char *modname = argv[1];
int ret = -1;
int maxtry = 10;
while (maxtry-- > 0) {
ret = delete_mole(modname, O_NONBLOCK | O_EXCL);//系統調用sys_delete_mole
if (ret < 0 && errno == EAGAIN)
usleep(500000);
else
break;
}
if (ret != 0)
printf("Unable to unload driver mole \"%s\": %s\n",
modname, strerror(errno));
}
3).把生成的命令復制到文件系統
# arm-linux-gcc -static -o rmmod rmmod.c
# arm-linux-strip -s rmmod
# cp rmmod /nfs/
cp /nfs/rmmod /sbin
代碼如下:
proc.c
[html] view plain
<span style="font-size:18px;">#include <linux/mole.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h> /* Necessary because we use the proc fs */
#define procfs_name "proctest"
MODULE_LICENSE("GPL");
struct proc_dir_entry *Our_Proc_File;
int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)
{ int ret;
ret = sprintf(buffer, "HelloWorld!\n");
return ret;
}
int proc_init()
{ Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
if (Our_Proc_File == NULL) {
remove_proc_entry(procfs_name, NULL);
printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",procfs_name);
return -ENOMEM; }
Our_Proc_File->read_proc = procfile_read;//
// Our_Proc_File->owner = THIS_MODULE;
Our_Proc_File->mode = S_IFREG | S_IRUGO;
Our_Proc_File->uid = 0;
Our_Proc_File->gid = 0;
Our_Proc_File->size = 37;
printk("/proc/%s created\n", procfs_name);
return 0;
}
void proc_exit()
{ remove_proc_entry(procfs_name, NULL);
printk(KERN_INFO "/proc/%s removed\n", procfs_name);
}
mole_init(proc_init);
mole_exit(proc_exit);</span></span></span></span></span>
[html] view plain
<span style="font-size:18px;">
ifneq ($(KERNELRELEASE),)
obj-m :=proc.o
else
KDIR :=/opt/FriendlyARM/linux-2.6.32.2
#KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1
PWD :=$(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) moles ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif</span></span></span></span></span>
make後生成proc.ko,再在開發板上insmod proc.ko即可
執行 dmesg 就可以看到 產生的內核信息啦
⑶ cygwin下編譯linux2.6 kernel失敗,求解決方法!
linux2.6內核成功編譯
1) 需要的工具:
(1) 模塊工具:motils-2.4.21-23.src.rpm
//負責載入模塊,在2.4之前是不必獨立編譯
//模塊存放位置:/lib/moles/內核版本目錄/kernel/drivers
//lsmod: 查看已載入的模塊
(2) 原始碼:linux-2.6.9.tar.gz
//選擇需要編譯的部分: 最新內核2.6.9 支持NTFS分區(只讀)
//查看現有系統支持的文件系統: cat /proc/filesystems
//顯示內核版本: uname -r
反引號: 當作命令執行 cd /lib/moles/`uname -r`
(3) 能加上補丁:patch-2.6.9.gz
(2) 編譯內核的基本步驟
(1) 主要用的編譯命令: make make moles_install make install
(2) 基本安裝: 安裝模塊、安裝內核
------------------------------------------------------------------------------------------------------------------------------------------------
安裝2.6內核的步驟
1 安裝模塊:(1)執行rpm命令將motils-2.4.21-23.src.rpm
安裝到/usr/src/redhat/SOURCES
//rpm -ivh motils-2.4.21-23.src.rpm
//模塊工具是RPM包安裝後默認安裝在/usr/src/redhat/SOURCES
(2)在SOURCIES中含有2個文件mole-init-tools.tar.gz
motils-2.4.21.tar.gz
將mole-init-tools.tar.gz接壓
//tar -xzvf mole-init-tools.tar.gz
// motils-2.4.21.tar.gz文件不是主要要用的,不用接壓
(3)mole-init-tools.tar.gz文件接壓後會有一個
mole-init-tools-3.0-pre1
(4)進入到mole-init-tools-3.0-pre1 目錄中
//cd mole-init-tools-3.0-pre1
(5)在mole-init-tools-3.0-pre1 下編譯
//./configure --prefix=/moles然後執行make接著
make install到這模塊編譯完成
//注釋:/moles是自己建立的目錄,為了以後管理方便
當編譯模塊完成後在/moles文件下會有bin man sbin這3個目錄
(6)開機自動載入模塊編輯/etc/profile
//vi /etc/profile
(7)在/etc/profile文件中在添加 export上面一行 PATH=/moles/bin:/moles/sbin:$PATH
(8)進入到模塊的目錄/moles
進入到其中的sbin中執行一下命令
./generate_modprobe.conf /etc/modprobe.conf
//注釋:generate_modprobe.conf在文件sbin中有這個執行命令
/etc/modprobe.conf是自己輸入的,是規定的
//以上操作是為了規定init
(9)重新啟動計算機,或著source /etc/profile讓其本次操作有效
(10)目前開始編譯內核將linux-2.6.9.tar.gz接壓到/usr/src
//tar -xzvf linux-2.6.9.tar.gz -C /usr/src
(11)接壓後在/usr/src會有 linux-2.6.9目錄
(12)將 linux-2.6.9做一個連接文件
//創建鏈接文件: ln -s linux-2.6.9/ linux
//創建鏈接文件是為了方便管理
(13)進入到創建鏈接文件linux中開始編譯內核
首先運行make menuconfig選擇要編譯的內容,默認也能
//注釋M: 以模塊形式載入
*: 直接編譯進內核
空: 不做操作,不編譯
然後執行make
再後執行moles_install
最後執行make install
到此內核編譯完成
⑷ 我在linux環境下怎麼就是編譯不成功
編譯不成功多半軟體功能開關設置及依賴關系不支持。
首先要了解編譯的過程,真正了解了編譯的過程後就可以比較輕松的編譯各種軟體了。
1、configure,可以在configure 執行一下./configure --help來大致了解一下該軟體的一些開關和支持的性能,然後根據使用需要來設置需要開啟的性能和需要關閉的性能,以及需要哪些支持庫等等,然後再指定一下編譯路徑,做完這一切後,滿屏幕的check ....就開始了,這就是configrue的過程,和所做的事情
2、make,其實這一步才是真正的編輯步驟,而configure只是做一個環境的check,檢查系統環境及lib是不是對上一步所開啟的參數支持,只有check不出錯,也就是configure不出錯,就可以比較順利的進行編譯也就是make
3、make install 安裝,當成功編譯後就可以通過make install進行安裝了,安裝完成後就可以使用了。
比較容易報錯的地方就是configure這一步,因為這一步會檢查軟體及在configure這一步的設置開關功能中需要的依賴關系,並對現行系統進行檢查,尤其是最小化安裝的系統,報錯會比較多,可根據具體報錯內容來安裝相應的安裝包來完成軟體的依賴,直到check全部通過。有些軟體在make時也需要調用一些庫,具體要看軟體的reademe來了解具體編譯要求。如果再不行,就只能網上尋求幫助了。
另外,編譯也是一個經驗活,只編譯得多了,對一些常見的錯誤就會比較了解了,必定軟體依賴的庫常見的就那幾個,建議每編譯一款軟體做一個小筆記,把處理的錯誤或遇到的情況記錄下來,這樣以後再編譯時,會事半功倍!