linux内核编译:走向Linux系统高手之路 内核编译过程解析



源代码

Linux内核总是不断发展最新内核Kernel2.6.0对USB2.0予以正式支持以及内核模块文件后缀最显著个变化由*.o到*.ko等等我们可以从www.kernel.org到tarball源代码包

前期准备

大家都知道要先升级“module-init-tools“软件Software包否则等你安装内核模块文件时候系统会提示你:Warning: you may need to module-init-tools See http://www.codemonkey.org.uk/post-h...4.21-23.src.rpm

进入目录下并安装:

  #rpm -e --nodeps modutils (强行卸载原有modutilsRPM包)  #rpm -ivh modutils-2.4.21-23.src.rpm

(把源代码包安装到了 /usr/src/redhat目录下) 

 #cd /usr/src/redhat/SPECS (进入规范标准文件目录下)

  #rpmbuild --bb modutils.spec (生成 2进制RPM包)

  #cd ../RPMS/i386 (转入刚生成 2进制RPM包所在位置) 

 #rpm -ivh modutils*.rpm (刚生成两个[modutils-2.4.21-23.i386.rpm

和modutils-debuginfo-2.4.21.23.i386.rpm] 2进制RPM包起安装吧!)





是在RedHat9.0平台RedHat用户可能还会遇到些麻烦我会慢慢说除了要以上升级的外还有个文件(/etc/rc.d/rc.sysinit)可能有缺陷/proc/ksyms文件在新内核(Kernel2.6.0)中已经没有了打开文件命令如下:

  #vi /etc/rc.d/rc.sysinit  找到:   ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null

&& [ -f /proc/ksyms ]; then  

USEMODULES=y  fi 

 替换成:   ! LC_ALL=C

grep -iq nomodules /proc/cmdline 2>/dev/null;

then  USEMODULES=y  fi





也就是把“&& [ -f /proc/ksyms ]”去掉保存文件(操作的前最好做备份以免删错这个文件是系统脚本重要很)这样子内核才能加载模块当然能启动iptable了否则在新内核中启动时红色“failed“非常醒目(请在新内核中核查/proc/sys/kernel/modprobe中内容是不是: /sbin/modprobe也可手工注入指令:#echo "/sbin/modprobe" > /proc/sys/kernel/modprobe)下面开始构造新内核







、准备源代码

1、下载到tarball包的后将内核tarball包复制到/usr/src目录下假定包在当前目录中运行以下命令:

#cp -2.6.0.tar.gz /usr/src

2、转到/usr/src目录并解开tarball包

  #cd /usr/src  #tar xvzf -2.6.0.tar.gz



3、如果你还下载了补丁包则打上补丁你也可以运行scripts/patch-kernel脚本文件自动打上补丁(准备好补丁包)或 #zcat patch-2.6.0.gz|patch -p1

2、定制内核

定制内核是门很大学问需要大量硬件知识特别是2.6.0内核如果你从 2.4.N配置文件装载进去很多人遇到过麻烦我是重新配置文件(X窗口进行)配制内核的前请清理源代码树如果还没有进入 /usr/src/linux-2.6.0目录请进入此目录命令如下:

  #make mrproper (刚解开tarball包不需此步骤)  #make gconfig (需要Gtk开发库支持)  

或make config  或make xconfig(需要Qt开发库支持)





注意:如果你是ext3文件系统则在定制内核配置文件时把对Ext3、Ext2文件支持直接编译进内核否则等你启用新内核时机器就会当掉出错信息如下:kernel panic : no init found ,try passing init = option to kernel......或者是:kernel panic:VFS:Unable to mount root fs _disibledevent=> 3、编译内核及模块

定制好内核配置文件(/usr/src/linux- 2.6.0/.config)的后激动时刻到来了编译内核及模块#make (此命令已完成make bzImage及make modules工作),bzImage内核文件在arch/i386/boot目录中CPU区别内核文件存放位置也区别我是Intel CPU

注意:我在RedHat7.2平台时曾出现无法编译出错信息出错信息如下:

  /tmp/cc2Hu7sH.s:3: Error: Unknown pseudo-op: `.incbin'  make[1]:

*** [usr/initramfs_data.o] Error 1  make:

*** [usr] Error 2





重新装了个9.0才解决此问题介绍说明:make命令在我1.6GHz128MB机器上跑了足足27分钟







4、安装模块及内核文件

#make modules_

以上这个命令可以分解成make modules_和make make modules_安装内核模块到/lib/modules/2.6.0下make 完成mkinitrd命令及内核(bzImage)和.map拷贝请查看/boot目录文件名是有区别如是GRUB 引导器make 命令已帮你自动修改了引导选项对于LILO则要手工修改重写引导记录

介绍说明:make modules_ 这个命令在我1.6GHz,128M机器上只跑了 3十几秒很快

5、后记

最后工作就是重启系统(#shutdown -r now),检验下你劳动成果吧差点忘了还有可能对你很重要进入新内核的后我发现rpm命令不能用了原来这是RPM个Bug特别是对于RH9用户请打开/etc/profile文件命令如下:

  #vi /etc/profile (在文件末尾加上几句如下)   [`uname -r`="2.6.0" ];

then  export LD_ASSUME_KERNEL=2.2.5 fi





也就是给系统加上个全局环境变量也可直接键入#export LD_ASSUME_KERNEL=2.2.5

使用新内核可能出现问题及对策:

1、新内核根本起不来解决思路方法:重新配置内核(学问挺大)也许还根引导记录有关(很少了)

2、新内核模块无法加载会导致很多问题比如了防火墙没法工作了mount不上光盘和vfat及ntfs文件系统其解决思路方法:升级module- init-tools软件Software包(我是modutils-2.4.21- 23.src.rpm包)RedHat用户可能还要修改/etc/rc.d/rc.sysinit文件

3、RedHat用户rpm命令不能使用解决办法:请把变量在全局配置文件中声明



Tags:  linux内核编译命令 linux重新编译内核 如何编译linux内核 linux内核编译

延伸阅读

最新评论

发表评论