web-dev-qa-db-ja.com

システムパラメータの設定に関して、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"

そして、/etc/modprobe.dディレクトリにmodprobe.confファイルがあります。これは、/etc/modprobe.d/usr/lib/modprobe.dの複数の場所にあります。複数の.confファイルが含まれており、オプションはモジュールの適切なconfファイルで次のように提供できます。

options kernel domainname="example.com"

では、これらの各方法の違いは何ですか?どの特定の状況でどの方法を使用する必要がありますか?

5
Somenath Sinha

私の知る限り、modprobeを使用してパラメーターを調整できるのは、問題の機能がモジュールとしてコンパイルされており、最初にモジュールをロードしている場合のみです。モジュールパラメータを永続的に設定するために、/etc/modprobe.dディレクトリがあります。 (通常、ディストリビューションのデフォルト設定は/usr/lib/modprobe.dのままにしておく必要があります。そこにあるファイルはパッケージの更新によって上書きされる可能性があります。)

問題のモジュールがメインカーネルに組み込まれている場合は、mustは、通常はブートオプションとして<module_name>.<parameter_name>=<value>構文を使用する必要があります。問題のパラメーターがsysctl設定として使用できる場合は、sysctl -wコマンドを使用して調整することもできます。

使用可能なすべてのsysctlパラメーターは/proc/sysの下に表示されます。たとえば、kernel.domainname/proc/sys/kernel/domainnameにあります。すべてのモジュールパラメータがsysctlとして利用できるわけではありませんが、一部は利用できる場合があります。

ロード可能なモジュールがすでにロードされていて、アンロードせずにそのパラメーターをすぐに変更したい場合は、新しい値を/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/を使用できます。

6
telcoM