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"
那麼,這些方法之間有什麼區別呢?在什麼具體情況下應該使用哪種方法?
據我所知,
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
行不通的:# 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/
.