我的笔记本是联想的s205,在装上fedora15后,无线网不能正常开启,每次都要rmmod acer_wmi才能正常使用;再加上一些其他的原因,想编译内核试试。
既然自己编译嘛,就用目前最新的3.0咯。
不过,fedora15的维护团队考虑了兼容性问题,把linux3.0硬是改成了linux2.6.40来使用。详情可参考这篇文章http://linuxtoy.org/archives/fedora-15-2-6-40-kernel.html
所以,下载的3.0内核派不上用场咯。还是去编译linux2.6.40内核吧。详细步骤这里有官方的文档http://fedoraproject.org/wiki/Docs/CustomKernel#Get_the_Source
但是这个文档有点小问题,如果完全按照他的操作,自己配置的内核参数,或make localmodconfig,是不能生效的。
原因如下:
kernel.spec:1088
# Dynamically generate kernel .config files from config-* files
make -f %{SOURCE20} VERSION=%{version} configs
编译时用到的.config是自动生成的,生成的规则在:
Source20: Makefile.config
然后看Makefile.config:19
configs: $(CONFIGFILES)
这个CONFIGFILES是这样定义的:
CFG = kernel-$(VERSION)
CONFIGFILES = \
$(CFG)-i686.config $(CFG)-i686-debug.config \
$(CFG)-x86_64.config $(CFG)-x86_64-debug.config \
$(CFG)-s390x.config $(CFG)-arm.config \
$(CFG)-ppc.config $(CFG)-ppc-smp.config \
$(CFG)-sparc64.config \
$(CFG)-ppc64.config $(CFG)-ppc64-debug.config \
$(CFG)-ia64.config
自己的笔记本嘛,当然是i686架构的,而且不需要搞什么调试。所以需要这个文件:kernel-2.6.40-i686.config。那这个文件是怎么来的呢?
看了一下他写的编译脚本,有点雾雾的,不如直接看编译时的打印信息吧:
……
cat config-generic config-nodebug > temp-generic
perl merge.pl config-x86-generic temp-generic > temp-x86-generic
perl merge.pl /dev/null temp-x86-generic i386 > kernel-2.6.40-i686.config
……
嗯,kernel-2.6.40-i686.config是由config-x86-generic文件转过来的~(config-generic和config-nodebug貌似没什么用)
这就是问题的所在,官方文档里在配置完内核后,保存为config-i686,而实际上用的是config-x86-generic
好,改名字,编译。结果报错……
在kernel.spec的1288处:
# now run oldconfig over all the config files
for i in *.config
do
mv $i .config
Arch=`head -1 .config | cut -b 3-`
make ARCH=$Arch listnewconfig | grep -E '^CONFIG_' >.newoptions || true
%if %{listnewconfig_fail}
if [ -s .newoptions ]; then
cat .newoptions
exit 1
fi
我不明白他make listnewconfig是什么目的……不过不要紧,注意到这是在一个循环中,是为各种不同的内核生成.config。查了查输出信息,是在编译i686-PAE内核时报的错。我笔记本内存2g,不用PAE内核,哦也~
于是把Makefile.config里的CONFIGFILES变量改改,去掉PAE的依赖。
哈,编译成功,结束后直接生成了rpm包,爽啊,^_^