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