Gentoo Logo

声明: 本文档正在撰写中,不应该视本文为官方版本。


Gentoo Linux 内核更新指南

内容:

1.  简介

内核是Portage树中少数几个需要部分人工介入方可完成更新的包之一。Portage会为你下载并安装内核源码,但需要你手动编译新的内核,才能让更改生效。

这份指南是关于如何从一个内核版本更新到另一个版本的,然而,对希望切换到另一个内核包的用户同样有用。

本文使用gentoo-sources作为例子,然而,这里的操作适用于我们树中的其他内核包。

2.  为什么更新内核?

一般而言,小的内核版本更新不会带来什么巨大的差别。更新内核有若干原因,包括使用最新驱动或某个最新特性,免受安全漏洞威胁,或仅仅是为了保持系统始终处于最新和健康的状态。

即使你选择不是每次有新的内核版本都去更新,我们也建议你时不时的更新到最新的内核。当新内核解决了某个安全问题时,则强烈建议你更新到这一版本。

3.  通过Portage获取新的内核

更新内核源码和更新其他包一样:使用emerge工具。当在world更新列表中看到新的内核版本时,你或许希望做一次内核更新。例如:

代码 3.1: 新内核源码出现在更新列表

# emerge -Dup world
Calculating dependencies ...done!
[ebuild    NS ] sys-kernel/gentoo-sources-2.6.9-r2 [2.6.8-r5]

注意: 上面输出中的"NS"标志意味着,新的内核将会安装到新的slot中,也就是说旧内核源码会保留下来,直到你手动移除它。

你可以继续下去,执行更新,例如:

代码 3.2: 更新你的内核源码

# emerge -u gentoo-sources

这样,内核源码就会被安装到/usr/src的某个子目录中。对于上面的例子,新内核源码会安装在/usr/src/linux-2.6.9-gentoo-r2

4.  更新/usr/src/linux符号链接

Gentoo要求符号链接/usr/src/linux指向正在运行的内核的源代码。

当你emerge新内核源码时,Portage能自动更新这个链接。你需要做的是将symlink标志添加到/etc/make.conf中的USE变量中。

代码 4.1: /etc/make.conf中USE变量示例

(添加关键字symlink)
USE="symlink x86 3dnow 3dnowex X aac aalib adns alsa apache2"

你也可以选择使用app-admin/eselect来修改该符号链接。

代码 4.2: 用eselect管理符号链接

(如果还没有则安装eslect)
# emerge eselect
(查看可用内核列表)
# eselect kernel list
Available kernel symlink targets:
  [1]   linux-2.6.9-gentoo-r1
  [2]   linux-2.6.9-gentoo-r2
(选择正确的内核)
# eselect kernel set 1

要是你真的想要自己做,下面的例子说明如何将链接指向linux-2.6.9-gentoo-r2

代码 4.3: 手动更新/usr/src/linux符号链接

# cd /usr/src
# ln -sfn linux-2.6.9-gentoo-r2 linux

5.  配置、编译并安装新的内核

对下面的每一种方式,你都应参考Gentoo手册中关于配置内核配置引导程序的指示。以下是所需操作的概述:

方式一:用Genkernel自动设置内核

如果你是genkernel用户,你只需重复执行第一次安装内核时所做的步骤就可以了。

正常运行genkernel就行了:

代码 5.1: 运行genkernel

# genkernel all

通过附加参数,你可以使用genkernel的其他功能。例如,如果你希望用menuconfig配置额外的内核选项,并自动更新grub引导程序配置,可以如下启动genkernel:

代码 5.2: 运行genkernel时附加常用参数

# genkernel --menuconfig --bootloader=grub all

更多详情,参看Gentoo Linux Genkernel指南,或者参考Gentoo手册。许多选项可以在genkernel的配置文件/etc/genkernel.conf中指定。

方式二:手动配置

首先,使用内核代码树中的menuconfig工具:

代码 5.3: 运行menuconfig

# cd /usr/src/linux
# make menuconfig

请选择你的硬件和操作环境所需的选项。更多关于内核配置的信息,参见Gentoo手册中题为配置内核的章节。

接下来,编译你的内核并复制到启动分区中。同样,请参考Gentoo手册配置引导程序一章所列出的步骤。如果/boot是一个单独的分区,在复制编译好的内核前,确认它已挂载!否则,你就无法启动系统运行新的内核。

代码 5.4: 编译并安装新的内核

# make && make modules_install
# mount /boot
# cp arch/i386/boot/bzImage /boot/bzImage-2.6.9-gentoo-r2

最后,你应该更新引导程序配置文件,增加新内核的条目(先不要删除旧的!),然后卸载/boot分区。同样,参阅Gentoo手册,了解这个过程更详细的指示。

6.  重新安装外部模块

如果你使用了不包含在内核代码树,而是由Portage中其他地方提供的内核模块(例如ALSA驱动,以及NVIDIA或ATI显示驱动),那么更新内核后,你需要重新安装这些模块。很简单,只需重新emerge涉及到的包即可。更多信息,参考Gentoo手册中关于配置内核的章节。

