用户名: 密码: 忘记密码? 注册

Linux kernel编译与安装

作者:  时间: 2010-11-14
文件: 内核配置参考.rar
大小: 51KB
下载: 下载
一、Linux kernel的配置  
   嵌入式系统是以应用为中心、软硬件可裁剪的计算机系统.而Linux系统之所以能被应用到嵌入式系统中的重要原因,是因为它具有可裁剪性.下面就来阐述如何对Linux系统进行裁剪、配置和定制.
(1)清除临时文件、中间文件和配置文件
   1、make clean     :remove most generated files but keep the config
      该命令可删除编译过程中产生的文件(如.o文件),但会保存配置文件.
   2、make mrproper  :remove all generated files + config files
      该命令可删除编译过程中产生的文件(如.o文件)和配置文件.
   3、make distclean :mrproper + remove editor backup and patch files
      该命令可删除编译过程中产生的文件(如.o文件)、配置文件、补丁包等.
   Attention!!!
   执行上述3条命令时,一定要在kernel源代码的根目录下执行.
  
(2)在配置kernel前,用户需要确定目标系统的软硬件配置情况,如CPU的类型、网卡型号,所需支持的网络协议等.
(3)配置linux kernel
   可采用下面4种命令来配置.
   1、make config    :基于文本模式的交互式配置(一问一答)
   2、make menuconfig:基于文件模式的菜单型配置(推荐)
   3、make oldconfig :使用已有的配置文件(.config),但会询问新增的配置选项.
   4、make xconfig   :图形化的配置(需安装图形化系统)
   Attention!!!
   1、make config与make oldconfig的相同之处在于两者都是基于文本模式的交互式配置,不同之处在于前者对kernel的每一个配置都会向用户进行询问,而后者不会对配置kernel的每个选项都向用户进行询问,它有一些默认配置.
   2、无论使用哪种配置命令,当配置完成后,在linux kernel源代码的根目录下会产生一个".config"隐藏文件,该文件记录了用户对kernel每个选项的配置结果.
           CONFIG_X86=y
           CONFIG_ARCH_DEFCONFIG=y
           CONFIG_GENERIC_TIME=y
           CONFIG_GENERIC_CMOS_UPDATE=y
    
(4)命令make menuconfig的配置方法
   1、使用方向键在各选项间移动
   2、使用Enter键进入下一层选单.每个选项上的高亮字母是键盘快捷方式,使用它可以快速的到达想要设置的选项单.
   3、在括号中按"y"将这个项目编译进内核中,按"m"编译为模块,按"n"为不选择(按空格键也可在编译进内核、编译为模块和不编译三者间进行切换),按"h"将显示这个选项的帮助信息,按"Esc"键将返回到上层选单.
   Attention!!!
   1、使用该命令配置kernel时,哪怕用户什么都不选择,也会在源代码根目录下产生一个".config"隐藏文件,只是该配置文件选择的是默认值.
   2、用户对kernel中的配置选项有三种选择,分别是"*"、"m"、" ".现举例说明这三种选择对最终生成的".config"配置文件的影响.
      例如:有4个配置选项,分别是1.c、2.c、3.c、4.c,则:
                 编译过程     编译结果
           (*)1.c ------------>    1.o
           (*)2.c ------------>    2.o
           (m)3.c ------------>    3.o
           ( )4.c     
      从上面可以看出,无论是选择为"*",还是选择为"m",在编译结束后都会生成".o"文件.区别在于当某个选项被选择为"*"时,它会和kernel源码中所有被选择为"*"的选项,一起经过链接最终生成uImage内核文件,而选项被选择为"m"时,生成".o"文件后便结束了,它是一个内核模块.
    
