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; }
指令如下: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菜单已经包含了新编译的内
- Ubutun下编译Kernel
- ubutun下NDK编译环境配置
- Ubutun 16.04下Android源码编译
- ubutun 14.04 编译 systemtap
- ubutun下安装mysql
- ubutun下卸载mysql
- Ubuntu 11.04下编译kernel
- ubutun 下编译linux内核并添加为新的启动项
- ubutun 下 Pygments的安装
- ubutun下双屏显示切换
- Ubutun下的JDK配置
- Ubutun 下的MySQL安装
- Ubutun下如何安装redmine
- win7下安装ubutun双系统
- ubutun
- Ubutun
- 好玩:在vs2008下编译uclinux kernel
- Gentoo 下编译linux kernel 3.0
- java中使用正则表达式注意事项
- 编程累的时候,来看一下吧。
- 【一个android小应用的诞生全过程】【7.26-2011】
- strlen源码剖析
- 播放器关键代码(WINDOWS编程)
- Ubutun下编译Kernel
- 有时候想:博客要是像微博那么方便就好了。
- sql server 数据库日志过大,截断日志
- ★急★进本人博客的必看!
- 风格化的 Toggle Buttons
- 修改muduo兼容centos5
- spring与struts2的几种集成方案(部分内容转载网络)
- PowerDesigner(CDM—PDM—SQL脚本的转换流程)
- asp.net OnClientClick和OnClick事件