「カーネルモジュール」の版間の差分
細 (リンクを修正) |
Kusanaginoturugi (トーク | 投稿記録) (→参照: update.) |
||
(同じ利用者による、間の7版が非表示) | |||
18行目: | 18行目: | ||
{{Related articles end}} |
{{Related articles end}} |
||
− | [[Wikipedia: |
+ | [[Wikipedia:Loadable_kernel_module|カーネルモジュール]] は、要求に応じてカーネルにロードおよびアンロードできるコードの一部です。これにより、システムを再起動する必要なく、カーネルの機能を拡張することができます。 |
− | カーネルモジュールを作るには、[https:// |
+ | カーネルモジュールを作成するには、[https://sysprog21.github.io/lkmpg/ The Linux Kernel Module Programming Guide] を参照してください。モジュールは、ビルトインまたはロード可能として設定できます。モジュールを動的にロードまたは削除するには、カーネルの設定でそのモジュールをロード可能なモジュールとして設定する必要があります(そのモジュールに関連する行には {{ic|M}} という文字が表示されます)。 |
+ | |||
+ | 新しいカーネルがインストールされるときにカーネルモジュールを自動的に再構築するには、[[Dynamic Kernel Module Support]] (DKMS) を参照してください。 |
||
== 情報を取得 == |
== 情報を取得 == |
||
81行目: | 83行目: | ||
# modprobe ''module_name'' |
# modprobe ''module_name'' |
||
+ | |||
+ | ファイル名でモジュールをロードするには(つまり、{{ic|/usr/lib/modules/$(uname -r)/}} にインストールされていないモジュール): |
||
+ | |||
+ | # insmod filename [args] |
||
モジュールをアンロードするには: |
モジュールをアンロードするには: |
||
89行目: | 95行目: | ||
# rmmod ''module_name'' |
# rmmod ''module_name'' |
||
− | |||
− | 設定ファイルをリロードするには: |
||
− | |||
− | # systemctl restart systemd-modules-load.service |
||
== モジュールオプションを設定する == |
== モジュールオプションを設定する == |
||
− | カーネルモジュールにパラメータを |
+ | カーネル モジュールにパラメータを渡すには、modprobe を使用してパラメータを手動で渡すか、modprobe 設定ファイルまたはカーネルコマンド ラインを使用して特定のパラメータが常に適用されるようにすることができます。モジュールがカーネルに組み込まれている場合は、カーネル コマンド ラインを使用する必要があり、他の方法は機能しません。 |
=== ロード時に modprobe を使って手動で行う === |
=== ロード時に modprobe を使って手動で行う === |
||
104行目: | 106行目: | ||
# modprobe ''module_name parameter_name=parameter_value'' |
# modprobe ''module_name parameter_name=parameter_value'' |
||
− | === /etc/modprobe.d/ 内のファイルを使 |
+ | === /etc/modprobe.d/ 内のファイルを使用する === |
− | + | {{ic|/etc/modprobe.d/}} ディレクトリ内のファイルは、[[udev]] にモジュール設定を渡すために使用できます。これにより、システムの起動時に {{ic|modprobe}} を使用してモジュールのロードを管理します。このディレクトリ内の設定ファイルは、''.conf'' 拡張子で終わる任意の名前を持つことができます。構文は次のとおりです: |
|
{{hc|/etc/modprobe.d/myfilename.conf|2= |
{{hc|/etc/modprobe.d/myfilename.conf|2= |
||
+ | options ''module_name parameter_name=parameter_value'' |
||
− | options modname parametername=parametervalue}} |
||
+ | }} |
||
+ | |||
+ | 複数のモジュールパラメータはスペースで区切られ、パラメータにはカンマで区切られた値のリストを指定できます: |
||
+ | |||
+ | {{hc|/etc/modprobe.d/myfilename.conf|2= |
||
+ | options ''module_name param1=value1 param2=value2a,value2b …'' |
||
+ | }} |
||
例: |
例: |
||
{{hc|/etc/modprobe.d/thinkfan.conf|2= |
{{hc|/etc/modprobe.d/thinkfan.conf|2= |
||
+ | # ThinkPad では、'thinkfan' デーモンがファンの速度を制御できるようにします |
||
− | # On Thinkpads, this lets the 'thinkfan' daemon control fan speed |
||
+ | options thinkpad_acpi fan_control=1 |
||
− | |||
+ | }} |
||
− | options thinkpad_acpi fan_control=1}} |
||
− | {{Note|影響を受けるモジュールが |
+ | {{Note|影響を受けるモジュールが initramfs からロードされている場合、適切な ''.conf'' ファイルを [[mkinitcpio.conf]] の {{ic|FILES}} に追加するか、{{ic|modconf}} [[Mkinitcpio.conf#HOOKS|フック]] を使用してから、''.conf'' ファイルを含めるために [[initramfs の再生成]] を行う必要があります。デフォルトの initramfs の内容を確認するには、[[mkinitcpio#イメージの抽出|lsinitcpio]] を使用してください。}} |
=== カーネルコマンドラインを使う === |
=== カーネルコマンドラインを使う === |
||
160行目: | 169行目: | ||
{{hc|/etc/modprobe.d/nobeep.conf| |
{{hc|/etc/modprobe.d/nobeep.conf| |
||
# Do not load the 'pcspkr' module on boot |
# Do not load the 'pcspkr' module on boot |
||
− | |||
blacklist pcspkr}} |
blacklist pcspkr}} |
||
173行目: | 181行目: | ||
事実上の、モジュールとそれが必要な他のモジュールのブラックリスト化になります。}} |
事実上の、モジュールとそれが必要な他のモジュールのブラックリスト化になります。}} |
||
+ | |||
+ | {{Note|複数のモジュールをブラックリスト入りさせるときは、カンマで分割することを覚えておいて下さい。スペースなどを使うとシンタックスを破壊してしまうおそれがあります。}} |
||
=== カーネルコマンドラインを使う === |
=== カーネルコマンドラインを使う === |
||
182行目: | 192行目: | ||
[[カーネルパラメータ]]のページで説明されているようにして、あなたのブートローダのカーネルラインに {{ic|1=module_blacklist=modname1,modname2,modname3}} を追加するだけです。 |
[[カーネルパラメータ]]のページで説明されているようにして、あなたのブートローダのカーネルラインに {{ic|1=module_blacklist=modname1,modname2,modname3}} を追加するだけです。 |
||
+ | {{Note| |
||
− | {{Note|複数のモジュールをブラックリスト入りさせるときは、カンマで分割することを覚えておいて下さい。スペースなどを使うとシンタックスを破壊してしまうおそれがあります。}} |
||
+ | * 複数のモジュールをブラックリスト入りさせるときは、カンマで分割することを覚えておいて下さい。スペースなどを使うとシンタックスを破壊してしまうおそれがあります。 |
||
− | |||
+ | * {{ic|module_blacklist}} を使用すると、カーネルはそのモジュールのロードを完全に拒否します。暗黙のロードを防ぎたいだけで、後で手動でモジュールをロードする可能性がある場合は、正しいパラメータは {{ic|1=modprobe.blacklist=modname1,modname2,modname3}} です。ただし、これでは、たとえば[[#systemd|systemd]] や他のモジュールによる起動中の明示的なロードを防ぐことはできません。 |
||
− | == ヒントとテクニック == |
||
+ | }} |
||
− | |||
− | === モジュールパラメータを一覧する Bash 関数 === |
||
− | |||
− | root 権限で実行することで、現在のパラメータ値を含む、現在ロードされているモジュールと全てのパラメータの一覧を表示する関数です。{{ic|/proc/modules}} を使って現在ロードされているモジュールの一覧を取得して、モジュールファイルに modinfo で直接アクセスしてモジュールや(可能ならば)パラメータの説明を引き出し、最後に sysfs ファイルシステムにアクセスして実際のパラメータ名と現在の値を取得しています。 |
||
− | |||
− | {{bc|<nowiki> |
||
− | function aa_mod_parameters () |
||
− | { |
||
− | N=/dev/null; |
||
− | C=`tput op` O=$(echo -en "\n`tput setaf 2`>>> `tput op`"); |
||
− | for mod in $(cat /proc/modules|cut -d" " -f1); |
||
− | do |
||
− | md=/sys/module/$mod/parameters; |
||
− | [[ ! -d $md ]] && continue; |
||
− | m=$mod; |
||
− | d=`modinfo -d $m 2>$N | tr "\n" "\t"`; |
||
− | echo -en "$O$m$C"; |
||
− | [[ ${#d} -gt 0 ]] && echo -n " - $d"; |
||
− | echo; |
||
− | for mc in $(cd $md; echo *); |
||
− | do |
||
− | de=`modinfo -p $mod 2>$N | grep ^$mc 2>$N|sed "s/^$mc=//" 2>$N`; |
||
− | echo -en "\t$mc=`cat $md/$mc 2>$N`"; |
||
− | [[ ${#de} -gt 1 ]] && echo -en " - $de"; |
||
− | echo; |
||
− | done; |
||
− | done |
||
− | }</nowiki>}} |
||
− | |||
− | アウトプットのサンプル: |
||
− | |||
− | {{hc|# aa_mod_parameters|2= |
||
− | >>> ehci_hcd - USB 2.0 'Enhanced' Host Controller (EHCI) Driver |
||
− | hird=0 - hird:host initiated resume duration, +1 for each 75us (int) |
||
− | ignore_oc=N - ignore_oc:ignore bogus hardware overcurrent indications (bool) |
||
− | log2_irq_thresh=0 - log2_irq_thresh:log2 IRQ latency, 1-64 microframes (int) |
||
− | park=0 - park:park setting; 1-3 back-to-back async packets (uint) |
||
− | |||
− | >>> processor - ACPI Processor Driver |
||
− | ignore_ppc=-1 - ignore_ppc:If the frequency of your machine gets wronglylimited by BIOS, this should help (int) |
||
− | ignore_tpc=0 - ignore_tpc:Disable broken BIOS _TPC throttling support (int) |
||
− | latency_factor=2 - latency_factor: (uint) |
||
− | |||
− | >>> usb_storage - USB Mass Storage driver for Linux |
||
− | delay_use=1 - delay_use:seconds to delay before using a new device (uint) |
||
− | option_zero_cd=1 - option_zero_cd:ZeroCD mode (1=Force Modem (default), 2=Allow CD-Rom (uint) |
||
− | quirks= - quirks:supplemental list of device IDs and their quirks (string) |
||
− | swi_tru_install=1 - swi_tru_install:TRU-Install mode (1=Full Logic (def), 2=Force CD-Rom, 3=Force Modem) (uint) |
||
− | |||
− | >>> video - ACPI Video Driver |
||
− | allow_duplicates=N - allow_duplicates: (bool) |
||
− | brightness_switch_enabled=Y - brightness_switch_enabled: (bool) |
||
− | use_bios_initial_backlight=Y - use_bios_initial_backlight: (bool)}} |
||
== トラブルシューティング == |
== トラブルシューティング == |
||
251行目: | 209行目: | ||
== 参照 == |
== 参照 == |
||
− | * [http://linuxmanpages.com/man5/modprobe.conf.5.php modprobe man ページ] |
||
* [[PC スピーカーのビープ音の無効化]] |
* [[PC スピーカーのビープ音の無効化]] |
||
* [https://lwn.net/Articles/391230/ Writing a WMI driver] - an LWM introduction |
* [https://lwn.net/Articles/391230/ Writing a WMI driver] - an LWM introduction |
||
+ | |||
+ | {{TranslationStatus|Kernel module|2024-08-23|803682}} |
2024年8月23日 (金) 18:50時点における最新版
カーネルモジュール は、要求に応じてカーネルにロードおよびアンロードできるコードの一部です。これにより、システムを再起動する必要なく、カーネルの機能を拡張することができます。
カーネルモジュールを作成するには、The Linux Kernel Module Programming Guide を参照してください。モジュールは、ビルトインまたはロード可能として設定できます。モジュールを動的にロードまたは削除するには、カーネルの設定でそのモジュールをロード可能なモジュールとして設定する必要があります(そのモジュールに関連する行には M
という文字が表示されます)。
新しいカーネルがインストールされるときにカーネルモジュールを自動的に再構築するには、Dynamic Kernel Module Support (DKMS) を参照してください。
目次
情報を取得
モジュールは /usr/lib/modules/kernel_release
に保存されます。uname -r
コマンドを使うことで現在のカーネルのリリースバージョンを表示できます。
現在ロードされているカーネルモジュールを表示する:
$ lsmod
モジュールについての情報を表示する:
$ modinfo module_name
ロードされたモジュールに設定されたオプションを一覧する:
$ systool -v -m module_name
全てのモジュールの全ての設定を表示する:
$ modprobe -c | less
特定のモジュールの設定を表示する:
$ modprobe -c | grep module_name
モジュール自身を含む、モジュール(やエイリアス)の依存関係を一覧する:
$ modprobe --show-depends module_name
モジュールの自動ロード
今日、必要なモジュールのロードはすべて udev によって自動的に処理されます。したがって、ツリー外のカーネルモジュールを使用する必要がない場合は、ブート時にロードする必要のあるモジュールを設定ファイルに記述する必要はありません。ただし、ブートプロセスで追加のモジュールをロードしたり、コンピューターを正しく機能させるために他のモジュールをブラックリストに入れるなどのケースが考えられます。
systemd
カーネルモジュールを /etc/modules-load.d/
配下のファイルに明示的にリストアップして、systemd が起動時にロードできるようにすることができます。各設定ファイルの名前の形式は /etc/modules-load.d/program.conf
です。設定ファイルにはロードするカーネルモジュール名のリストが改行で区切られて含まれています。空行と最初の非空白文字が #
または ;
である行は無視されます。
/etc/modules-load.d/virtio-net.conf
# 起動時に virtio_net.ko をロード virtio_net
詳しくは modules-load.d(5) を参照してください。
モジュールの早期ロード
initramfs イメージには、 /etc/modules-load.d/
で要求されたカーネルモジュールが含まれていない場合があります。また、そのフォルダに設定されているファイルが不足している場合もあります。モジュールの早期ロードは使用する initramfs ジェネレータに依存します。
- mkinitcpio: Mkinitcpio#MODULES を参照してください。
- dracut: Dracut#カーネルモジュールの早期ロード を参照してください。
- booster: Booster#モジュールの早期ロード を参照してください。
手動でモジュールを扱う
カーネルモジュールは kmod パッケージによって提供されるツールを使って管理します。これらのツールは手動で使用できます。
モジュールをロードするには:
# modprobe module_name
ファイル名でモジュールをロードするには(つまり、/usr/lib/modules/$(uname -r)/
にインストールされていないモジュール):
# insmod filename [args]
モジュールをアンロードするには:
# modprobe -r module_name
もしくは:
# rmmod module_name
モジュールオプションを設定する
カーネル モジュールにパラメータを渡すには、modprobe を使用してパラメータを手動で渡すか、modprobe 設定ファイルまたはカーネルコマンド ラインを使用して特定のパラメータが常に適用されるようにすることができます。モジュールがカーネルに組み込まれている場合は、カーネル コマンド ラインを使用する必要があり、他の方法は機能しません。
ロード時に modprobe を使って手動で行う
モジュールにパラメータを渡す基本的な方法は、modprobe コマンドを使用することです。パラメータはコマンドラインで単純な key=value
の代入で指定します。
# modprobe module_name parameter_name=parameter_value
/etc/modprobe.d/ 内のファイルを使用する
/etc/modprobe.d/
ディレクトリ内のファイルは、udev にモジュール設定を渡すために使用できます。これにより、システムの起動時に modprobe
を使用してモジュールのロードを管理します。このディレクトリ内の設定ファイルは、.conf 拡張子で終わる任意の名前を持つことができます。構文は次のとおりです:
/etc/modprobe.d/myfilename.conf
options module_name parameter_name=parameter_value
複数のモジュールパラメータはスペースで区切られ、パラメータにはカンマで区切られた値のリストを指定できます:
/etc/modprobe.d/myfilename.conf
options module_name param1=value1 param2=value2a,value2b …
例:
/etc/modprobe.d/thinkfan.conf
# ThinkPad では、'thinkfan' デーモンがファンの速度を制御できるようにします options thinkpad_acpi fan_control=1
カーネルコマンドラインを使う
モジュールがカーネルに組み込まれている場合、モジュールにオプションを設定するのにカーネルコマンドラインを使うこともできます。一般的なブートローダでは次の構文を使って下さい:
modname.parametername=parametercontents
例:
thinkpad_acpi.fan_control=1
カーネルパラメータのページで説明されているようにして、あなたのブートローダのカーネルラインにこれを追加するだけです。
エイリアス
エイリアスによってモジュールに代わりの名前を付けることができます。例: alias my-mod really_long_modulename
で modprobe really_long_modulename
の代わりに modprobe my-mod
を使うことができるようになります。シェルのようにワイルドカードを使うこともできます。alias my-mod* really_long_modulename
で modprobe my-mod-something
が modprobe really_long_modulename
と同じ意味になります。エイリアスを作るには:
/etc/modprobe.d/myalias.conf
alias mymod really_long_module_name
モジュールによっては、アプリケーションがモジュールを必要としたときに自動でロードするためにエイリアスが設定されているものもあります。こういったエイリアスを無効化すると自動ロードも止まります。ただし手動でモジュールをロードすることはできます。
/etc/modprobe.d/modprobe.conf
# Prevent Bluetooth autoload alias net-pf-31 off
ブラックリスト
カーネルモジュールで、ブラックリストとはカーネルモジュールをロードしないようにすることを指します。ブラックリストが役にたつのは、例えば、関連するハードウェアが必要ない場合や、モジュールをロードすると問題が発生する場合: 2つのカーネルモジュールが同じハードウェアをコントロールしようとして、互いにコンフリクトを生じる場合などです。
いくつかのモジュールは initramfs の一部としてロードされます。mkinitcpio -M
ですべての自動検出したモジュールを表示します: initramfs のモジュールのロードを止めるには、/etc/modprobe.d/
中に .conf
ファイルを作成してモジュールをブラックリストに登録します。mkinitcpio -v
を実行することで様々なフック(例: ファイルシステムフック、SCSI フックなど)によって使われている全てのモジュールを一覧できます。モジュールをブラックリスト入りさせたら、イメージを生成し、それから再起動してください。
/etc/modprobe.d/ 内のファイルを使う
/etc/modprobe.d/
内に .conf
ファイルを作成し、blacklist
キーワードを使って一行ずつブラックリスト入りさせたいモジュールを追加します。例えば pcspkr
モジュールをロードさせたくない場合:
/etc/modprobe.d/nobeep.conf
# Do not load the 'pcspkr' module on boot blacklist pcspkr
カーネルコマンドラインを使う
ブートローダでモジュールをブラックリスト入りさせることもできます。
カーネルパラメータのページで説明されているようにして、あなたのブートローダのカーネルラインに module_blacklist=modname1,modname2,modname3
を追加するだけです。
トラブルシューティング
モジュールがロードされない
特定のモジュールがロードされない場合、起動ログ (journalctl -b
で見れます) にモジュールがブラックリストに入っていると書かれているのに /etc/modprobe.d/
ディレクトリには該当するエントリが存在しないとき、/usr/lib/modprobe.d/
にある他の modprobe ソースファイルにブラックリストのエントリがないか確認してください。
カーネルモジュールに含まれている "vermagic" 文字列が、現在実行中のカーネルの値と一致しない場合もモジュールはロードされません。カーネルとモジュールの互換性に問題がないという確証があるときは modprobe --force-vermagic
で "vermagic" のチェックを無視させることができます。
参照
- PC スピーカーのビープ音の無効化
- Writing a WMI driver - an LWM introduction