内核的配置与编译

Linux的内核是可以配置的,就是说可以根据用户的需要进行配置,正是因为Linux的内核可以自由的配置,自由的裁剪,减小内核的体积,才使得Linux的内核可以移植到arm平台上去。

Linux内核配置具体步骤如下:

1.  清除临时文件,中间文件和配置文件(为什么要清除呢?在得到一个内核以后会有许多垃圾文件需要清除)

$make clean(删除垃圾文件 保留配置文件)

$make mrproper(删除垃圾文件 删除配置文件)

$make distclean(删除垃圾文件 删除配置文件 删除补丁文件)

2.  确定目标系统硬件配置情况,比如cpu的类型,网卡型号,所需支持的网络协议,修改Makefile

3.  使用如下命令之一配置内核

$make conifg 基于文本模式的交互式配置(执行之后会在配置的过程中通过提问的方式来配置)

$make menuconfig 基于文本模式的菜单配置

$make oldconfig 使用已有的配置文件(.config)与make config的区别只做表明为new的配置项

$make xconfig图形化配置选项(需要安装图形化界面)

 有一些默认的符号其含义如下:
       y:加载
       n:不加载
       m:作为模块加载 

使用完以上congfig命令之后,会自动生成一个.config文件,文件的信息保存了内核配置的结果。

要配置arm的内核,可以根据arch中的默认配置在此基础上修改。

root=/dev/nfs rw nfsroot=192.168.1.100:/source/rootfs ip=192.168.1.200 init=/linuxrc console=ttySAC0,115200

root 指定根文件系统

rw/ro 指定挂载文件系统的属性,读写、只读

nfsroot 指定nfs服务挂载点,<nfs server ip>:<export directory>

ip 指定目标板ip地址

init 指定内核初始化完成后调用的用户空间程序,缺省为/sbin/init

console 指定打印信息的终端

mem 指定内存大小

initrd 指定ramdisk引导时根文件系统所在内存位置和大小

 

4.  编译内核

make zimage

make bzimage(big的意思)

区别:在X86平台,Zimage只能用于小于512k的内核

编译好的内核位于arch/cpu/boot目录下

5.  编译内核模块

make modules

6.  安装内核模块

make modules_install(将编译好的内核模块从内核源代码目录copy到/lib/modules下)

7. 制作 init ramdisk

mkinitrd  initrd-$version  $version
例:mkinitrd  initrd-2.6.29  2.6.29
      $version 可以通过查询/lib/modules/下的目录得到,看上一步的命令是否有在/lib/modules/下产生2.6.29/目录。该命令执行后会在内核根目录下生成"initrd-2.6.29"文件。

       init ramdisk的作用:提供一种让内核可以简单使用ramdisk的能力。这些能力包括:格式化一个ramdisk;加载文件系统内容到ramdisk;将ramdisk作为根文件系统。

      8.内核安装
       由于Linux系统启动时,会从/boot目录下来寻找内核文件与init ramdisk,所以需要将内核文件和init ramdisk拷贝到/boot目录。
(1) cp   ./arch/x86/boot/bzImage    /boot/vmlinuz-$version
例:cp ./arch/x86/boot/bzImage    /boot/vmlinuz-2.6.29
注:vmlinuz-2.6.29可以任意取名,这里只是取比较有意义的名字而已。
(2) cp   $initrd    /boot/
      $initrd指命令mkinitrd  initrd-$version  $version执行后在内核根目录下生成的"initrd-2.6.29"文件,即init ramdisk文件。
例:cp   initrd-2.6.29    /boot/
(3) 修改/etc/grub.conf或者/etc/lilo.conf
将代码:
title CentOS-base (2.6.18-238.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-238.el5 ro root=LABEL=/ rhgb quiet
        initrd /initrd-2.6.18-238.el5.img
复制并且改成:

title chen (2.6.29)
        root (hd0,0)
        kernel /vmlinuz-2.6.29 ro root=LABEL=/ rhgb quiet
        initrd /initrd-2.6.29

其只是根据本文的具体情况,对kernel的vmlinuz-2.6.18-238.el5 改成vmlinuz-2.6.29 ,将initrd的initrd-2.6.18-238.el5.img改成initrd-2.6.29

**$version为所编译的内核版本号,本文采用2.6.29(即$version=2.6.29)**