Fedora 内核编译指南

从 src RPM 包编译 Fedora 内核,适用于 Fedora 8 及以后版本

参考 http://fedoraproject.org/wiki/Docs/CustomKernel


以下所有命令都是在非 root 用户下运行

准备工作
在开始之前,先确保系统已安装下列必要的包:
yum-utils
rpmdevtools
可通过下面的命令来安装:
su -c 'yum install yum-utils rpmdevtools'
其中 yum-utils 包提供 yumdownloader 和 yum-builddep 这两个命令, rpmdevtools 包提供 rpmdev-setuptree 这个命令

获得 Source

1. 首先建立 RPM 的打包环境目录,运行下列命令:
rpmdev-setuptree
该命令会在用户的 HOME 目录下建立 rpmbuild/{SOURCES,SPECS,BUILD,RPMS,SRPMS} 这5个目录,以及一个 .rpmmacros 文件,该文件定义了一些 rpm 打包的环境变量。

2. 下载 kernel source src.rpm 包。可以直接到 fedora 的官方源上去下载,也可以用下列命令下载:
yumdownloader --source kernel

3. 安装编译内核所需要的包,运行下列命令:
su -c 'yum-builddep kernel-<version>.src.rpm'

4. 安装 kernel source src.rpm 包,运行下列命令:
rpm -Uvh kernel-<version>.src.rpm

准备内核源代码树
1. 运行下列命令来建立内核源代码树:
cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec
现在内核源代码树位于 ~/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch> 目录。

2. 如果还需要修改内核源代码的话(可选),可按如下步骤操作:
cp -a ~/rpmbuild/BUILD/kernel-2.6.$ver/linux-2.6.$ver.$arch ~/rpmbuild/BUILD/kernel-2.6.$ver.orig
cp -a ~/rpmbuild/BUILD/kernel-2.6.$ver.orig ~/rpmbuild/BUILD/kernel-2.6.$ver.new
在 ~/rpmbuild/BUILD/kernel-2.6.$ver.new 中对 source 作修改,然后作成 patch:
cd ~/rpmbuild/BUILD
diff -uNrp kernel-2.6.x.orig kernel-2.6.x.new > ../SOURCES/linux-2.6-my-new-patch.patch

配置内核选项(可选)
如果需要修改内核的编译选项的话,按如下操作:
1. 进入内核源代码树
cd ~/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch>/

2. 从 configs 目录中挑选一个基于其修改的 config 文件,把它复制成内核源代码树中的 .config 文件
cp configs/<desired-config-file> .config

3. 配置内核编译选项
make oldconfig
make menuconfig

4. 在新生成的 .config 文件的第一行添加一行指定硬件平台的标识(uname -i 的输出),以 # 号开头,例如:
# i386

5. 把 .config 文件复制到 ~/rpmbuild/SOURCES/ 目录下,并命名成 config-<arch>,例如 config-i686
cp .config ~/rpmbuild/SOURCES/config-<arch>

准备 spec 文件
进入 ~/rpmbuild/SPECS 目录,编辑 kernel.spec 文件:
1. 定义 buildid 为一个唯一的标识,以区别不同的 kernel rpm 包。把
#% define buildid .local
改成
%define buildid .<custom_text>
注意去掉 % 和 define 之间的空格

2. 如果之前有生成 patch ,把 patch 加到 kernel.spec 文件中。一般放在所有已有的 patch 最后,并注明注释。例如:
# cputime accounting is broken, revert to 2.6.22 version
Patch2220: linux-2.6-cputime-fix-accounting.patch
Patch9999: linux-2.6-samfw-test.patch
另外在打 patch 那一段也要补上:
ApplyPatch linux-2.6-cputime-fix-accounting.patch
ApplyPatch linux-2.6-samfw-test.patch

编译新的内核
用 rpmbuild 命令来编译 kernel rpm 包,默认的命令为:
rpmbuild -bb --target=`uname -m` kernel.spec
这个命令可能会编译好几遍 kernel,生成不同类型的内核镜像,例如支持 xen、smp 等的 kernel。可以通过添加 --without <option> 选项来去除一些,可选的 option 有 xen、smp、up、pae、kdump、debug  和  debuginfo 等。要指明编译某一种 kernel 的话,可以通过添加 --with <option> 选项,可选的 option 有 baseonly、smponly 和 xenonly 等。这些 option 都可以在 spec 文件中查到。
例如要编译一个最基本的 kernel, 可使用下面的命令:
rpmbuild -bb --with baseonly --without debug --without debuginfo --target=`uname -m` kernel.spec
编译结束后,新的 rpm 包在 ~rpmbuild/RPMS 目录下。

安装新的内核
安装新的 kernel rpm 包用 rpm -ivh 命令,不要用 -U 或 --upgrade 选项。
rpm -ivh ~/rpmbuild/RPMS/<arch>/kernel-<version>.<arch>.rpm

捷径
上面做了这么多,其实只为能生成一个 kernel 的 rpm 包。如果不想要把 kernel 打成 rpm 包的话,完全可以省去很多事。在运行完 rpmbuild -bp --target=`uname -m` kernel.spec 命令后,内核源代码树就已经准备好了,完全可以按照通用的编译内核的步骤去处理。

只编译内核模块
如果只需要为当前运行的 kernel 编译一个模块的话,只需要安装 kernel-devel 包就可以了。
su -c 'yum install kernel-devel'
例如要编译 foo.ko 模块,只要在包含 foo.c 的目录中创建如下一个 Makefile 文件:
obj-m := foo.o

KDIR  := /lib/modules/$(shell uname -r)/build
PWD   := $(shell pwd)

default:
$(MAKE) -C $(KDIR) M=$(PWD) modules

接着,运行 make 命令就可以编译模块了。

你可能感兴趣的:(Fedora 内核编译指南)