曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5011|回复: 0
打印 上一主题 下一主题

Fedora -- 构建自己的内核

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-8-18 23:41:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下操作适用于 Fedora12 及其以后版本。

在开始之前,确保以下两个软件包已经安装:
rpmdevtools
yum-utils
没有安装的话,使用 yum 来安装:
[beyes@beyes ~]$ su -c 'yum install rpmdevtools yum-utils'
上面的 su 命令使用 -c 选项后接要执行的命令,yum install 需要 root 权限,这里执行后要输入 root 密码以使安装过程继续。

如果希望在编译内核时使用 make xconfig 命令(kde 图形界面支持),那么还需要安装以下软件包:
qt3-devel
libXi-devel
安装命令:
[beyes@beyes ~]$ su -c 'yum install qt3-devel libXi-devel'

获取源代码
首先说明一点,不需要用 root 来构建包。使用 root 来构建包不但会带来风险,而且也没必要,即使对于编译内核也是如此。下面步骤只需普通用户权限即可完成。

1. 在你的 home 目录下准备 RPM 包构建环境
[beyes@beyes ~]$ rpmdev-setuptree
上面的命令将在你的 home 目录下创建一个 rpmbuild 的目录,该目录下又有如下几个子目录:
[beyes@beyes rpmbuild]$ ls
BUILD  RPMS  SOURCES  SPECS  SRPMS

2.下载内核代码 rpm 文件,其名字命名格式为 kernel-<version>.src.rpm
[beyes@beyes rpmbuild]$ yumdownloader --source kernel
完后会发现一个 rpm 格式的内核源码包被下载下来,如:kernel-2.6.40.3-0.fc15.src.rpm 。

3. 安装编译内核时所需依赖,这里使用 yum-builddep 命令。执行该命令需要 root 权限
[beyes@beyes ~]$ su -c 'yum-builddep kernel-2.6.40.3-0.fc15.src.rpm'
yum-builddep 命令可以自动帮你装上你所要构建包的相关依赖的 RPM 包。

4. 安装内核源码 RPM 包
[beyes@beyes ~]$ rpm -Uvh kernel-2.6.40.3-0.fc15.src.rpm
当该命令执行完后,你会在 rpmbuild/SOURCES 和 rpmbuild/SPECS 两个目录下生成了许多文件,包括内核源码压缩包,以及各种补丁文件。

5. 准备内核源码树。
[beyes@beyes /]$ cd ~/rpmbuild/SPECS/
[beyes@beyes SPECS]$ rpmbuild -bp --target=$(uname -m) kernel.spec
上面命令执行完后,内核源码树就被放置在 rpmbuild/BUILD/linux-<version>.<arch>目录下。

下面步骤是为了打算给内核代码打补丁做准备,如果不需要,那么跳过。

复制源码树做个备份:
[beyes@beyes ~]$ cp -r ~/rpmbuild/BUILD/kernel-2.6.39.fc15/linux-2.6.39.i686/ ~/rpmbuild/BUILD/kernel-2.6.39.fc15.orig
[beyes@beyes ~]$ cp -a ~/rpmbuild/BUILD/kernel-2.6.39.fc15.orig/ ~/rpmbuild/BUILD/kernel-2.6.39.fc15.new

这时,可以直接在 .new 的源码树里修改代码了。

在修改完后,需要生成一个补丁。生成补丁需要用 diff 命令。
cd ~/rpmbuild/BUILD
diff -uNrp kernel-2.6.$ver.$fedver.orig kernel-2.6.$ver.$fedver.new > ../SOURCES/linux-2.6-my-new-patch.patch
上面 diff 命令中的 N 参数表示如果某个问及爱你仅在一个目录中出现,则假定其再另一个目录中为空文件;u 表示 unified 格式; r 表示在目录中嵌套使用;p 表示检查 C 语言函数是否发生变化。

配置内核选项

