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将执行以下步骤
- (作为依赖项)下载并安装“通用”内核配置文件的tarball。
- 检查是否已通过阶段1设置了自定义内核配置/设置。
- 如果可用,Portage将使用自定义配置。否则,将使用“通用”配置。
- 如果既没有自定义配置也没有“通用”配置可用,则退出(并显示消息)。这是必需的,因为某些架构不/无法拥有“通用”配置,因此它们只会收到一条消息,提示它们运行阶段1中的实用程序(显然它们跳过了此步骤)。
- 构建内核和模块并安装它们
- 删除源代码中不必要的文件并将其打包为“kernel-headers”。此tarball提供了构建外部模块所需的适当文件,例如nvidia-kernel等。外部模块(构建时)将确定正在运行的内核并解压缩相应的tarball以进行构建,然后删除文件。
阶段3仅仅是一个ebuild,它为正在运行的内核或(如果没有正在运行的内核)安装的最新内核(按版本/安装日期?)构建initrd映像。Initrd无法在所有架构上使用,因此可以根据需要屏蔽此ebuild的关键字。initrd包还将具有“bootsplash”USE标志(在x86上,可能还有其他架构),它将构建引导画面支持。用户所需的任何非默认操作都可以通过阶段1中的实用程序来处理。
这将导致几种情况(假设kernel-config是基本系统的一部分)
- 默认内核,无initrd:“emerge gentoo-kernel”
- 默认内核,initrd:“emerge aa-kernel initrd”
- 默认内核,引导画面initrd:“USE=bootsplash emerge mm-kernel initrd”
- 非默认内核,无initrd:“kernel-config gentoo-dev-kernel”
- “emerge gentoo-dev-kernel”
- 非默认内核,initrd:“kernel-config alpha-kernel”
- “emerge alpha-kernel initrd”
- 仅源代码,无二进制文件“USE=-buildkernel emerge grsec-kernel”
原理
这种方法有很多优点
- 完全支持所有架构(GentooInstaller确实可以使用它)
- 与Portage的其他部分更加一致(通过从源代码构建来安装二进制文件)
- 更好的用户体验
- 更大的灵活性(genkernel强制在x86上构建initrd)
- 无需存储完整的内核源代码(每个源代码树解压后约为200MB)
- 能够创建二进制内核包以进行快速安装(考虑GRP内核)
- “通用”内核配置文件的单独包使我们能够更好地跟踪版本
然而,主要问题是我们目前有两个不同的构建系统:portage和genkernel。拥有竞争的构建系统不是一件好事™。因此,我们可以让portage构建内核,或者让genkernel构建其他所有内容。
向后兼容性
如果用户想以旧方式提取内核源代码,只需执行以下操作:USE="-buildkernel" emerge kernel-name
也许我们还可以将新的kernel-config程序(来自阶段1)命名为“genkernel”,以便用户可以无缝过渡。
参考实现
尚未…
版权
此作品根据知识共享署名-相同方式共享3.0未移植许可发布。要查看此许可证的副本,请访问https://creativecommons.org/licenses/by-sa/3.0/。