modprobe 和 sysctl -w 在设置系统参数方面的区别?

modprobe 和 sysctl -w 在设置系统参数方面的区别?

我们知道 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>/目录树中的某个位置),那么您可以使用modprobeand/or /etc/modprobe.d/

相关内容