这一节覆盖了 Fedora Core 6 中 2.6.18 内核的变动及重要信息。2.6.18 内核包括:
轻量级用户空间优先级继承 (http://lwn.net/Articles/178253/)
一个 "锁校验" 调试工具 (http://lwn.net/Articles/185666/)
针对多核系统的节电策略 SMPnice (http://lwn.net/Articles/186438/)
大大改进的 SATA 层 (http://lwn.net/Articles/183734/)
无交换的页面迁移 (http://lwn.net/Articles/160201/)
每区域的 VM 计数器(Per-zone VM counter)
每任务的延迟审计(Per-task delay accounting)
新的针对封包的 SELinux 访问控制,叫做 secmark (http://james-morris.livejournal.com/11010.html)
随机的 i386 vDSO
新的驱动和已有驱动对新设备的支持
大量错误修正和小改进
Fedora Core 可能包含了附加的补丁,来改进,修正或添加附加特性。因此,Fedora Core 内核与被称为纯正(vanilla kernel)的,来自 kernel.org 网站的内核不是完全相同的。
要获得这些补丁的列表,下载源 RPM 软件包,运行下列命令:
rpm -qpl kernel-<version>.src.rpm软件包修订记录可以用下列命令看到:
rpm -q --changelog kernel-<version>如果您希望看到更友好的修订日志,请访问 http://wiki.kernelnewbies.org/LinuxChanges。http://kernel.org/git 提供了内核不同之处的摘要和完全两种版本。Fedora 基于 Linus 的内核树。
Fedora 版本做出的定制可以在 http://cvs.fedora.redhat.com 找到。
Fedora Core 6 包含了下列内核构建
基本的内核,用于大多数系统,已配置的代码在 kernel-devel- 软件包中。version.arch.rpm
kernel-PAE,用于拥有超过 4GB RAM 的 32-bit x86 系统中,或者 CPU 带有 "NX (No eXecute)" 特性的系统中。它同时支持单/多处理器系统。
虚拟机内核,用于 Xen 模拟器。已配置的源代码包含在 kernel-xen-devel- 软件包中。<version>.<arch>.rpm
Kdump 内核,与 kexec/kdump 搭配使用。已配置的源代码包含在 kernel-kdump-devel- 软件包中。<version>.<arch>.rpm
各种内核配置的源代码头文件可以同时安装。文件安装位置是 /usr/src/kernels/。运行命令: <version>-[xen|kdump]]-<arch>/
su -c 'yum install kernel-{PAE,xen,kdump}-devel'选择一个或多个变种,以逗号分隔,不要有空格。在提示时输入
![]() | 默认内核提供了 SMP |
|---|---|
Fedora Core 6 没有单独的 SMP 内核,无论是 i386, x86_64 还是 ppc64。基本内核提供了多处理器支持。 |
![]() | PowerPC 内核支持 |
|---|---|
Fedora Core 6 test3 没有为 PowerPC 体系提供 Xen 或 Kdump 支持。 |
请参考 http://kernel.org/pub/linux/docs/lkml/reporting-bugs.html 中,报告 Linux 内核错误时的注意事项。您也可以访问 http://bugzilla.redhat.com 来报告 Fedora 特有的错误。
关于 Linux 内核开发,很多教材,范例和教科书都假设内核源代码安装在 /usr/src/linux 目录。如果您像下面一样创建一个符号链接,就可以在 Fedora Core 中继续使用那些学习材料了。按照上面提到的方式,安装合适的内核源代码,然后:
su -c 'ln -s /usr/src/kernels/<version>.<release>-<arch>/usr/src/linux'
提示时输入 root 的密码。
Fedora Core 6 与旧版本不同,不包含 kernel-source 软件包,因为要编译外部模块,只需要 kernel-devel 软件包。已配置的源代码可以按照内核配置一节的步骤得到。
![]() | 这些步骤指的是当前运行中的内核 |
|---|---|
为了简化下面的指令,假设您需要配置内核为使用当前运行中的内核的配置。在下面的步骤中,短语 |
需要使用内核源代码的 Fedora Core 用户可以在内核 .src.rpm 软件包中找到它们。要从文件释放源码树,执行下面的命令:
![]() | 不要以超级用户身份(root)构建软件包 |
|---|---|
以超级用户身份构建软件包是极其危险的,不应当这样做,这不是必需的,即使是内核。下面的操作使您可以以普通用户身份构建内核。很多教程以 |
在个人目录准备 RPM 软件包构建环境,运行下面的命令:
su -c 'yum install rpmdevtools yum-utils' rpmdev-setuptree
提示时输入 root 的密码。
安装 kernel- 文件。启用合适的源代码仓库,如 Core, Updates 或 Testing,使用 <version>.src.rpm-e 开关:
yumdownloader -e core-source -e updates-source --source kernel
提示时输入 root 的密码。
安装 kernel-,运行命令: <version>.src.rpm
rpm -Uvh kernel-<version>.src.rpm这个命令将 RPM 内容写到 ${HOME}/rpmbuild/SOURCES 和 ${HOME}/rpmbuild/SPECS, 这里 ${HOME} 是您的个人目录。
![]() | 硬盘空间需求 |
|---|---|
完整的内核构建过程可能需要您的个人目录有几个吉的存储空间。 |
使用这样的命令来准备内核源代码:
cd ~/rpmbuild/SPECS rpmbuild -bp --target $(uname -m) kernel-2.6.spec
内核源代码位于 ${HOME}/rpmbuild/BUILD/kernel- 目录。<version>/linux-<version>.<arch>
Fedora Core 6 附带的各种内核的配置文件位于 ~/rpmbuild/BUILD/kernel- 目录。例如,i686 配置文件名为 <version>/linux-<version>.<arch>/configs~/rpmbuild/BUILD/kernel-。运行下列命令,将所需的配置文件放到合适的位置以用来编译: <version>/linux-<version>.<arch>/configs/kernel-<version>-i686.config
cp configs/<desired-config-file> .config每个内核的名字都包含了它的版本号,这也是 uname -r 命令显示的值。内核 Makefile 的前四行定义了内核的名字。为了保护官方的内核不被破坏,Makefile 经过了修改,以生成一个与运行中的内核不同的名字。在一个模块插入运行中的内核前,这个模块必须针对运行中的内核进行编译。为此,您必须编辑内核的 Makefile。
例如,如果 uname -r 返回字符串 2.6.15-1.1948_FC5,就将 EXTRAVERSION 定义从:
EXTRAVERSION = -prep
修改为:
EXTRAVERSION = -1.2345_FC6
也就是最后一个连字符后面的所有内容。
执行这个命令:
make oldconfig
接下来就没什么差别了。
![]() | 构建内核的二进制 RPM |
|---|---|
通常,Fedora 的内核是用 |
编译内核模块,如设备驱动时,不需要当前运行的内核的完整源码树。为编译外部模块,只需要安装 kernel-devel 软件包。如果没有安装,就用 Pirut 安装它,执行 应用程序 → 添加/删除软件 或者使用 yum。运行下面的命令来安装:
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 命令来编译 foo.ko 模块就可以了。