可以拷贝一个 .config 到内核源码目录下或者直接使用 make menuconfig 来配置:
$cd ~/rpmbuild/BUILD/kernel-2.6.39.fc15/linux-2.6.39.i686
$make menuconfig

然后将 config 文件拷贝到 ~/rpmbuild/SOURCES 中:
[beyes@beyes linux-2.6.39.i686]$ cp .config ~/rpmbuild/SOURCES/config-`uname -m`

准备 Build 文件
cd ~/rpmbuild/SPECS

编辑底下的 kernel.spec 文件,找到:
# % define buildid .local
去掉前面的 '#' 符号,以及 '#' 和 '%' 之间的空格,并修改 .local 为你的一个自定义字符串,如:
%define buildid .addrt2870

如果使用了补丁文件,那么还需要做相应修改,这里假设没有应用过补丁文件。

下面构建新的内核
$rpmbuild -bb --target=`uname -m` kernel.spec
上面这一步会在 rpmbuild/RPMS 目录下生成所有类型的内核 RPM 包,比如:
[beyes@beyes i686]$ ls -alh
total 1.2G
drwxr-xr-x. 2 beyes beyes 4.0K Aug 18 22:59 .
drwxrwxr-x. 3 beyes beyes 4.0K Aug 18 22:40 ..
-rw-rw-r--. 1 beyes beyes  23M Aug 18 22:41 kernel-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes  24M Aug 18 22:55 kernel-debug-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 245M Aug 18 22:59 kernel-debug-debuginfo-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 7.1M Aug 18 22:55 kernel-debug-devel-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 240M Aug 18 22:46 kernel-debuginfo-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes  39M Aug 18 22:41 kernel-debuginfo-common-i686-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 7.0M Aug 18 22:42 kernel-devel-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 752K Aug 18 22:41 kernel-headers-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes  23M Aug 18 22:46 kernel-PAE-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes  24M Aug 18 22:51 kernel-PAEdebug-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 246M Aug 18 22:55 kernel-PAEdebug-debuginfo-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 7.1M Aug 18 22:51 kernel-PAEdebug-devel-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 241M Aug 18 22:50 kernel-PAE-debuginfo-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 7.1M Aug 18 22:46 kernel-PAE-devel-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 368K Aug 18 22:41 perf-2.6.40.3-0.addrt2870.fc15.i686.rpm
-rw-rw-r--. 1 beyes beyes 836K Aug 18 22:41 perf-debuginfo-2.6.40.3-0.addrt2870.fc15.i686.rpm
像上面的编译方法将会耗用极大的时间。

可以用下面的方法去掉你不需要的目标:
rpmbuild -bb --without <option> --target=`uname -m` kernel.spec
上面的 <option> 选项包括 “xen", "smp" , "up", "kdump", "debug" 和 "debuginfo 等。比如指定 --without debuginfo ,那么即禁止了构建 kernel-debuginfo 类型的包。

也可以明确指定要构建的目标:
rpmbuild -bb --with <option> --target=`uname -m` kernel.spec
上面 <option> 包括 xenonly, smponly 以及 baseonly 3种选项。

比如只想构建内核和 kernel-devel 包,那么可以运行下面的命令:
rpmbuild -bb --with baseonly --without debuginfo --target=`uname -m` kernel.spec

安装新内核
要安装新的内核,使用 rpm -ivh 命令,而不能包含 -U 或 --upgrade 选项:
su -c "rpm -ivh --force $HOME/rpmbuild/RPMS/<arch>/kernel-<version>.<arch>.rpm"
这样当你重启系统时,就会看到新的内核出现在 bootloader 菜单选项中。

这样构建内核的好处是,在原生内核的基础上打了 Fedora 的官方补丁,这样保证了系统的良好兼容性。比如当你下载的某些硬件驱动(可能因为内核版本的原因)无法满足你当前的发行版时,可以尝试查找上面的内核源码中是否包含相应的驱动模块,如果有,则重新配置时选上,然后重新编译内核,这样往往可以解决问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 20:28 , Processed in 0.075220 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表