Ubutun下编译Kernel

来源:互联网 发布:中国房价数据库 编辑:程序博客网 时间:2024/05/02 01:11

1p { margin-bottom: 0.21cm; }话说编译过Kernel,才算入门LINUX! 以前尝试过多次,都莫名奇妙的错误,今天又折腾了一下,终于看到 CC,LD....

编译Linux内核是内核开发的基本功,如果我们通过直接修改Linux内核代码来增加内核功能,那么修改后的内核代码必须要重新编译生成新的映像文件,然后加载该映像文件便可以启用新内核。

 不同的Linux发行版本,其内核编译过程会有所不同。这里所用平台是Ubutun9.10 Linux kernel为 2.6.31-23-generic,待编译的Linux kernel为2.6.36.4。此处仅仅是编译一个干净的内核并且加载成功,而并不对内核进行修改。

第一步:下载内核

一般情况下,待编译的内核(即新内核)的版本不能低于正在运行的版本,如果两者版本差距较大,则可能需要更新如gcc,binutils之类的编译工具。这里只采用Linux发行版所对应的内核版本进行编译,这样所有内核编译工具都是现成的,无须更新。

1)先查看当前环境下的内核版本号

#uname –r

2.6.31-23-generic

2)下载相应的内核压缩包

网址:http://www.kernel.org/(笔者选择的是linux-2.6.36.4.tar.bz2,只有67.0MB,起初怀疑下错了,怎么这么小>_<,解压缩后376.4MB)。将内核压缩包复制到Linux下某个目录,如/usr/src .p { margin-bottom: 0.21cm; }


 3)解压缩包生成代码树/usr/src/linux-2.6.36.4

指令如下:root@yuebao-desktop:~# tar jxvf   /home/yuebao/Downloads/linux-2.6.36.4.tar.bz2  -C  /usr/src/

#cd /usr/src/linux-2.6.36.4

说明:

1.从这里切到了root,后面的编译全部在root下进行。

2.如果选择的压缩包后缀是.gz,上3)中的第二条指令中的jxvf应换成zxvf。

第二步:生成内核配置文件.config

Linux内核代码非常庞大,使用于许多体系结构,包含大量驱动程序。在生成内核的时候要根据实际情况进行配置,所有的配置将保存在内核代码树顶级目录下的一个名为.config的配置文件中

 1)、复制配置文件模板

配置文件可以从头开始生成,一般没这必要,因为当前正在运行的内核已经有对应的配置文件,在/boot目录下。将其做模板复制到/usr/src/linux-2.6.36.4目录下:

#make mrproper

#cp /boot/config-‘uname –r’    ./.config

命 令“make mrproper”用来保证内核树是干净的,如果内核树已经编译过,该命令有效;如果内核树第一次编译,则可以省略该命令。命令“cp /boot/config-‘uname –r’ ./.config”中“‘uname –r’”代表2.6.31-23-generic,“./.config”中前一点表示将拷贝放置在开头进入的默认目录(即/usr/src /linux-2.6.36.4)中,并将其命名为.config的隐含文件。

2)、生成新内核的.config配置文件

拷贝后虽然有了模板,但是.config文件的配置并不一定囊括了新内核的所有编译选项,可以使用下面的命令:

 #make oldconfig或#make silentoldconfig

命 令“#make oldconfig”读取.config文件并根据新内核版本更新它。具体是:该命令输出新内核所有的配置值,如果配置项在.config中有设置,则输 出设置值;如果是新项,程序会暂停要用户输入设置值,如果不知道如何配置,可以一路enter,直到结束,采用默认配置。命令“#make silentoldconfig”和命令“#make oldconfig”功能相似,但他不输出信息,除非是新选项要求用户输入的时候。

到此,重新生成的.config文件就可以使用了。

第三步:编译和安装新的内核

1)、可以定义自己的内核版本号

在编译内核之前,用户可以定义自己的内核版本号,这样做目的是为了便于识别。在内核代码树的根目录下有文件Makefile,它的前4行的最后一行“EXTRAVERSION=.4”中的值.4可以修改。(当然可以对Makefile文件不做任何处理)

2)、编译新内核

执行下面三个命令:

#make all

#make modules_install

#make install

命 令“make all”用于生成期望的内核映像及模块;

“make modules_install”将安装模块到“ /lib/modules/<待编译内核版本号>”(本地文件系统,不是/usr/src/linux-2.6.36.4)下面,在此目录下会建立符号链接build到你的内核源码目录,我的 build -> /usr/src/linux-2.6.36.4,其中的一个作用就是 写自己模块的Makefile时,会用到,如helloWorld的Makefile,可以这样写

KERNELDIR ?= /lib/modules/2.6.36.4/build而不需要直接指明 /usr/src/linux-2.6.36.4。另外你会在“/lib/modules”文件夹中看到其他版本内核的 modules,包括当前系统环境的,不要手痒把这些文件夹删除了;

“make install”最终将内核映像等几个文件复制到“/boot”目录,把编译文件夹里面的“arch/x86/boot/bzImage”文件复制到“/boot”,同时还会复制 config 和 System.map 文件,最终在“/boot”会多出如下3个文件:
/boot/config-2.6.36.4
/boot/System.map-2.6.36.4
/boot/vmlinuz-2.6.36.4。

是不是发现缺少了一个 initrd.img 文件(初始ram磁盘文件)?使用下面命令创建一个即可:
$  mkinitramfs 2.6.36.4  -o /boot/initrd.img-2.6.36.4  


说明:对于双核处理器,命令“make all”可改用“make -j2 all”以加快速度。

3)、可以修改引导程序GRUB

如果上述三个命令均执行成功,用户可以观察到引导程序grub的配置文件/boot/grub/menu.lst并将其进行合理修改配置。打开menu.lst的方法之一是:

#gedit /boot/grub/menu.lst

说明:1、命令“gedit /boot/grub/menu.lst”只是用gedit打开配置文件menu.lst,其他还可以用eamcs,vim,cat,tail等。

           2、为了以后能直接操作菜单,可把menu.lst文件中hiddenmenu那一行注释掉(前加#)或删除,并且可以根据需要设置其中的default和timeout的值,分别表示默认启动项及等待时间。

假如你(对新内核没什么把握)不希望修改 GRUB 启动菜单,则可以直接在启动 Linux 时手动指定新内核,方法如下:
重启计算机,在 GRUB 菜单界面(假如没有看到的话则重启计算机时按下ESC键)按“c”进入命令模式,先设置启动文件的分区,下面假设 “/boot”位于第一块硬盘第一个分区,如果在其他分区则把下面的数字“1”改成“2,3,5,6,7……”等:
set root=(hd0, 1)

指定内核映像和虚拟ram磁盘文件位置:
           linux /boot/vmlinuz-2.6.36.4 root=/dev/sda1
           initrd /boot/initrd.img-2.6.36.4

注意,在 GRUB 命令模式下也可以按“TAB”键自动补完的,不要一个字一个字地敲。最后输入“boot”启动。

       4)、重启查看

用命令#reboot重启系统就可以看到GRUB菜单已经包含了新编译的内

原创粉丝点击