在运行时更改内核参数

Mat*_*hid 14 linux-kernel

在尝试修复一个模糊的硬件错误时,有人建议向内核添加几个参数可能会解决该问题。

我当然可以这样做,但我想知道是否可以对正在运行的内核进行这些更改。特别是,我知道procfssysfs提供了一种对正在运行的内核进行更改的方法,但我不确定如何将内核参数名称映射到文件路径。(我还假设并非所有设置都可以在运行时更改,并且一旦系统启动,这些特定参数很可能无法配置。)

我感兴趣的具体参数是

i8042.nomux=1 i8042.reset
Run Code Online (Sandbox Code Playgroud)

我特别不确定是否可以在正在运行的系统上发出重置命令。

如果这些参数在运行时可以调整,我在哪里可以找到它们?

Gil*_*il' 20

有三种东西可以称为内核参数。

核心内核参数是在内核命令行上传递的选项。它们只能在启动时通过。它们记录在kernel-parameters.txt(该文件还列出了模块参数;核心内核参数是那些没有.)的参数。其中一些参数仅在启动时重要(例如root)。对于在系统的整个生命周期中使用的那些,可能有也可能没有在运行时更改它们的机制,没有一般规则。

模块参数类似于内核参数,但它们指定内核的特定组件,通常是特定的驱动程序。尽管名称如此,但无论相应的驱动程序是直接在内核中编译还是作为模块编译,这些参数都适用。当组件包含在主内核映像中时,您需要COMPONENT_NAME.PARAMETER_NAME=VALUE在内核命令行上传递。当组件作为模块加载时,需要传递PARAMETER_NAME=VALUEinsmod.

一些模块参数通过sysfs可见。该目录/sys/module/MODULE_NAME/parameters每个参数包含一个文件;读取该文件可为您提供参数的当前值。写入该文件会设置参数(如果可以修改);大多数参数不能修改(因此文件是只读的)。该目录/sys/module/kernel/parameters列出了一些核心内核参数。

模块参数是随意记录的;其中一些列在 中kernel-parameters.txt,并且该文件包含对某些模块的引用。如果找不到文档,请搜索源。模块参数由声明module_param宏或其同伴之一module_param_namedmodule_param_cb等等。这些宏的最后一个参数确定文件的权限(例如,0600S_IRUSR | S_IWUSRrw-------即,由其他人通过根可读写和不可访问)。当权限为 0 时,sysfs 中的条目根本不会出现。

i8042.nomuxi8042.reseti8042驱动程序的参数。看源码,两者的权限都是0,所以这两个参数在运行时是不可修改甚至不可查询的。只有在驱动程序启动时才能设置参数。如果驱动程序被编译为模块,则卸载模块并再次加载它允许您在重新加载时提供不同的参数。如果驱动程序直接在内核中,或者如果您的系统配置实际上无法卸载模块,则需要重新启动。

最后,内核中的另一种参数是sysctl。可以使用sysctl命令或通过来查看和更改这些设置/proc/sys。我认为 sysctl 和内核参数之间的分离大多是历史性的;硬件相关的设置传统上是内核参数,而软件相关的设置传统上是 sysctl,但有时区别可能很模糊。

  • @MathematicalOrchid 哦,对了。我已经更正了我的答案,我不知道为什么我认为 0 意味着只读。0 实际上意味着没有条目,这就是您正在观察的内容。适用结论相同,该参数只能在驱动加载时设置。 (2认同)