GLEP 26:使用Portage处理内核

作者 Nathaniel McCallum <npmccallum@gentoo.org>,Joshua Campbell <warpzero@gentoo.org>
类型 标准跟踪
状态 已延期
版本 1
创建日期 2004-05-02
上次修改日期 2014-01-17
发布历史 2004-05-02, 2004-11-11
GLEP源代码 glep-0026.rst

摘要

本GLEP建议创建一个更一致的内核和内核构建处理方式。目前,“emerge kernel-name”仅安装源代码,而不构建任何内容。“emerge kernel-name”应仅安装源代码或仅安装二进制内核、其模块以及内核头文件的tarball包,具体取决于USE标志。

状态

超时

动机

目前,我们唯一可用的自动内核构建过程是genkernel。虽然genkernel是一个很棒的工具,但其主要弱点在于,由于initrd和缺乏其他架构的良好“通用”设置,它无法很好地移植到其他架构。本GLEP希望通过抽象genkernel的各个层并将其最常见的部分(构建过程)实现到一个portage eclass中来克服这一问题。

规范

内核构建将分为3个阶段:(实现位置)

  • 阶段1 - 配置内核(可选)-- 外部实用程序
  • 阶段2 - 构建内核 -- 在eclass中
  • 阶段3 - 构建initrd(可选) -- 在ebuild中

在大多数架构上,阶段1和3都是可选的。

阶段1将通过一个单独的实用程序(可能类似于当前的genkernel)来实现。此实用程序将帮助用户配置内核和任何与内核/构建相关的设置。此阶段是可选的,仅在用户希望自定义内核设置时使用。一个可选的想法是将此实用程序作为Gentoo基本系统的一部分。这样,创建自定义内核的步骤就会减少。

阶段2将通过eclass来实现。此阶段不是可选的。用户可以通过键入“emerge kernel-name”来执行此步骤,其中“kernel-name”是用户想要使用的内核包的名称(例如“gentoo-dev”)。此包将具有“buildkernel”USE标志。如果未设置此标志,它将像我们目前一样简单地下载和安装源代码。但是,如果设置了“buildkernel”标志,portage将执行以下步骤

  1. (作为依赖项)下载并安装“通用”内核配置文件的tarball。
  2. 检查是否已通过阶段1设置了自定义内核配置/设置。
  3. 如果可用,Portage将使用自定义配置。否则,将使用“通用”配置。
  4. 如果既没有自定义配置也没有“通用”配置可用,则退出(并显示消息)。这是必需的,因为某些架构不/无法拥有“通用”配置,因此它们只会收到一条消息,提示它们运行阶段1中的实用程序(显然它们跳过了此步骤)。
  5. 构建内核和模块并安装它们
  6. 删除源代码中不必要的文件并将其打包为“kernel-headers”。此tarball提供了构建外部模块所需的适当文件,例如nvidia-kernel等。外部模块(构建时)将确定正在运行的内核并解压缩相应的tarball以进行构建,然后删除文件。

阶段3仅仅是一个ebuild,它为正在运行的内核或(如果没有正在运行的内核)安装的最新内核(按版本/安装日期?)构建initrd映像。Initrd无法在所有架构上使用,因此可以根据需要屏蔽此ebuild的关键字。initrd包还将具有“bootsplash”USE标志(在x86上,可能还有其他架构),它将构建引导画面支持。用户所需的任何非默认操作都可以通过阶段1中的实用程序来处理。

这将导致几种情况(假设kernel-config是基本系统的一部分)

  1. 默认内核,无initrd:“emerge gentoo-kernel”
  2. 默认内核,initrd:“emerge aa-kernel initrd”
  3. 默认内核,引导画面initrd:“USE=bootsplash emerge mm-kernel initrd”
  4. 非默认内核,无initrd:“kernel-config gentoo-dev-kernel”
    “emerge gentoo-dev-kernel”
  5. 非默认内核,initrd:“kernel-config alpha-kernel”
    “emerge alpha-kernel initrd”
  6. 仅源代码,无二进制文件“USE=-buildkernel emerge grsec-kernel”

原理

这种方法有很多优点

  1. 完全支持所有架构(GentooInstaller确实可以使用它)
  2. 与Portage的其他部分更加一致(通过从源代码构建来安装二进制文件)
  3. 更好的用户体验
  4. 更大的灵活性(genkernel强制在x86上构建initrd)
  5. 无需存储完整的内核源代码(每个源代码树解压后约为200MB)
  6. 能够创建二进制内核包以进行快速安装(考虑GRP内核)
  7. “通用”内核配置文件的单独包使我们能够更好地跟踪版本

然而,主要问题是我们目前有两个不同的构建系统:portage和genkernel。拥有竞争的构建系统不是一件好事™。因此,我们可以让portage构建内核,或者让genkernel构建其他所有内容。

向后兼容性

如果用户想以旧方式提取内核源代码,只需执行以下操作:USE="-buildkernel" emerge kernel-name

也许我们还可以将新的kernel-config程序(来自阶段1)命名为“genkernel”,以便用户可以无缝过渡。

参考实现

尚未…