原文网址:http://www.gentoo.org/doc/zh_cn/kernel-upgrade.xml
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-r1到gentoo-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支持的内核中发现了什么问题,请一定报告给我们。