在尝试修复一个模糊的硬件错误时,有人建议向内核添加几个参数可能会解决该问题。
我当然可以这样做,但我想知道是否可以对正在运行的内核进行这些更改。特别是,我知道procfs
并sysfs
提供了一种对正在运行的内核进行更改的方法,但我不确定如何将内核参数名称映射到文件路径。(我还假设并非所有设置都可以在运行时更改,并且一旦系统启动,这些特定参数很可能无法配置。)
我感兴趣的具体参数是
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=VALUE
给insmod
.
一些模块参数通过sysfs可见。该目录/sys/module/MODULE_NAME/parameters
每个参数包含一个文件;读取该文件可为您提供参数的当前值。写入该文件会设置参数(如果可以修改);大多数参数不能修改(因此文件是只读的)。该目录/sys/module/kernel/parameters
列出了一些核心内核参数。
模块参数是随意记录的;其中一些列在 中kernel-parameters.txt
,并且该文件包含对某些模块的引用。如果找不到文档,请搜索源。模块参数由声明module_param
宏或其同伴之一module_param_named
,module_param_cb
等等。这些宏的最后一个参数确定文件的权限(例如,0600
或S_IRUSR | S_IWUSR
将rw-------
即,由其他人通过根可读写和不可访问)。当权限为 0 时,sysfs 中的条目根本不会出现。
i8042.nomux
和i8042.reset
是i8042
驱动程序的参数。看源码,两者的权限都是0,所以这两个参数在运行时是不可修改甚至不可查询的。只有在驱动程序启动时才能设置参数。如果驱动程序被编译为模块,则卸载模块并再次加载它允许您在重新加载时提供不同的参数。如果驱动程序直接在内核中,或者如果您的系统配置实际上无法卸载模块,则需要重新启动。
最后,内核中的另一种参数是sysctl。可以使用sysctl
命令或通过来查看和更改这些设置/proc/sys
。我认为 sysctl 和内核参数之间的分离大多是历史性的;硬件相关的设置传统上是内核参数,而软件相关的设置传统上是 sysctl,但有时区别可能很模糊。
归档时间: |
|
查看次数: |
16164 次 |
最近记录: |