(5)kernel源码中各配置选项的含义
   

   从上图可以看出,kernel源码中各配置选项主要分为16种(在博客上可下载"内核配置参考.rar",该文档详细介绍了各配置选项的功能,感谢国嵌).
   1、代码成熟度选项(code maturity level options)
      Prompt for development and/or incomplete code/drivers
     显示尚在开发中或尚未完成的代码与驱动,除非你是测试人员或开发者,否则请勿选择.
   2、常规设置(general setup)
     上图中第1个选项.这种类型的配置选项非常多,用户需要根据需要进行选择.比如,在常规设置内可以选择是否显示内核版本,是否支持IPC,是否支持网络协议等.
   3、可加载模块支持(loadable module support)
      上图中第2个选项.一般来说,需要将Linux kernel选择为支持可加载模块.
   4、块设备层(block layer)
      上图中第3个选项.用户可根据需要来选择支持哪些块设备.
   5、CPU类型及特性(processor type and features)
      上图中第4个选项.用户可根据开发板CPU来设置这些选项.  
   6、电源管理选项(power management options)
      上图中第5个选项.该选项主要负责管理电源.
   7、总线选项(bus options)
      上图中第6个选项.该选项主要负责管理系统总线.比如,当用户的系统中没有PCI总线,可以将PCI总线选项去掉,使其不参加编译.
   8、可执行文件格式(executable file formats)
      上图中第7个选项.该选项主要负责系统中可执行文件的格式.比如,用户是否需要系统支持ELF格式等.注意,ELF是开放平台下最常见的二进制文件格式,支持动态链接,支持不同的硬件平台,除非用户知道自己在做什么,否则必选.
   9、网络(networking)
      上图中第8个选项.该选项主要负责系统所支持的网络协议.注意,该选项不是为了选择网卡.
  10、设备驱动程序(device drivers)
      上图中第9个选项.该选项主要负责系统所支持的硬件设备驱动.linux kernel在该选项内又将设备驱动程序细分为混杂设备、字符设备、GPIO设备、USB设备等.
  11、文件系统(file systems)
      上图中第10个选项.该选项主要负责系统所支持的文件系统.
  12、分析支持(instrumentation support)
      上图中第11个选项.该选项主要负责对内核行为进行分析.
  13、内核hack选项(kernel hacking)
      上图中第12个选项.该选项主要负责记录系统错误信息.
  14、安全选项(security options)
      上图中第13个选项.该选项主要负责系统的安全性.
  15、加密选项(cryptographic options)
      上图中第14个选项.该选项主要负责系统的加密工作.
  16、库子程序(library routlines)
      上图中第15个选项.注意,仅有哪些不包含在内核源码中的第三方内核模块才可能需要,可以全不选,内核中若有其它部分依赖它,会自动选上.
Attention!!!  
    通过上面的分析可以看出,linux kernel的配置选项非常繁杂,即使是开发人员也无法弄清所有选项的真实含义,为此,在实际开发中,通常会读入一个外部配置文件,然后根据自己的需要对该配置文件进行修改.这里,Linux显示出了非常人性化的特点,在linux kernel源码的arch/arm/configs目录下有许多配置文件.比如,若用户开发板的CPU是s3c2410,则可以该目录下的配置文件"s3c2410_defconfig"作为参考,然后根据自己的需要对该配置文件进行修改.
    [root@localhost linux-2.6.29]# cd arch/arm/configs
/*将该配置文件复制到源码根目录下,并覆盖隐藏文件".config"*/
    [root@localhost configs]# cp s3c2410_defconfig ../../../.config  
     cp : overwrite ../../../.configs?   y
 [root@localhost linux-2.6.29]# make menuconfig ARCH=arm
    这样,当用户对linux kernel再次配置时,就会看到某些选项被默认选择.比如,CPU类型被默认选择为s3c2410.此时,用户再根据自己的需要对该配置菜单进行修改.
 
二、Linux kernel的编译
   当用户通过上述方法对Linux kernel配置完成后,就可以对其进行编译.
(1)在x86平台上对Linux kernel进行编译
   编译结果供x86平台使用,常使用下面两条命令.在x86平台的区别在于"make zImage"只能用于小于512k的内核.如果使用"make zImage"编译了大于512k的Linuxkernel,则编译会报错.
   1、make zImage
   2、make bzImage
   Attention!!!
   1、如需获取详细的编译信息,可使用:
      make zImage V=1
      make bzImage V=1
   2、编译好的内核位于源码根目录下的arch/<cpu>/boot目录下.
   3、在虚拟机上运行的Linux kernel也需要配置文件,该配置文件是/boot目录下的config-2.6.18-53.el5文件.用户可对该配置文件进行修改.
      [root@localhost linux-2.6.29]# cp /boot/config-2.6.18-53.el5 ./.config     /*将虚拟机上Linux kernel的配置文件复制为源码根目录下的.config*/
      [root@localhost linux-2.6.29]# make menuconfig
           对配置文件修改完成后
      [root@localhost linux-2.6.29]# make bzImage    /*编译,生成可执行文件*/
