IT技术博客大学习 共学习 共进步

[Linux]编译一个 RHEL 定制的内核 rpm 包

扶凯 2010-03-15 13:46:03 浏览 3,441 次

普通的编译内核我想大家可能常常玩.但如果要大量的应用,还有下次备用的话,打成 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 中生成新的的配置,检查一下.然后重起.

建议继续学习

  1. linux内核研究笔记(一)内存管理 – page介绍 (阅读 10,321)
  2. PHP内核介绍及扩展开发指南―Extensions 的编写 (阅读 5,420)
  3. 如何解压rpm文件 (阅读 4,841)
  4. Linux内核协议栈对于timewait状态的处理 (阅读 4,761)
  5. PHP内核介绍及扩展开发指南―基础知识 (阅读 4,700)
  6. 我的内核配置文件 (阅读 4,680)
  7. PHP内核介绍及扩展开发指南―高级主题 (阅读 4,581)
  8. Linux内核模块开发(笔记) (阅读 4,301)
  9. rpm删除出现”error: %preun( ) scriptlet failed, exit status 1解决方法 (阅读 4,081)
  10. PHP内核介绍及扩展开发指南―类和对象 (阅读 4,001)