Press "Enter" to skip to content

Linux更新内核

1,准备工作
安装基础包:yum install -y gcc make bison ncurses-devel rpm-build
要编译内核就必须有新的内核,可以从Kernel官方网站www.kernel.org上下载最新的内核源码,解压,进入目录;

2,清除垃圾
一般是在就内核重新编译时使用,在编译新的内核是不需要的;
make clean及make mrproper;

3,内核裁减
内核裁减配置的原则: 从实际出发。 如:根据支持的硬件设备来决定需要选择的驱动模块,根据需要选择所支持的文件系统格式等; 具体配置命令为:
make config:通过命令接口,依次要求你设定每个选项,如果.config文件存在,会根据该文件来设置默认值;
make menuconfig:最常用,显示以curses为基础的、终端式的配置菜单。
make xconfig:图形界面,显示以Tk为基础X Window配置菜单。
说明:这一步中选择为M模式的,编译到/lib/modules/下相关目录文件中;选择为*模式的,编译到内核中即/boot/vmlinuz中,启动时加载到内核中。 具体内核裁减配置参阅其它资料。

可能出现的问题:
make menuconfig时提示make: *** No rule to make target `config’. Stop.
解决方法:没有在正确的目录里进行make menuconfig,一定要进入正确的目录,比如/root/linux-2.6.32.27,然后再执行make menuconfig。

4,生成依赖关系
make dep
内核源码树中大多数文件都会与一些头文件有依存关系,要想编译内核顺利,在正式编译前必须让内核源码树中的各个Makefile文件知道这些依存关系。 make dep读取配置过程生成的配置文件,来创建对应于配置的依赖关系树,从而决定哪些需要编译而那些不需要。依存关系建立期间会在内核源码树中每个子目录里产生一个隐藏的.depend文件,此文件内含子目录里各个文件所依存的头文件清单。

5,建立内核映像和模块

2.4内核:
make bzImage :在arch/YOUR_ARCH/boot/中生成在在zImage内核映像文件;
make modules :在相应目录下生成内核模块(即驱动模块)

2.6内核:
make :作用相当于make bzImage与make modules

6,安装模块
make modules_install:让make modules或make 过程中产生的.o驱动模块拷入/lib/modules/下相应目录中;

7,安装内核
第一种情况:直接使用make install命令即可
第二种情况:先采用cp arch/i386/boot/bzImage /boot/×××(×××表示自己随意的命名) mkinitrd /boot/×××.img 2.6.12.6(内核版本号) 修改/boot/grub/grub.conf即可。

ok,经过以上的繁琐而必要的过程后,如果过程顺利的话,重启系统即可使用刚编译完的内核了。

参考文档:
http://www.linuxde.net/2013/03/13124.html

=============================================================

RHEL6.1使用rpmbuild方式升级内核

RHEL是一个商业支持的Linux版本,他的软件可以免费获得,免费使用,但是补丁和技术支持则需收费。

但是根据GPLv2协议,对内核的任何改动都必须公布代码,所以RedHat只将源码公布在官方的FTP上,没有给出二进制包。对于没有买RHEL服务的人来说,则需要自己手动将源码编译成RPM二进制包。

在RHEL5上,编译kernel.src.rpm时候,非常轻松,一个命令就可以搞定,但是在RHEL6.1的时候,杯具了。。。。一方面,RedHat为了遏制Oracle的OEL,改变了一些打包方式。另一方面,内核变化很大,从2.6.18变成2.6.32,跨度太大,有些地方有改变。

OS:CentOS 6.1,kernel:2.6.32-131.0.15.el6.x86_64

请保证/root可用空间在20G以上。

1,获取kernel.src.rpm

lftp ftp.redhat.com:/pub/redhat/linux/enterprise/6Server/en/os/SRPMS
get kernel-2.6.32-131.6.1.el6.src.rpm    #这个是最新的kernel.

2,安装基础包

yum install make gcc redhat-rpm-config patchutils xmlto asciidoc elfutils-libelf-devel zlib-devel binutils-devel newt-devel python-devel perl-ExtUtils-Embed bison flex hmaccalc

注意,此时会提示,asciidoc,newt-devel不存在。我在这里没有注意,忽略了,在下面build的时候提示缺少依赖包时候就病急乱投医了。注意,在编译RHEL的src.rpm时候千万不要乱去google缺少的依赖包。

3,编译kernel

groupadd mockbuild
useradd -g mockbuild mockbuild
rpm -ivh kernel-2.6.32-131.6.1.el6.src.rpm

cd /root/rpmbuild/SPEC/    #也可能是/usr/src/redhat/SPECS/目录
rpmbuild -bb --with fireware --target=`uname -m` kernel.spec

此时会提示,缺少一些依赖包,只要yum安装上即可,最终提示asciidoc,newt-devel没有。的确在ISO里也没有

4,解决依赖关系
这里,开始时候我第一反应是去google,其实完全不用。再进入RedHat的FTP

lftp ftp.redhat.com:/pub/redhat/linux/enterprise/6Server/en/os/SRPMS
get asciidoc-8.4.5-4.1.el6.src.rpm,newt-0.52.11-2.el6.src.rpm

rpmbuild --bb --target=`uname -m` asciidoc.spec  

这样即可解决依赖asciidoc问题。而newt-devel会稍微麻烦些。

在rpmbuild newt的时候,会提示依赖slang这个包,一样,光盘里没有提供,再从ftp上取得slang-2.2.1-1.el6.src.rpm,而在rpmbuild slang时候提示依赖oniguruma,也是光盘里没有的,再从ftp上取得oniguruma-5.9.1-3.1.el6.src.rpm

所以是先build出oniguruma,然后是slang,最后是newt-devel。至此,依赖性解决。

5,重新开始编译

rpmbuild --bb --with firmware --target=`uname -m` kernel.spec

然后是漫长的等待,显示 gpg: WARNING: unsafe permissions on homedir `.’的时候,耐心等待。

编译时间很长。。多喝几杯咖啡。:D

可能出现的问题:make: *** [_modinst_post] Error 137
解决办法:关闭selinux

参考文档:

RHEL内核源码升级


http://half-blood-rock.blogspot.com/2011/08/rhel61rpmbuild.html

=============================================================

2014.01.08补充:

其实两种方法可以互相补充一下,写一下大致流程:

rpm -ivh kernel.src.rpm
rpmbuild -bp kernel.spec
cd BUILD/kernel/
patch -p1 < xxx.patch make -j 16 make modules_install make install

Leave a Reply

Your email address will not be published. Required fields are marked *