Kernel/Upgrade/zh-cn

这篇文章Article description::描述了升级到新版本内核的步骤.

从新的源代码制作一个新的内核基本上和安装系统时的制作内核是一样的. 不同之处在于可以基于旧内核的配置文件来为新内核制作一个配置文件. 使用旧的配置文件可以让使用者不从头到尾再做一次内核选项（像 一样）.

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

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

Kernel upgrade in Gentoo involves these steps:
 * Step 1: Emerging the new kernel sources.
 * Step 2: Setting the right symlink to the new kernel.
 * Step 3: Moving to the new kernel's folder.
 * Step 4: Adjusting the file for the options introduced to, or removed from the new kernel's configuration.
 * Step 5: Building the kernel and the initramfs.
 * Step 6: Updating the bootloader.
 * Step 7: Removing or keeping the old kernel.

安装
当安装新的内核源代码后，升级您的内核或许是一个很棒的主意. 当您运行以下命令时，新的内核源代码有时会随着系统的更新而安装.

当然，也可以使用下面的命令直接安装内核（用任何正在使用的内核版本替换“gentoo-sources”）:

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

配置
The kernel configuration is saved in a file named in the directory that holds the kernel sources, a symlink is used to point to that directory.

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


 * 1) 安装内核源代码时使用
 * 2) 用 eselect 设置链接
 * 3) 手动更新符号链接

使用 eselect 设置链接
用 设置链接：

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

要更改内核源，例如选第二个选项：

手动更新符号链接
手动设置符号链接：

安装使用 USE Flag 的内核源代码
这将会让 指向新安装的内核源代码.

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

移步到新目录
现在已修改符号链接，将工作目录更改为新的内核文件夹.

Copy the previous kernel configuration
旧内核的配置需要被复制到新的内核中. 除了在先前步骤中保存到的备份副本之外，还可以在多个位置找到旧配置：


 * 如果在当前内核中选项Enable access to .config through /proc/config.gz(CONFIG_IKCONFIG_PROC)是激活的，配置文件在procfs 文件系统：


 * 从老内核中提取. 仅当老内核使用CONFIG_IKCONFIG被编译时可用:


 * 从 目录里获取,如果你把配置文件安装到了这里:


 * 当前运行的内核的源代码目录：


 * In the directory, if   is set in  and  was previously used:

.config文件
要使用适用于新内核的旧内核的配置，需要转换旧内核的配置. 转换可以通过运行  或者. 只用其中一个，不要都使用.

make silentoldconfig
下面的配置是基于类似文本的配置. 对于新的配置，它提供选择. 例如：

字符串“（NEW）”在该行结束时标记该选项是新的. 左边的方括号中的字符串是可能的答案：“Y”是，“N”不是，“m”模块，或者“？”显示帮助. 推荐(或者说是默认)答案是大写（“Y”）. 帮助说明解释了选项或驱动程序.

可惜   不会在每一个选项显示太多的信息，例如上下文，因此有时候做出正确的选择比较困难. 这种情况下最好的办法就是记住选项的名字，之后通过 配置工具 重新修正.

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

make help
使用 查看其他可用的转换方法：

Observing the difference
A diff tool can be used to compare the old and new files to see what options have been added:

And which have been removed:

Alternatively, the kernel provides a script to cleanly compare two config files even if the options have moved in the file itself:

make menuconfig
The options can then be researched and changed if necessary by running:

The menuconfig target is helpful because it safely handles kernel symbol dependency resolution.

编译
这一步请参考 手动配置.

自动构建和安装
可以使用Portage钩子自动构建和安装新出现的内核. 虽然其他方法也是可行的，但以下内容基于genkernel和gentoo-sources包. 它需要以下先决条件：


 * 1) 能够构建和安装内核到符号链接指向的 和引导程序.
 * 2) 为内核ebuild设置了  use标志.

如果满足这些要求，只需安装 Portage钩子，如下所示.

重新安装外部内核模块
任何外部的内核模块，例如二进制内核模块, 需要为新的内核重新编译. 如果新内核还没有编译，需要首先为编译外部内核模块做准备：

包含内核模块的包可以使用 命令重新编译：

解决编译的问题
当重新编译当前内核的时候遇到问题，这也许有助于净化内核源代码. 确保首先备份了文件，因为操作过程会删除它. 确保备份文件不要以 或者  为后缀，因为  同样会删除这些文件.

Update the bootloader
The upgraded and built kernel needs to be set up and eventually a bootloader or boot item updated, see Kernel/Configuration. Users of Grub can use the method below, users of other bootloaders must consult the handbook.

After making sure partition is mounted,

Using grub-mkconfig
The following command can be executed for updating grub's configuration file:

Using systemd-boot-gen to update systemd-boot UEFI configuration
Manual installation of :

Copy the kernel parameters to, the file should contain:

And run it using root privileges:

This will generate the boot configuration in for all the available  that have a matching.

Keeping the old kernel sources
Kernel sources will eventually become unsupported. Some packages require the current sources to build. To protect the new sources from being removed by a depclean, it can be added to the world file (/var/lib/portage/world) by:

Old sources that are no longer supported can be removed from the world file by:

移除
参考 移除旧的内核.

外部资源

 * kernel changelog with some explanations of new features