[Linux 常用技巧] 编译一个 RHEL 定制的内核 rpm 包

Mar 14th, 2010

转载本站文章请注明,转载自:扶凯[http://www.php-oa.com]

本文链接: http://www.php-oa.com/2010/03/14/compiling-custom-kernel-rhel-centos.html

普通的编译内核我想大家可能常常玩.但如果要大量的应用,还有下次备用的话,打成 rpm 包还是会方便很多.
在07年就写过一个内核编译笔记,http://www.php-oa.com/2007/10/17/linux-make.html,但基本没有认真写什么,就记了一下如下.
下面我们来个实际点的.真实编译,我现在是给 RHEL4 或者 RHEL5 的默认 2.6.9 升级到 2.6.24 来做操作.这次主要是做怎么做内核的 rpm 包.

准备 RHEL 中 Linux 内核编译环境

1. 可以到 kernel 的网站下载最新的内核,目前我用的是2.6.24,我30也用过一下,现在最新的好象到了 2.6.33 .下载tar包以后解压到/usr/src/中

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.5.tar.bz2
tar jxvf linux-2.6.24.5.tar.bz2 -C /usr/src

2. 先建个软链到 Linux 的目录

ln -sf /root/kernel/linux-2.6.24.5 linux
cd /usr/src/linux

 

开始 RHEL 中 Linux 编译

1. 安装编译前需要的编译环境

yum install  gcc make  bison ncurses-devel rpm-build

2. 开始 Centos RedHat 系统的内核编译,先清掉以前的编译的内容,注意.config也会清掉

make mrproper
cp /boot/config-`uname -r` .config

3. 然后拿现在的内核配置的基础上在编译(建议这个,很我必须的硬件支持之类都有了).当然,可以先make oldconfig后在自己选择自己要和不要的内容.我喜欢在 Ubuntu 中编译,所以我常用make xconfig来配置,图形界面也很好配置.

make oldconfig
make menuconfig  #或者如果有xwindows时,用make xconfig

4. 加入自己喜欢的名字,到 Linux 内核中.(这步可以不做^v^)
在menuconfig时,有个选项
General setup  —>Select Local version – append to kernel release
我加了一个fukai,呵呵,到时编译出来名字会变成 kernel-2.6.24.5fukai-1.i386.rpm

编译和安装 Linux 内核

1. 好了可以开始编译安装了,make -j 是加速编译的,好象会并发的跑.下面一步是做三样事,在shell中&&的意思可以理解为,只要前面一个任务返回是正常,就运行后面的命令.

make -j 8 && make modules_install && make install

2. 如果你想要rpm包,就用make rpm.记的rpm包在安装是使用i的命令来安装,不要用U来升级,不然老的内核就没了,得给自己多一次机会

make rpm
rpm -ivh  /usr/src/redhat/RPMS/i386/kernel-2.6.24.5fukai-1.i386.rpm

 

为 Redhat Centos 系统中的新内核建立 initrd 文件.

initrd 的作用和技巧我在下一个文章中写.哈哈
如果是 rpm 包安装的话,需要自己建 initrd 文件,如果是make 在make modules_install …. 的方法安装.就会自动生成 initrd 的文件.如果是 rpm 包的话,就需要自己来生成.
象我,喜欢修改 spec 的文件,来打包 rpm,这样 rpm 安装完自动做下面的步骤.

 查找模块的依赖关系,这步可以不做.

depmod kernel-2.6.24.5fukai

安装做 initrd 文件,我们使用的是 mkinitrd 命令,注意 Ubuntu 中没有这个命令用的别的命令

mkinitrd -v  /boot/initrd-2.6.24.5fukai-.img 2.6.24.5-fukai

这一步其实非常有技巧的,很多人的内核起不起来,启动时提示,都是因为这个部分有问题.我下一个文件讲讲这个部分.关注www.php-oa.com吧.哈哈

为 Redhat Centos 系统中的新内核修改 Grub.conf 文件

我们对原来的 grub 备份一下,然后使用 grubby 的命令来修改 Grub 的文件. 这些也可以做成 rpm  中去,就不要自己来运行了.

cp /boot/grub/grub.conf /boot/grub/grub.conf.pre-2.6.24.bak
grubby --add-kernel=/boot/vmlinux-2.6.24.5 \
                --title="Linux Kernel 2.6.24 By Fukai" \
                --copy-default  --make-default \
                --initrd=/boot/initrd-2.6.24.5.img \

这样会在 /boot/grub/grup.conf 中生成新的的配置,检查一下.然后重起.

 

Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪 ViVi 365Key 网摘 天极网摘 和讯网摘 博拉网 POCO 网摘 饭否 QQ 书签 Digbuzz 我挖网 Mister Wong
  1. Nicolas
    Dec 15th, 2011 at 08:34
    Reply | Quote | #3

    感谢分享,有几个问题和建议:
    1.后面的mkinitrd等虽然是可以通过修改SPEC文件来直接放到RPM中,但是不建议这么做,写到kickstart的%post部分更为保险:原因是我测试发现如果在mkinitrd时,发现有模块丢失的情况,是不会继续生成initrd.img文件的。当然如果你说通过判断命令返回来继续后面的操作也行,但是面对不同的错误在ks里修改更为方便
    2.有办法生成kernel-devel这个rpm吗?原因是对应后续扩展包的安装,有些东西需要用到这个文件,最常见的就是显卡驱动,不然会造成内核通过rpm升级后,还要特地编译源码包来给驱动安装用
    盼大牛回复,呵呵

  2. 扶 凯
    Dec 15th, 2011 at 09:50
    Reply | Quote | #4

    你需要 make rpm 前,在spec 中加入 %package devel %files devel之类的字段才行

  3. Nicolas
    Dec 16th, 2011 at 12:15
    Reply | Quote | #5

    @扶 凯
    ;-) Thanks,问题解决了