(2)内核模块的编译与安装
   1、内核模块是在make menuconfig时设置为"m"的选项,编译命令是"make modules".
      Attention!!!
      1、make bzImage只会编译设置为"*"的选项.
      2、make modules只会编译设置为"m"的选项.
   2、内核模块的安装是将编译好的内核模块复制到源码根目录下的lib目录内.安装命令是"make modules_install".若Linux内核版本为2.6.29,CPU为x86,则内核模块被复制到:
      [root@localhost linux-2.6.29]# ls /lib/modules/2.6.29/kernel/arch/x86/kernel
(4)制作init ramdisk
   命令格式: mkinitrd initrd-$version $version
   例    如: mkinitrd initrd-2.6.29 2.6.29
   Attention!!!
   1、$version可以通过查询/lib/modules下的目录得到.
   2、第二个2.6.29表示Linux kernel版本,要求在源码根目录linux-2.6.29/lib/modules下必须有目录2.6.29
   3、制作完成后,在源码根目录下会生成目录initrd-2.6.29
 
三、自制x86平台下的Linux系统
(1)从Linux官网(
www.kernel.org)下载Linux kernel源码包(linux-2.6.31.tar.bz2)并解压.
   [root@localhost lishuai]# tar xjvf linux-2.6.31.tar.bz2
(2)不做任何修改,重新编译Linux-2.6.31内核,这样就生成了配置文件".config".
   [root@localhost lishuai]# make menuconfig
   [root@localhost lishuai]# ls -a
(3)为了制作基于x86平台的Linux系统,这里可以使用虚拟机上原有的Linux kernel配置文件. 
   [root@localhost lishuai]# cp /boot/config-2.4.20-8 ./.config
       cp : overwrite ../../../.configs?   y
(4)根据用户需求,修改配置文件(config-2.4.20-8),再执行配置命令.
   [root@localhost linux-2.6.31]# make menuconfig
(5)对Linux kernel重新编译,生成可执行文件,该文件放在目录linux-2.6.31/arch/x86/boot下,文件名为bzImage
   [root@localhost linux-2.6.31]# make bzImage
(6)重新编译内核模块.
   [root@localhost linux-2.6.31]# make modules
(7)安装内核模块,并在目录/lib/modules下查看是否生成了内核模块目录2.6.31
   [root@localhost linux-2.6.31]# make modules_install
   [root@localhost modules]# ls
(8)制作ramdisk,并查看源码根目录下是否生成了目录initrd-2.6.31
   [root@localhost linux-2.6.31]# mkinitrd initrd-2.6.31 2.6.31
   [root@localhost linux-2.6.31]# ls
(9)将Linux kernel可执行文件bzImage复制到目录/boot/vmlinux-2.6.31下
   [root@localhost /]# mkdir vmlinux-2.6.31
   [root@localhost linux-2.6.31]# cp arch/x86/boot/bzImage /boot/vmlinux-2.6.31
(10)将(源码根目录下的)ramdisk文件复制到/boot目录下
   [root@localhost linux-2.6.31]# cp initrd-2.6.31 /boot
(11)修改/etc/grub.conf或/etc/lilo.conf,该文件中包含了Linux启动时的提示信息,如下所示:
   title  Red Hat Enterprise Linux Server (2.4.20-8)
            root (hd0,0)
            kernel /vmlinuz-2.4.20-8 ro root=/dev/VolGroup00/LogVol00 rhgb
            initrd /initrd-2.4.20-8.img 
   修改为:
   title  mylinux
      root (hd0,0)
      kernel /bzImage-2.6.31 ro root=/dev/VolGroup00/LogVol00 rhgb
      initrd /initrd-2.6.31.img  
  
这样,在你的Linux虚拟机上就会增加了一个自己制作的系统.