(Blanked the page) |
No edit summary |
||
Line 1: | Line 1: | ||
{{autolang}} | |||
== 从源码 RPM 包建立一个内核 == | |||
{{Admon/warning | 注意:下面的说明只对Fedora12和之后版本有效}} | |||
这份文档为那些想要重新建立内核的高级用户提供说明。但是,重新建立的内核无法得到 Fedora 内核团队的支持。但是,您是高级用户,您可以自己处理,对吗?无论如何,高级用户建立定制内核的原因有如下几项: | |||
* 测试他们编写的或从其他地方得到的补丁 | |||
* 重新配置已经存在的内核 | |||
* 学习内核或内核开发 | |||
这些说明也可以用于简单的准备内核源码树。 | |||
开始之前,确认系统已经安装了必要的软件包: | |||
* <code>rpmdevtools</code> | |||
* <code>yum-utils</code> | |||
yum-utils 是一个默认的包。用如下命令安装: | |||
<pre>su -c 'yum install rpmdevtools yum-utils' | |||
</pre> | |||
如果您要用 <code>make xconfig</code> ,安装如下软件是必要的: | |||
* <code>qt3-devel</code> | |||
* <code>libXi-devel</code> | |||
* <code>gcc-c++</code> | |||
对于 Fedora 15,用如下命令: | |||
<pre>su -c 'yum install qt3-devel libXi-devel' | |||
</pre> | |||
=== Get the Source === | |||
{{Admon/warning |不要用 <code>root</code> 建立软件包。 | 用 <code>root</code> 建立软件包是很危险且没有必要的,即使对于内核。下面的指令允许任何普通用户从源码包开始建立和安装内核。}} | |||
# 在您的用户主目录下准备一个建立 RPM 包的环境,运行如下命令: <pre>rpmdev-setuptree</pre>这个命令新建了几个不同的目录 <code>${HOME}/rpmbuild/SOURCES</code> ,<code>${HOME}/rpmbuild/SPECS</code> 和 <code>${HOME}/rpmbuild/BUILD</code> 。<code>${HOME}</code> 是您的用户主目录。 | |||
# 下载 <code>kernel-<version>.src.rpm</code> 文件。用 <code>--enablerepo</code> 选项使能适当的源码库。(yumdownloader --enablerepo=repo_to_enable --source kernel)<pre>yumdownloader --source kernel</pre> | |||
# 用 <code>yum-builddep</code> 命令为内核源码安装编译依赖。(安装这些包时需要root):<pre>su -c 'yum-builddep kernel-<version>.src.rpm'</pre> | |||
# 用如下命令安装 <code>kernel-<version>.src.rpm</code> :<pre>rpm -Uvh kernel-<version>.src.rpm</pre>这个命令把 RPM 目录写入了 <code>${HOME}/repbuild/SOURCES</code> 和 <code>${HOME}/rpmbuild/SPECS</code> ,<code>${HOME}</code> 是您的用户主目录。可以忽略像下面这样的信息: | |||
<pre>warning: user kojibuilder does not exist - using root | |||
warning: group kojibuilder does not exist - using root | |||
</pre> | |||
{{Admon/warning | 空间需求。完全的内部编译过程需要若干 GB 的额外空间。}} | |||
=== 准备内核源码树 === | |||
这一步扩大为整个内核源码文件。这对于查看代码、编辑代码和生成补丁是必需的。 | |||
1. 用如下命令准备内核源码树: | |||
<pre>cd ~/rpmbuild/SPECS | |||
rpmbuild -bp --target=$(uname -m) kernel.spec | |||
</pre> | |||
现在,内核源码树就位于 <code>~/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch></code> 目录。 | |||
=== 复制源码树和生成一个补丁 === | |||
这一步是为了对内核源码使用一个补丁。如果不需要这个补丁,直接跳到“配置内核选项”。 | |||
{{admon/note|高级用户|有些工具,例如“quilt”,允许您避免复制源码树。对应高级用户,这样的工具可以使您在下面的步骤中节省很多时间。|}} | |||
复制源码树是为了保留修改前的原始代码。 | |||
<pre> | |||
export arch=x86_64 # replace x86_64 with your arch | |||
export ver=3.1 # replace 3.1 with your kernel version | |||
export fedver=fc16 # replace fc16 with your fedora version | |||
cp -r ~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$arch ~/rpmbuild/BUILD/kernel-$ver.$fedver.orig | |||
cp -al ~/rpmbuild/BUILD/kernel-$ver.$fedver.orig ~/rpmbuild/BUILD/kernel-$ver.$fedver.new | |||
</pre> | |||
{{Admon/warning | 第二个 <code>cp</code> 命令在 <code>.orig</code> 和 <code>.new</code> 树之间建立了硬连接,这样可以使 <code>diff</code> 运行的更快。大部分文本编辑者都知道怎样正确的破坏硬连接来避免问题。}} | |||
在 FC14 上使用 vim 时,它会把上面的硬连接当做硬连接来处理,从而导致上面的技术失败。有必要将原始代码完全复制到 .new 目录。但是这样将使用双倍的空间。 | |||
直接更改 <code>.new</code> 源码树中的代码,或者复制到一个副本文件。这个文件可以来自于一个要求测试的开发者,上游内核源码,或者另一个发行版本。 | |||
修改 <code>.new</code> 源码树之后,生成一个补丁。要生成一个补丁,用下面命令对整个 <code>.new</code> 和 <code>.orig</code> 源码树运行 <code>diff</code> 。 | |||
<pre> | |||
cd ~/rpmbuild/BUILD | |||
diff -uNrp kernel-$ver.$fedver.orig kernel-$ver.$fedver.new > ../SOURCES/linux-$ver.$fedver-mynewpatch.patch | |||
</pre> | |||
用新补丁的名字替换 'linux-$ver.$fedver-mynewpatch.patch' 。在 FC14 上必须把前面的补丁名字复制到 <code>~/rpmbuild/SOURCES</code> 中的 <code>linux-$ver.$fedver-mynewpatch.patch</code> ,以便 <code>rpmbuild</code> 找到它。 | |||
{{Admon/warning | 更多关于补丁的信息请看 <code>diff(1)</code> 和 <code>patch(1)</code> 的 man 手册}} | |||
=== 配置内核选项 === | |||
这一步是为了修改内核的选项。这一步是可选的。如果没有需要修改的配置,可以跳到“准备建立文件”。 | |||
{{admon/important|小变化|如果您只是想要做一点小的修改,可以在 config-local 文件中根据需要直接设置选项。这样会找到并覆盖其余的 config-* 文件,避免很多不必要的工作。如果您使用 config-local 就可以跳过下面的步骤。}} | |||
# 改变内核源码树目录:<pre>cd ~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$arch/</pre> 如果您只是对默认的 fedora 内核做小的修改,跳到第四步,从两个配置工作中选择一个,将这些修改编辑到默认的配置文件。 | |||
# 从 <code>~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$arch/configs</code> 选择所需的配置文件。复制所需的 <code>config</code> 文件到 <code>~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$arch/.config</code> : <pre>cp configs/<desired-config-file> .config</pre> | |||
# 运行下面命令: <pre>make oldconfig</pre> | |||
# 运行下面命令,在文本界面上选择并保持所需的内核选项:<pre>make menuconfig</pre> | |||
#* 运行图形界面的话用这个命令: <pre>make xconfig</pre> | |||
# 在顶层 <code>config</code> 文件中添加一行,该文件包含了内核支持的硬件架构( <code>uname -i</code> 的输出)。这一行以 <code>#</code> 开头。例如, <code>x86_64</code> 设备应该在顶层 <code>config</code> 文件中添加下面这行:<pre># x86_64</pre> | |||
# 复制 <code>config</code> 文件到 <code>~/rpmbuild/SOURCES/</code> : <pre>cp .config ~/rpmbuild/SOURCES/config-`uname -m`-generic</pre> | |||
{{admon/important|32-bit x86 内核|32-bit PAE内核使用 config-i686-PAE 配置文件。如果您正在建立一个 PAE 内核,需要复制您的 config 文件到 <code>~/rpmbuild/SOURCES/</code> : <pre> cp .config ~/rpmbuild/SOURCES/config-i686-PAE</pre> 如果您正在建立一个非 PAE 内核,需要复制您的 config 文件到:<pre> cp .config ~/rpmbuild/SOURCES/config-x86-32-generic</pre>. 再次鼓励使用 config-local ,除非您正在修改大量的配置。}} |
Revision as of 15:24, 1 April 2012
从源码 RPM 包建立一个内核
这份文档为那些想要重新建立内核的高级用户提供说明。但是,重新建立的内核无法得到 Fedora 内核团队的支持。但是,您是高级用户,您可以自己处理,对吗?无论如何,高级用户建立定制内核的原因有如下几项:
- 测试他们编写的或从其他地方得到的补丁
- 重新配置已经存在的内核
- 学习内核或内核开发
这些说明也可以用于简单的准备内核源码树。
开始之前,确认系统已经安装了必要的软件包:
rpmdevtools
yum-utils
yum-utils 是一个默认的包。用如下命令安装:
su -c 'yum install rpmdevtools yum-utils'
如果您要用 make xconfig
,安装如下软件是必要的:
qt3-devel
libXi-devel
gcc-c++
对于 Fedora 15,用如下命令:
su -c 'yum install qt3-devel libXi-devel'
Get the Source
- 在您的用户主目录下准备一个建立 RPM 包的环境,运行如下命令:
rpmdev-setuptree
这个命令新建了几个不同的目录${HOME}/rpmbuild/SOURCES
,${HOME}/rpmbuild/SPECS
和${HOME}/rpmbuild/BUILD
。${HOME}
是您的用户主目录。 - 下载
kernel-<version>.src.rpm
文件。用--enablerepo
选项使能适当的源码库。(yumdownloader --enablerepo=repo_to_enable --source kernel)yumdownloader --source kernel
- 用
yum-builddep
命令为内核源码安装编译依赖。(安装这些包时需要root):su -c 'yum-builddep kernel-<version>.src.rpm'
- 用如下命令安装
kernel-<version>.src.rpm
:rpm -Uvh kernel-<version>.src.rpm
这个命令把 RPM 目录写入了${HOME}/repbuild/SOURCES
和${HOME}/rpmbuild/SPECS
,${HOME}
是您的用户主目录。可以忽略像下面这样的信息:
warning: user kojibuilder does not exist - using root warning: group kojibuilder does not exist - using root
准备内核源码树
这一步扩大为整个内核源码文件。这对于查看代码、编辑代码和生成补丁是必需的。
1. 用如下命令准备内核源码树:
cd ~/rpmbuild/SPECS rpmbuild -bp --target=$(uname -m) kernel.spec
现在,内核源码树就位于 ~/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch>
目录。
复制源码树和生成一个补丁
这一步是为了对内核源码使用一个补丁。如果不需要这个补丁,直接跳到“配置内核选项”。
复制源码树是为了保留修改前的原始代码。
export arch=x86_64 # replace x86_64 with your arch export ver=3.1 # replace 3.1 with your kernel version export fedver=fc16 # replace fc16 with your fedora version cp -r ~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$arch ~/rpmbuild/BUILD/kernel-$ver.$fedver.orig cp -al ~/rpmbuild/BUILD/kernel-$ver.$fedver.orig ~/rpmbuild/BUILD/kernel-$ver.$fedver.new
在 FC14 上使用 vim 时,它会把上面的硬连接当做硬连接来处理,从而导致上面的技术失败。有必要将原始代码完全复制到 .new 目录。但是这样将使用双倍的空间。
直接更改 .new
源码树中的代码,或者复制到一个副本文件。这个文件可以来自于一个要求测试的开发者,上游内核源码,或者另一个发行版本。
修改 .new
源码树之后,生成一个补丁。要生成一个补丁,用下面命令对整个 .new
和 .orig
源码树运行 diff
。
cd ~/rpmbuild/BUILD diff -uNrp kernel-$ver.$fedver.orig kernel-$ver.$fedver.new > ../SOURCES/linux-$ver.$fedver-mynewpatch.patch
用新补丁的名字替换 'linux-$ver.$fedver-mynewpatch.patch' 。在 FC14 上必须把前面的补丁名字复制到 ~/rpmbuild/SOURCES
中的 linux-$ver.$fedver-mynewpatch.patch
,以便 rpmbuild
找到它。
配置内核选项
这一步是为了修改内核的选项。这一步是可选的。如果没有需要修改的配置,可以跳到“准备建立文件”。
- 改变内核源码树目录:
cd ~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$arch/
如果您只是对默认的 fedora 内核做小的修改,跳到第四步,从两个配置工作中选择一个,将这些修改编辑到默认的配置文件。 - 从
~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$arch/configs
选择所需的配置文件。复制所需的config
文件到~/rpmbuild/BUILD/kernel-$ver.$fedver/linux-$ver.$arch/.config
:cp configs/<desired-config-file> .config
- 运行下面命令:
make oldconfig
- 运行下面命令,在文本界面上选择并保持所需的内核选项:
make menuconfig
- 运行图形界面的话用这个命令:
make xconfig
- 运行图形界面的话用这个命令:
- 在顶层
config
文件中添加一行,该文件包含了内核支持的硬件架构(uname -i
的输出)。这一行以#
开头。例如,x86_64
设备应该在顶层config
文件中添加下面这行:# x86_64
- 复制
config
文件到~/rpmbuild/SOURCES/
:cp .config ~/rpmbuild/SOURCES/config-`uname -m`-generic