1. 生成源码树
1.1 安装必须的工具
# yum install rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed pesign xmlto # yum install audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel # yum install ncurses-devel newt-devel numactl-devel pciutils-devel python-devel zlib-devel
1.2 下载源码包
http://vault.centos.org/6.5/os/Source/SPackages/kernel-2.6.32-431.el6.src.rpm
1.3 建立文件夹及设置安装路径,使用非root用户
$ mkdir -p ~/kernel/centos65/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} $ echo '%_topdir %(echo $HOME)/kernel/centos65' > ~/.rpmmacros
1.4 生成源码,之后源码生成在~/kernel/centos65_new/BUILD/kernel-2.6.32-431.el6/linux-2.6.32-431.el6.x86_64目录下。
$ cd ~/kernel/centos65/SPECS $ rpmbuild -bp --target=$(uname -m) kernel.spec
2. 编译内核(如果只需要修改内核模块,不需要更新内核则跳过本节)
2.1 安装必须的工具
# yum groupinstall "Development Tools" # yum install ncurses-devel # yum install hmaccalc zlib-devel binutils-devel elfutils-libelf-devel
2.2 配置内核
2.2.1 如果需要对内核做定制则使用下面方法配置内核,使用非root用户
拷贝当前系统使用的配置文件
$ cd ~/kernel/centos65/BUILD/kernel-2.6.32-431.el6/linux-2.6.32-431.el6.x86_64
$ cp /boot/config-`uname -r` .config
使用menuconfig配置内核
$ make oldconfig $ make menuconfig
修改新生成的配置文件,32位cpu则将"# i386"加入文件第一行,64位cpu则将"# x86_64"加入文件第一行。
将所有配置文件拷贝到SOURCE目录下
$ cp .config configs/kernel-2.6.32-`uname -m`[-type].config $ cp configs/* ~/kernel/centos65/SOURCES/
2.2.2 如果不需要配置内核则直接拷贝所有配置文件到SOURCE目录下
$ cp ~/kernel/centos65/BUILD/kernel-*/linux-*/configs/* ~/kernel/centos65/SOURCES/
2.3 编辑spec文件
$ cd ~/kernel/centos65/SPECS/ $ cp kernel.spec kernel.spec.distro $ vi kernel.spec
18行加入%define buildid .your_identifier
929行将“cp $RPM_SOURCE_DIR/config-* .”改为“cp $RPM_SOURCE_DIR/kernel-*.config .”
933行注释掉“#make -f %{SOURCE20} VERSION=%{version} configs”
2.4 编译内核并生成rpm包,安装包生成在~/kernel/centos65/RPMS/x86_64/目录
$ rpmbuild -bb --target=`uname -m` kernel.spec 2> build-err.log | tee build-out.log
2.5 安装
# yum localinstall kernel-*.rpm
# rpm -ivh --force --nodeps kernel-*.rpm //覆盖旧的内核
3. 编译内核模块
3.1 准备
$ cd ~/kernel/centos65/BUILD/kernel-2.6.18/linux-2.6.18.i686 $ make oldconfig $ make menuconfig $ make prepare $ make modules_prepare
3.2 编译某一模块
$ make M=drivers/scsi/mpt3sas
3.3 将生成的ko文件替换到系统中并使用dracut命令将其打包入initramfs中
# cp drivers/scsi/mpt3sas/mpt3sas.ko /lib/modules/2.6.32-431.el6.x86_64/kernel/drivers/scsi/mpt3sas/ # cd /boot # dracut -f
重启系统,使新的模块生效。