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

转载 2007年09月26日 12:24:00

下载源代码

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

前期准备

大家都知道的要先升级“module-init-tools“软件包,否则的话,等你安装内核模块文件的时候,系统会提示你:Warning: you may need to install 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 (生成二进制的RPM包)  #cd ../RPMS/i386 (转入刚生成的二进制的RPM包所在位置)  #rpm -ivh modutils*.rpm (刚生成两个[modutils-2.4.21-23.i386.rpm    与modutils-debuginfo-2.4.21.23.i386.rpm]二进制的RPM包,一起安装吧!)
 

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

  #vi /etc/rc.d/rc.sysinit  找到:  if ! LC_ALL=C grep -iq nomodules /proc/cmdline 2>/dev/null    && [ -f /proc/ksyms ]; then  USEMODULES=y  fi  替换成:  if ! 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 linux-2.6.0.tar.gz /usr/src

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

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

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

二、定制内核

定制内核是门很大的学问,需要大量的硬件知识,特别是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 on unknown-block(0,0),我一开始不知道,编译了好几次,系统总给我冷板凳坐,最后把对Ext3、Ext2文件系统的支持直接编译进内核,才解决此问题,还有把对“Module unloading“选项也选上,否则的话,你在新内核环境下无法卸载内核模块(rmmod命令不能用)。

三、编译内核及模块

定制好的内核配置文件(/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.6GHz,128MB的机器上跑了足足27分钟。

四、安装模块及内核文件

#make modules_install install

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

说明:make modules_install install这个命令在我的1.6GHz,128M的机器上只跑了三十几秒,很快的哦。

五、后记

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

  #vi /etc/profile (在文件的末尾加上几句如下)  if [`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软件包(我是modutils-2.4.21- 23.src.rpm包),RedHat的用户可能还要修改/etc/rc.d/rc.sysinit文件。

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

linux内核的生成过程, vmlinux调试分析

1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息、符号表的最初的内核,大小约23MB;  ...
  • yandaqijian
  • yandaqijian
  • 2015年11月03日 14:13
  • 825

Linux内核编译流程

Process of the Linux kernel building(Linux内核编译流程)Introduction(简介)I won’t tell you how to build and i...
  • sunao2002002
  • sunao2002002
  • 2015年10月03日 17:51
  • 8613

Linux内核配置和编译过程详解

一、引言:  本文档的内容大部份内容都是从网上收集而来,然后配合一些新的截 图(内核版本:V2.4.19)。在每一配置项后会有一个选择指南的部份,用来指导大家怎么样 根据自己的情况来做相应的选择;还...
  • qq_29350001
  • qq_29350001
  • 2016年05月24日 12:48
  • 7911

编译linux内核 形成可运行的自己的linux系统

开始学习linux,听说可以建立一个自己的linux操作系统。      开始的时候就是看了些资料。说的是通过livecd(linux from scratch),来构建自己的linux系统。记得那份...
  • u013356289
  • u013356289
  • 2014年03月13日 22:49
  • 2841

【Linux】Linux添加系统调用以及内核编译过程

在想要替换原有系统内核或者需要在原来的系统中添加一些系统调用的时候就会涉及到Linux内核的编译。但是内核编译虽然步骤简单,但是需要注意的东西还是太多了。首先一点就是由于Linux的开源性导致的版本问...
  • Sugar_Z_
  • Sugar_Z_
  • 2015年09月15日 22:05
  • 783

arm-linux内核编译过程小结

记在前面的杂七杂八内核的生成,实际上最终的目的是生成一个binary文件zImage,大小2-5MB的数量级。用户可以从kernel.org得到的tar.gz格式的内核源代码,此代码解压后,就会生成初...
  • LoongEmbedded
  • LoongEmbedded
  • 2016年08月31日 10:45
  • 3018

《Android 之美 从0到1 -- 高手之路》

Android 之美 从0到1 – 高手之路 随着Android 面试题总结,已经形成比较多的篇幅,为了方便大家阅读,本篇将作为面试题总结导读,也将成为Android 面试题的大纲,也只是Andr...
  • vfush
  • vfush
  • 2016年05月26日 16:06
  • 8552

(mini2440)建立交叉编译环境+配置linux内核

(mini2440)建立交叉编译环境+配置linux内核 系统ubuntu12.04(非虚拟机下) mini2440 CPU型号:       S3C2440AL-40 Nanflash型号:K9...
  • muyang_ren
  • muyang_ren
  • 2014年09月21日 00:38
  • 3454

Mac OS X下(Ubuntu虚拟机)编译Linux内核

用了十天时间看完《Linux内核设计与实现》,想在Mac上编译Linux内核实践下。编译过程遇到了不少问题,根本原因还是对内核的编译、安装和启动的理解不够。流程整理1. 安装VMware和Ubuntu...
  • Elsa_Rong
  • Elsa_Rong
  • 2017年07月07日 11:16
  • 829

ubuntu16.04系统下的kernel 4.10的内核编译以及新增系统调用

1.下载编译过程中的所需的软件依赖包 首先下载编译过程中的编译依赖软件包,此步非常重要。 内核编译依赖软件包主要有一下几个: libncurses5-dev :主要是在make menuconfig时...
  • Xiaobai__Lee
  • Xiaobai__Lee
  • 2017年05月14日 18:37
  • 2879
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:走向Linux系统高手之路 内核编译过程解析
举报原因:
原因补充:

(最多只允许输入30个字)