LINUX-MOD-R1.ECLASS
节:eclass-manpages (5)更新:2024 年 11 月
索引 返回主内容
名称
linux-mod-r1.eclass - 用于安装树外 Linux 内核模块的函数描述
有关深入使用的信息,请参阅 linux-mod-r1_src_compile 函数文档,有关快速概述,请参阅下面的示例。
linux-mod -> linux-mod-r1 迁移说明
0. 如果缺少,定义 src_compile,下面的局部变量在那里。
1. MODULE_NAMES="name(libdir:srcdir:objdir)"
BUILD_TARGETS="target"
-> local modlist=( name=libdir:srcdir:objdir:target(s) )
- 首先尝试不带 :target,现在它几乎总是没有必要的
- srcdir 默认设置为当前目录,请注意路径
可以相对于它(通常*不*应传递 ${S})
2. BUILD_PARAMS 和/或 BUILD_FIXES
-> local modargs=( VAR="${KV_OUT_DIR}" ... )
- CC/LD 和类似的不再需要,总是被传递(V=1 也是)
- eval(又名 eval "${BUILD_PARAMS}")*不*用于此
3. s/linux-mod_/linux-mod-r1/g
4. _preinst+_postrm 可以删除,保留 linux-mod-r1_pkg_postinst
5. linux-mod-r1_src_install 现在运行 einstalldocs,根据需要调整
6. 如果*不*使用 linux-mod-r1_src_compile/install,则参考
eclass 的第二个示例并确保使用 modules_post_process
7. 如果有,clang<->gcc 切换自定义解决方法可以删除
8. 如果曾经或需要内核版本检查,请参阅 MODULES_KERNEL_MAX/_MIN。
这不是一个详尽的列表,请验证安装后的文件是否没有丢失。在构建日志中查找“command not found”错误。
除非想要保留旧版本作为回归的备用,否则修订版本升级并不严格需要,内核升级或新的 IUSE=+strip 通常会导致无论如何重新构建。
支持的 EAPIS
8传递提供的 ECLASSES
linux-info示例
如果源目录 S 的布局如下
- Makefile (在当前目录中构建 gentoo.ko)
- gamepad/Makefile (想要安装到 kernel/drivers/hid)
- gamepad/obj/ (构建的 gamepad.ko 最终会在这里)
...并且 Makefile 使用 NIH_SOURCE 变量来查找内核构建目录在哪里(又名 KV_OUT_DIR,请参阅 linux-info.eclass)
那么
CONFIG_CHECK="INPUT_FF_MEMLESS" # gamepad needs it to rumble MODULES_KERNEL_MIN=5.4 # needs features introduced in 5.4 src_compile() { local modlist=( gentoo gamepad=kernel/drivers/hid:gamepad:gamepad/obj ) local modargs=( NIH_SOURCE="${KV_OUT_DIR}" ) linux-mod-r1_src_compile }
或者,如果直接使用包的构建系统更方便,一个典型的示例可能是
src_compile() { MODULES_MAKEARGS+=( NIH_KDIR="${KV_OUT_DIR}" NIH_KSRC="${KV_DIR}" ) emake "${MODULES_MAKEARGS[@]}" } src_install() { emake "${MODULES_MAKEARGS[@]}" DESTDIR="${ED}" install modules_post_process # strip->sign->compress einstalldocs }
一些额外的 make 变量可能很有用
- INSTALL_MOD_PATH: 有时用作 DESTDIR
- INSTALL_MOD_DIR: 相当于 linux_moduleinto
MODULES_MAKEARGS 由 eclass 设置以处理工具链,并且在安装时还尝试禁用自动剥离、压缩、签名和 depmod 以让 eclass 处理它。
linux_domodule 可用于安装单个模块。
(请记住确保为 depmod 运行 linux-mod-r1_pkg_postinst)
功能
- linux-mod-r1_pkg_setup
- 在使用来自此 eclass 的其他功能之前需要,并将
1. 运行 linux-info_pkg_setup (请参阅 linux-info.eclass)
-> 意味着处理 CONFIG_CHECK,以及提供 KV_ 变量
(MODULES 和 TRIM_UNUSED_KSYMS 总是被检查)
2. 准备工具链以匹配内核
-> 设置 KERNEL_{CHOST,CC,CXX,LD,AR,NM,OBJCOPY,OBJDUMP,READELF,STRIP}
-> 还设置 MODULES_MAKEARGS 数组,例如 CC="${KERNEL_CC}"
(通常这些*不*应该直接使用,用于自定义构建)
3. 执行各种健全性检查以尽早发现问题 - linux-mod-r1_src_compile
- 构建模块,有关快速概述,请参阅 eclass 的示例。使用 modlist 和 modargs 变量,如下所述
* local modlist=( ... ) - 要构建的模块列表,设置为
module-name=install-dir:source-dir:build-dir:make-target> module-name: 生成的名称,又名 <module-name>.ko(必需)。
> install-dir: 要安装模块到的内核模块子目录 (/lib/modules/version/<install-dir>/name.ko)。在运行 linux-mod-r1_src_install 时将使用。如果存在,可能需要考虑 INSTALL_MOD_DIR(Makefile) 或 DEST_MODULE_LOCATION(dkms.conf) 的值,但它可以是任何东西。
-> 默认值:extra警告:更改此位置可能会导致过时的模块,直到内核升级,因为包管理器通常不会删除旧模块,并且只会在重建时进行覆盖。
> source-dir: 包含用于构建模块的 Makefile 的目录。路径可以相对于当前目录或绝对路径。
-> 默认值:当前目录> build-dir: 将保存构建的 module-name.ko 的目录。
-> 默认值:与 source-dir 的值相同> make-target: 几乎总是没有必要的,但是,如果默认值不正确,则可以指定 Makefile 的目标(目标)来构建模块/附加内容。多个目标可以使用空格,例如:"first second"。
-> 默认值:特别尝试 modules、module、<name>.ko、default、all、空目标,并运行第一个找到的可用的目标缺少元素会导致使用默认值,例如,这是有效的
modlist=( name1 name2=:source name3=install::build )* local modargs=( ... ) - 要传递给 emake 的额外参数
Makefile 应特别检查它使用哪个变量来查找内核的构建目录,然后,例如,KDIR="${KV_OUT_DIR}" 作为适当的值。请注意,通常希望传递 KV_OUT_DIR(build) 而不是 KV_DIR(sources) 如果不是两者。这允许用户进行源外内核构建并仍然构建模块。
传递常见的工具链变量,如 CC 或 LD,这里不需要,因为它们默认情况下被传递。
---
如果需要针对每个模块或中间步骤使用不同的 modlist,则允许多次调用它,尽管如果非典型,可能需要手动构建(请参阅 eclass 的示例)。
- linux-mod-r1_src_install
- 使用 linux_domodule 安装由 linux-mod-r1_src_compile 构建的模块,然后运行 modules_post_process 和 einstalldocs。
- linux-mod-r1_pkg_postinst
- 使用 depmod 更新模块依赖项。
- linux_domodule <module>...
- 安装 Linux 模块(.ko 文件)。
另请参阅 linux_moduleinto。
- linux_moduleinto <install-dir>
- 在调用 linux_domodule 时安装模块到的目录。相对于内核模块路径,例如:${ED}/lib/modules/${KV_FULL}/<install-dir>
可以包含子目录,例如 kernel/fs。
如果未调用,则默认为“extra”。在内核构建系统上,这类似于设置 INSTALL_MOD_DIR,它对外部模块具有相同的默认值。
- modules_post_process [<path>]
- 剥离、签名、验证和压缩在 <path> 下找到的所有 .ko 模块。通常*不*应直接调用,因为它将由 linux-mod-r1_src_install 运行。这旨在用于模块以其他方式安装的情况。
<path> 应存在于 ${ED} 下。默认为 /lib/modules/${KV_FULL}。
文件名可能会因压缩而更改,因此应在此之前执行对这些文件的任何操作。
警告:如果未找到任何模块,这将中止,这可能会发生在模块意外预先压缩的情况下,可能是由于使用 make install 而不传递 MODULES_MAKEARGS 来禁用它。
ECLASS 变量
- KERNEL_CHOST (用户变量)
- 可以设置为 CHOST 值,以在为构建内核模块选择工具链时使用。这类似于设置内核构建系统的 CROSS_COMPILE 变量,减去尾部的连字符。
如果这没有自动选择所需的工具链,可以通过设置没有直接记录(但有效)的变量来实现更精细的控制
KERNEL_{CC,CXX,LD,AR,NM,OBJCOPY,OBJDUMP,READELF,STRIP}
如果有疑问,请不要设置任何这些。
默认值(如果未设置):自动检测,通常与当前 CHOST 相同
- MODULES_EXTRA_EMAKE (用户变量)
- 构建模块时要传递给 emake 的额外参数。可以包含带引号空格的参数,例如:
..._EMAKE="KCFLAGS='-fzomg-optimize -fsuper-strict-aliasing' ..."
- MODULES_I_WANT_FULL_CONTROL (用户变量)
- 当设置为非空值时,禁用在构建模块时将大部分 eclass 的工具链默认值传递给 emake。基本 eclass 要求、ebuilds 的 modargs 和用户的 MODULES_EXTRA_EMAKE 仍然被使用。
主要针对具有修改内核 Makefiles 的专家用户,他们希望 Makefile 的值默认情况下被使用。
在考虑此问题之前,可能需要查看 KERNEL_CHOST。
- MODULES_INITRAMFS_IUSE (在继承之前设置)
- 如果设置,则添加指定的 USE 标志。启用此标志时,安装的内核模块将被注册以包含在 dracut initramfs 中。此外,如果使用的是发行版内核(USE="dist-kernel"),则这些内核将被重新安装。
典型的建议值是“initramfs”或“+initramfs”(全局 IUSE)。
如果未设置 MODULES_INITRAMFS_IUSE,或者未启用指定的标志,则安装的内核模块将被排除在 dracut initramfs 之外。
- MODULES_SIGN_HASH (用户变量)
- 与 USE=modules-sign 一起使用。可以设置为在签名生成期间使用的哈希算法。
与其设置此值,建议使用内核配置进行选择以确保适当的支持(例如 CONFIG_MODULE_SIG_SHA256),然后它将在此自动检测到。
有效值:sha512、sha384、sha256、sha224、sha1
默认值(如果未设置):内核 CONFIG_MODULE_SIG_HASH 的值
- MODULES_SIGN_KEY (用户变量)
- 与 USE=modules-sign 一起使用。可以设置为 PEM 格式的私钥路径,或 PKCS#11 URI。
如果路径是相对路径(例如“certs/name.pem”),则假设它相对于正在使用的内核构建目录。
如果密钥需要密码或 PIN,则使用的内核签名文件实用程序会识别 KBUILD_SIGN_PIN 环境变量。请注意,包管理器可能会将此值存储在二进制包、数据库文件、临时文件以及可能日志中。此 eclass 在使用后取消设置变量以减轻问题(特别是对于共享二进制包),但请谨慎使用。
未设置时的默认值:内核 CONFIG_MODULE_SIG_KEY 的值,该值本身默认为 certs/signing_key.pem
- MODULES_SIGN_CERT ?= certs/signing_key.x509 (用户变量)
- 与 USE=modules-sign 一起使用。可以设置为要使用的 X.509 公钥证书的路径。
如果路径是相对路径(例如“certs/name.x509”),则假设它相对于正在使用的内核构建目录。
- MODULES_KERNEL_MAX
- 如果设置为内核版本(格式:1、1.2 或 1.2.3),则如果使用的版本大于(ver_test -gt)此值,将使用相同数量的版本组件打印警告(即 MAX=1.2 允许 1.2.3,但 MAX=1.2.2 不允许)。
这*应该*仅用于已知在内核升级时经常出现故障的模块。如果将此设置为非 LTS 内核,则还应注意定期测试和更新此值,以使用新的主要内核版本,以免警告变得陈旧并被用户忽略。
允许用户轻松尝试或自我修补并不致命,但(大量)警告很难忽略。如果需要对更严重的问题(例如运行时文件系统损坏)进行致命检查,请手动执行。
这旨在减少针对可通过使用 LTS 内核并等待新版本轻松缓解的重复预期问题的错误报告数量。
如果使用,必须在调用 linux-mod-r1_pkg_setup 之前设置。
- MODULES_KERNEL_MIN
- 如果设置为内核版本(格式:1、1.2 或 1.2.3),则如果使用的版本小于(ver_test -lt)此值,将中止。
仅应在已知损坏或上游推荐明智的最低限度时使用。对于不再位于树中的内核,它并不是特别必要。
如果使用,必须在调用 linux-mod-r1_pkg_setup 之前设置。
- MODULES_OPTIONAL_IUSE (在继承之前设置)
- 可能包含一个要添加到 IUSE 的单个标志,可选地以 + 符号为前缀以默认启用它。这样做会使 linux-mod-r1 的所有功能和依赖项成为无操作,除非该标志已启用。这包括阶段,例如 linux-mod-r1_pkg_setup 不会处理 CONFIG_CHECK,除非设置了该标志。
典型的推荐值是 "+modules"(全局 IUSE)。
请注意,即使用户空间工具需要模块,模块是可选的也可能很有用(例如,在模块在主机上加载时在 chroot 或前缀中安装,可以节省设置 linux 源代码)。但是,如果工具构建起来非同寻常,则可能优于使用此变量将它们拆分为两个包,因为每次内核升级都需要重新构建。
- MODULES_MAKEARGS (由 ECLASS 生成)
- 将在调用 linux-mod-r1_pkg_setup 后设置。包含在构建或安装模块时应传递给 emake 的参数。
修改此变量是可以接受的(例如,附加内核源代码参数),但是,如果使用 linux-mod-r1_src_compile,则设置 modargs 是更清洁且不易出错的预期方法。
作者
Ionen Wolkens <[email protected]>维护者
Ionen Wolkens <[email protected]>Gentoo 内核项目 <[email protected]>
报告错误
请通过 https://bugs.gentoo.org/ 报告错误。文件
linux-mod-r1.eclass另请参见
ebuild(5)https://gitweb.gentoo.org/repo/gentoo.git/log/eclass/linux-mod-r1.eclass
索引
此文档由 man2html 使用手册页创建。
时间:2024 年 11 月 12 日,格林威治标准时间 03:27:01