Kernel

modprobe 和 sysctl -w 在設置系統參數方面的區別?

  • December 14, 2017

我們知道 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.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)

簡而言之:如果您不確定,請先查看/proc/sys或輸出sysctl -a:如果您要查找的參數不存在,則它不是 sysctl 參數,可能是模組參數(或提供 sysctl 的模組目前未載入,在這種情況下,最好將值設置為模組參數 - 嘗試設置屬於目前未載入的模組的 sysctl 只會產生錯誤)。

然後,找出參數屬於哪個模組。如果模組內置在核心中,您可能必須使用引導選項;如果它是可載入的modprobe(即相應的<module>.ko文件存在於/lib/modules/<kernel version>/目錄樹中的某處),那麼您可以使用modprobe和/或/etc/modprobe.d/.

引用自:https://unix.stackexchange.com/questions/410811