我们为你提供了一个简易的工具(sys-kernel/module-rebuild),它能重新编译你安装的所有独立的(与/usr/src/linux的内核使用不同的ebuild)内核模块。它的用法非常直观。安装后,运行module-rebuild populate生成一个数据库,其中包含所有更新内核后需要重新编译的包的列表。当你完成更新并重新编译内核后,运行module-rebuild rebuild重新编译对应新内核的驱动。

更多信息,请不带参数运行module-rebuild,这会显示支持的命令列表。

7.  重启到新的内核

接着,关闭所有应用程序并重启系统。如果上面的步骤没有做错,那么引导程序菜单中将会出现新内核的条目。选择新的内核并启动系统。

一切顺利的话,新内核成功启动,登录后你可以继续工作了。这样的话,更新就宣告完成了。

如果你犯了错误,新内核无法启动,那么重启系统,在引导程序中选择上次可以运行的内核。接着你可以重新配置,编译并安装新内核,对错误做出适当的修正。某些情况下,你甚至无需重启就可以进行这些操作,例如少安装了声卡驱动、网卡驱动等等。

8.  运行多个内核

你可能已经注意到了,当安装新内核的源代码时,现有内核的源码没有被删除。这是有意为之的,这样你就可以很方便的在运行不同内核间切换。

在多个内核间切换非常简单。你只需保留/usr/src/中的内核源代码,并保留/boot分区中的二进制文件bzImage就可以了,后者会与引导程序配置中的一项相对应。每次启动时,你都有机会选择启动到哪个内核。

9.  删除旧的内核

接着上一节,你或许对新内核感到满意,不再需要保留旧内核了。要想删除除了最新内核外的其他版本内核源码,你可以利用emerge中的prune选项。下面是针对gentoo-sources的例子:

代码 9.1: 删除旧版本

# emerge -P gentoo-sources

一般情况下,编译过程中产生的临时文件仍然会保留在/usr/src下的对应目录中。你可以安全的用rm删除这些文件。

你也可以安全的删除所有旧内核使用的模块。这能通过删除/lib/modules/目录下与删除的内核版本相应的子目录来完成。小心不要删除了还在使用的内核的模块!

最后,你可以挂载/boot分区,删除你刚才卸载的内核的bzImage文件。你还应该编辑引导程序的配置,删去对应已卸载内核的项。

10.  高级:用你旧.config文件配置新内核

有时,配置新内核时重用旧内核的配置文件能够节省时间。需要注意的是,一般这是不安全的——每次版本更新都会带来很多改变,使得这种更新途径并不可靠。

唯一适用于这种方法的场合,是从一个Gentoo内核修订版升级到另一个。例如,从gentoo-sources-2.6.9-r1gentoo-sources-2.6.9-r2的改变会非常微小,所以一般可以使用下面的方法。然而,这种方法不适用于本文中一直使用的例子,即从2.6.8更新到2.6.9。官方发行版本之间的改动太多,下面叙述的方法没有向用户提示足够的相关信息,这经常会导致用户因禁用了本不想禁用的选项而出现问题。

利用你旧有的.config文件,只需把它复制过来,并运行make oldconfig即可。下面的例子里,我们使用gentoo-sources-2.6.9-r1的配置文件,并用在gentoo-sources-2.6.9-r2中。

代码 10.1: 重用旧配置

# cd /usr/src/linux-2.6.9-gentoo-r2
# cp ../linux-2.6.9-gentoo-r1/.config .
# make oldconfig

代码 10.2: 对genkernel重用旧配置

# cd /etc/kernels
# cp kernel-config-x86-2.6.9-gentoo-r1 kernel-config-x86-2.6.9-gentoo-r2
# genkernel all

这时,你需要回答若干个问题,以决定在两个版本之间改变的那些配置选项。完成之后,你就可以正常编译并安装内核,不用再进行menuconfig的配置过程。

一个更加安全的办法是,同样方法复制你的配置文件,接着运行make menuconfig。这能够上面提到的make oldconfig的问题,因为make menuconfig会在菜单中中显示这个旧配置文件中尽可能多的内容。现在你所需做的就是浏览每个菜单,寻找新的选项,删除了的选项等等。通过使用menuconfig,你可以了解所有改变的相关内容,可以更容易的查看新的选择和了解帮助信息。你甚至可以用这种方法来完成例如从2.6.8到2.6.9的更新,只需保证你仔细的查看了每个选项。完成之后,正常编译并安装内核。

11.  更新内核后出现问题?

Linux内核发展迅速,版本更新带来的改变可能会引起一些问题,这是无法避免的。如果你在最新版本Gentoo支持的内核中发现了什么问题,请一定报告给我们。



打印

更新于2007年 6月 22日

本翻译的原始版本已经不再被维护

总结: 此文档描述如何更新你的内核到另一个版本。

Daniel Drake
作者

袁野
译者

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.