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

Som*_*nha 6 kernel modprobe sysctl kernel-parameters

我们知道 sysctl 命令可以通过以下方式更改内核参数:

# sysctl -w kernel.domainname="example.com"
Run Code Online (Sandbox Code Playgroud)

或直接编辑/proc/sys目录中的文件。对于持久更改,必须将参数写入/etc/sysctl.d/<moduleName>.conf文件,如下所示:

# echo kernel.domainname="example.com" > /etc/sysctl.d/domainname.conf
Run Code Online (Sandbox Code Playgroud)

但是,我们也可以使用 modprobe 命令更改内核参数:

# modprobe kernel domainname="example.com"
Run Code Online (Sandbox Code Playgroud)

然后是/etc/modprobe.d目录中的 modprobe.conf 文件,它存在于多个位置:/etc/modprobe.d/usr/lib/modprobe.d. 它包含多个.conf文件,可以在模块的相应 conf 文件中提供选项,如下所示:

options kernel domainname="example.com"
Run Code Online (Sandbox Code Playgroud)

那么,每种方法之间有什么区别呢?在什么具体情况下应该使用哪种方法?

tel*_*coM 7

据我所知,modprobe只有当相关功能已编译为模块时,您才能使用调整参数 - 并且您首先要加载模块。要永久设置模块参数,您将拥有该/etc/modprobe.d目录。(通常您应该保留/usr/lib/modprobe.d分发的默认设置 - 那里的任何文件都可能被软件包更新覆盖。)

如果有问题的模块已内置到主内核中,那么您必须使用<module_name>.<parameter_name>=<value>语法,通常作为引导选项。如果相关参数可用作sysctl设置,则您也可以使用该sysctl -w命令对其进行调整。

所有可用的 sysctl 参数都显示在/proc/sys: 例如,kernel.domainnameis at 下/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)
Run Code Online (Sandbox Code Playgroud)

简而言之:如果您不确定,请首先查看/proc/sys或输出sysctl -a:如果您要查找的参数不存在,则它不是 sysctl 参数,并且可能是一个模块参数(或将提供 sysctl当前未加载,在这种情况下,最好将该值设置为模块参数 - 尝试设置属于当前未加载的模块的 sysctl 只会产生错误)。

然后,找出该参数属于哪个模块。如果该模块内置于内核中,则您可能必须使用引导选项;如果它可以加载modprobe(即相应的<module>.ko文件存在于/lib/modules/<kernel version>/目录树中的某处),那么您可以使用modprobe和/或/etc/modprobe.d/.