在尝试修复一个不起眼的硬件错误时,有人建议向内核添加几个参数可能会解决该问题。
我当然可以这样做,但我想知道是否可以对正在运行的内核进行这些更改。特别是,我知道这一点procfs
并sysfs
提供了一种对正在运行的内核进行更改的方法,但我不确定如何将内核参数名称映射到文件路径。 (我也认为不全部设置在运行时是可以更改的,并且一旦系统启动,这些特定参数可能就无法配置。)
我感兴趣的具体参数是
i8042.nomux=1 i8042.reset
我特别不确定是否可以在正在运行的系统上发出重置命令。
如果这些参数是可在运行时调整,我在哪里可以找到它们?
答案1
共有三种可以称为内核参数的东西。
核内核参数是在内核命令行上传递的选项。它们只能在启动时传递。它们记录在kernel-parameters.txt
(此文件还列出了模块参数;核心内核参数是不带 的参数.
)。其中一些参数仅在启动时才重要(例如root
)。对于在系统的整个生命周期中使用的那些,可能有也可能没有在运行时更改它们的机制,没有一般规则。
模块参数类似于内核参数,但它们指定内核的特定组件,通常是特定的驱动程序。不管名称如何,无论相应的驱动程序是直接在内核中编译还是作为模块编译,这些参数都适用。当组件包含在主内核映像中时,需要传递COMPONENT_NAME.PARAMETER_NAME=VALUE
内核命令行。当组件作为模块加载时,您需要传递PARAMETER_NAME=VALUE
给insmod
.
一些模块参数可以通过系统文件系统。该目录/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-------
由 root 读取和写入,而其他任何人都无法访问)。当权限为0时,sysfs中根本不会出现该条目。
i8042.nomux
和i8042.reset
是参数i8042
司机。看源码,权限都是0,所以这两个参数在运行时是不可修改甚至不可查询的。只有驱动程序启动后才能设置参数。如果驱动程序被编译为模块,则卸载该模块并再次加载它允许您在重新加载它时提供不同的参数。如果驱动程序直接位于内核中,或者系统配置使其实际上无法卸载模块,则需要重新启动。
最后,内核中的另一种参数是系统控制。可以使用以下命令查看和更改这些设置sysctl
命令或通过/proc/sys
.我认为 sysctl 和内核参数之间的分离主要是历史性的;与硬件相关的设置传统上是内核参数,而与软件相关的设置传统上是 sysctl,但有时这种区别可能很模糊。
答案2
我认为可以使用“ sudo sysctl -a ”命令找到可以在运行时更改的参数列表。我在系统中没有看到 i8042.nomux。不知道为什么。也许您可以在您的中检查它,如果您看到该参数,那么您可以在运行时修改它。