我们知道 sysctl 命令可以通过以下方式更改内核参数:
# sysctl -w kernel.domainname="example.com"
或者直接编辑目录中的文件/proc/sys
。对于持久性更改,必须将参数写入/etc/sysctl.d/<moduleName>.conf
文件,如下所示:
# echo kernel.domainname="example.com" > /etc/sysctl.d/domainname.conf
但是,我们也可以使用 modprobe 命令更改内核参数:
# modprobe kernel domainname="example.com"
然后目录中有 modprobe.conf 文件/etc/modprobe.d
,该文件存在于多个位置:/etc/modprobe.d
和/usr/lib/modprobe.d
。它包含多个.conf
文件,并且可以在模块的相应conf文件中提供选项,如下所示:
options kernel domainname="example.com"
那么,这些方法之间有什么区别呢?在什么具体情况下应该使用哪种方法?
答案1
据我所知,modprobe
只有当相关功能已编译为模块时,您才能使用调整参数 - 并且您首先要加载该模块。为了持久地设置模块参数,您将拥有该/etc/modprobe.d
目录。 (通常您应该保留/usr/lib/modprobe.d
发行版的默认设置 - 其中的任何文件都可能会被软件包更新覆盖。)
如果有问题的模块已内置到主内核中,那么您必须使用<module_name>.<parameter_name>=<value>
语法,通常作为启动选项。如果相关参数可作为sysctl
设置使用,那么您也可以使用该sysctl -w
命令来调整它。
所有可用的 sysctl 参数都显示在 下/proc/sys
:例如,kernel.domainname
位于/proc/sys/kernel/domainname
。并非所有模块参数都可以作为 sysctls 使用,但有些可能可以。
如果可加载模块已经加载,并且您希望改变立即更改其参数而不卸载它,然后您可以将新值写入/sys/module/<module_name>/parameters/<parameter_name>
.如果模块无法接受该参数的动态重新配置,则该文件将为只读。
至少在我的系统上,kernel.domainname
是主内核的 sysctl 参数,尝试更改它是modprobe
行不通的:
# sysctl kernel.domainname
kernel.domainname = (none)
# modprobe kernel domainname="example.com"
modprobe: FATAL: Module kernel not found in directory /lib/modules/<kernel_version>
# sysctl kernel.domainname
kernel.domainname = (none)
简而言之:如果您不确定,请首先查看/proc/sys
以下输出sysctl -a
:如果您要查找的参数不存在,则它不是 sysctl 参数,并且可能是模块参数(或提供 sysctl 的模块)当前未加载,在这种情况下,最好将该值设置为模块参数 - 尝试设置属于当前未加载的模块的 sysctl 只会产生错误)。
然后,找出该参数属于哪个模块。如果该模块内置于内核中,您可能必须使用引导选项;如果它可以加载modprobe
(即相应的<module>.ko
文件存在于/lib/modules/<kernel version>/
目录树中的某个位置),那么您可以使用modprobe
and/or /etc/modprobe.d/
。