内核/升级

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page Kernel/Upgrade and the translation is 75% complete.

Other languages:
Deutsch • ‎English • ‎español • ‎français • ‎italiano • ‎日本語 • ‎한국어 • ‎Nederlands • ‎português do Brasil • ‎русский • ‎中文(中国大陆)‎

这篇文章描述了升级到新内核步骤。

安装 并且使用一个新内核

A kernel upgrade may be a good idea when new kernel sources are installed. New kernel sources are sometimes installed while updating the system by running the following command:

root #emerge --ask --update --deep --with-bdeps=y --newuse @world

当然,内核也可以使用下面的命令直接安装(如果您用的hardened profile,请用“hardened-sources”替换“gentoo-sources”):

root #emerge --ask --update --deep --with-bdeps=y --newuse sys-kernel/gentoo-sources

安装新的内核源代码并不会给使用者提供一个新的内核。从新内核源代码编译和安装一个新的内核,然后重启系统从而真正的运行新的内核是有必要的。

Making a new kernel from the new sources is basically the same process as making a kernel when installing the system. The difference is that one can use the configuration of the old kernel to create a configuration for the new kernel. Using the old configuration saves the user from going through all the kernel options (like make menuconfig) again.

内核的配置文件 .config 保存在内核源代码的目录下面。一个新的内核或许会有旧内核没有的特性或选项,新内核也有可能没有现存于旧内核的特性或选项。内核配置文件指定了是否开启内核的功能和选项,要么嵌入内核,要么以模块形式构建从而允许在内核运行时被按需加载。因此,新内核的配置文件可能有新的但是旧内核的配置文件没有的选项,同时新内核的配置文件可能没有旧内核的配置文件现有的选项。

要处理配置文件的更改,旧内核的配置文件需要转换为可用于新内核的配置。本文展示了如何通过转换旧内核的配置文件来制作一个新内核。

为当前运行内核的配置文件制作一个备份

备份内核配置是明智的,这样以前的配置就不会丢失了。毕竟许多用户花了大量的时间来配置出系统的最佳配置,同时失去内核配置是绝对不会想要的。

制作一个当前内核配置的备份很容易:

root #cd /usr/src/linux
root #cp .config ~/kernel-config-`uname -r`

在内核源代码的链接被配置正确的情况下,这复制了正在使用的内核的配置文件到了根用户的家目录下,重命名了配置文件变成 kernel-config- 加上现在正在运行的内核的版本号。

设置一个链接到新的内核源代码

符号链接 /usr/src/linux 应该始终指向正在运行的内核的源代码的目录。下面三种方法中任意一个可以实现这一点:

  1. 安装内核源代码时使用 USE="symlink"
  2. 用 eselect 设置链接
  3. 手动更新符号链接

安装使用 USE Flag 的内核源代码

这将会让 /usr/src/linux 指向新安装的内核源代码。

如果有必要的话,也可以选择下面两种方法之一来进行稍后修改。

使用 eselect 设置链接

To set the symlink with eselect:

root #eselect kernel list
Available kernel symlink targets:
[1] linux-3.14.14-gentoo * 
[2] linux-3.16.3-gentoo

这将输出可用的内核源代码。星号表示已经选择的来源。

要更改内核源,例如选第二个选项:

root #eselect kernel set 2

手动更新符号链接

手动设置符号链接:

root #ln -sf /usr/src/linux-3.16.3 /usr/src/linux
root #ls -l /usr/src/linux
lrwxrwxrwx 1 root root 19 Oct 4 10:21 /usr/src/linux -> linux-3.16.3-gentoo 

复制以前的内核配置文件

旧内核的配置需要被复制到新的内核中。它可以在这几个地方找到:

  • 如果在当前内核中选项Enable access to .config through /proc/config.gz是激活的,配置文件在procfs 文件系统:
root #zcat /proc/config.gz > /usr/src/linux/.config
  • 从老内核中提取。仅当老内核使用CONFIG_IKCONFIG被编译时可用:
root #/usr/src/linux/scripts/extract-ikconfig /path/to/old/kernel >/usr/src/linux/.config
  • /boot 目录里获取,如果你把配置文件安装到了这里:
root #cp /boot/config-3.14.14-gentoo /usr/src/linux/.config
  • 当前运行的内核的源代码目录:
root #cp /usr/src/linux-3.14.14-gentoo/.config /usr/src/linux/
  • In the /etc/kernels/ directory, if SAVE_CONFIG="yes" is set in /etc/genkernel.conf and genkernel was previously used:
root #cp /etc/kernels/kernel-config-x86_64-3.14.14-gentoo /usr/src/linux/.config

配置新的内核

To use the configuration of the old kernel with the new kernel, it needs to be converted. The conversion can be done by running either make silentoldconfig or make olddefconfig. Use either, not both.

制作沉默的旧的配置 (make silentoldconfig)

The following configuration is like the text based configuration with make config. For new configuration options, the user is asked for a decision. For example:

root #cd /usr/src/linux
root #make silentoldconfig
Anticipatory I/O scheduler (IOSCHED_AS) [Y/n/m/?] (NEW)

The string (NEW) at the end of the line marks this option as new. Left to the string in square brackets are the possible answers: Yes, no, module or ? to show the help. The recommend (i.e. default) answer is capitalized (here Y). The help explains the option or driver.

Unfortunately make silentoldconfig doesn't show a lot more information for each option, such as the context, so it is sometimes difficult to give the right answer. In this case the best way to go is to remember the option name and revise it afterwards through one of the graphical kernel configuration tools.

制作旧的配置 (make olddefconfig)

如果所有的新配置选项都应该被设置成推荐 (也就是default)值就用这条命令 make olddefconfig:

root #cd /usr/src/linux
root #make menuconfig

make help

Use make help to see other conversion methods available:

root #make help

编译

Important
When external kernel modules are installed (like nvidia or zfs), it may be necessary to run make modules_prepare as described below before building the kernel. Some modules cannot be installed or prepared before the kernel has been built.
Important
别忘了重新配置 bootloader 去登记新内核的名称。如果使用了initramfs,请重新制作initramfs

这一步请参考 manual configuration

重新安装外部内核模块

任何外部的内核模块,像 binary kernel modules, 需要为新的内核重新编译。如果新内核还没有编译,需要首先为编译外部内核模块做准备:

root #make modules_prepare

Packages containing kernel modules can be rebuilt using the @module-rebuild set:

root #emerge --ask @module-rebuild

解决编译的问题

When experiencing build problems while rebuilding the current kernel, it might help to sanitize the kernel sources. Make sure to backup the .config file first, as the operation will remove it. Make sure not to use a .bak or ~ suffix as backup as make distclean will clean those up as well.

root #cp .config /usr/src/kernel_config_bk
root #make distclean
root #mv /usr/src/kernel_config_bk .config

删除旧内核

参考 kernel removal

外部资源