# Kernel modules (日本語)

関連記事

- Boot debugging
- カーネル
- カーネルパラメータ

カーネルモジュールは小さなコードの集まりであり、必要に応じてカーネルにロード・アンロードすることができます。カーネルモジュールはシステムを再起動する必要なくカーネルの機能を拡張します。

## 概要

カーネルモジュールを作るには、このガイド を読んで下さい。モジュールはビルトインすることもローダブルにすることもできます。動的にモジュールをロード・リムーブするには、カーネル設定でローダブルモジュールとして設定する必要があります (モジュールに関係する行には `M` が表示されます）。

モジュールは `/usr/lib/modules/kernel_release` に保存されます。`uname -r` コマンドを使うことで現在のカーネルのリリースバージョンを表示できます。

Note: モジュール名にはよくアンダーバー (`_`) やダッシュ (`-`) が使われますが、`modprobe` コマンドと `/etc/modprobe.d/` の設定ファイルではこの２つの記号は相互に置き換え可能です。

## 情報を取得

現在ロードされているカーネルモジュールを表示する:

    $ lsmod

モジュールについての情報を表示する:

    $ modinfo module_name

ロードされたモジュールに設定されたオプションを一覧する:

    $ systool -v -m module_name

全てのモジュールの全ての設定を表示する:

    $ modprobe -c | less

特定のモジュールの設定を表示する:

    $ modprobe -c | grep module_name

モジュール自身を含む、モジュール（やエイリアス）の依存関係を一覧する:

    $ modprobe --show-depends module_name

## 設定

今日、必要なモジュールのロードは全て udev によって自動的に処理されているので、カーネルに含まれていないモジュールを使用する必要がないのならば、起動時にロードするモジュールを設定ファイルに記述する必要はありません。ただし、ブートプロセスで追加のモジュールをロードしたり、コンピューターを正しく機能させるために他のモジュールをブラックリストに入れるなどの場合は考えられます。

### ロード

起動時にロードする追加のカーネルモジュールは `/etc/modules-load.d/` 下のファイルにリストとして設定します。それぞれの設定ファイルの名前の形式は `/etc/modules-load.d/<program>.conf` です。設定ファイルにはロードするカーネルモジュールの名前の（行で区切られた）リストだけを記述します。空行や、最初の空白以外の文字が `#` や `;` の行は無視されます。

    /etc/modules-load.d/virtio-net.conf

    #起動時に virtio-net.ko をロード

    virtio-net

詳しくは `modules-load.d(5)` を見て下さい。

### モジュールオプションを設定する

カーネルモジュールにパラメータを指定するために、modprobe の conf ファイルやカーネルコマンドラインを使うことができます。

#### /etc/modprobe.d/ 内のファイルを使う

システムブート中、`modprobe` を使ってモジュールを管理する udev にモジュールの設定をわたすために `/etc/modprobe.d/` ディレクトリ内のファイルが使われます。このディレクトリ内のファイルには `.conf` 拡張子で終わる名前を付けます。構文は:

    /etc/modprobe.d/myfilename.conf

    options modname parametername=parametervalue

例:

    /etc/modprobe.d/thinkfan.conf

    # On Thinkpads, this lets the 'thinkfan' daemon control fan speed

    options thinkpad_acpi fan_control=1

Note: 影響を受けるモジュールが init ramdisk からロードされる場合、適切な `.conf` ファイルを mkinitcpio.conf の FILES に追加するか `modconf` hook を使うかして、ramdisk に含まれるようにする必要があります。

#### カーネルコマンドラインを使う

モジュールがカーネルに組み込まれている場合、モジュールにオプションを設定するのにカーネルコマンドラインを使うこともできます。一般的なブートローダでは次の構文を使って下さい:

    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/modprobe.conf` でブラックリスト入りさせてください。`mkinitcpio -v` を実行することで様々なフック（例: ファイルシステムフック、SCSI フックなど）によって使われている全てのモジュールを一覧できます。モジュールをブラックリスト入りさせたら、`/etc/mkinitcpio.conf` の FILES セクションに使った `.conf` ファイルを忘れずに追加して initramfs を再生成し、それから再起動してください。

#### /etc/modprobe.d/ 内のファイルを使う

`/etc/modprobe.d/` 内に `.conf` ファイルを作成し、`blacklist` キーワードを使って一行ずつブラックリスト入りさせたいモジュールを追加します。例えば `pcspkr` モジュールをロードさせたくない場合:

    /etc/modprobe.d/nobeep.conf

    # Do not load the 'pcspkr' module on boot

    blacklist pcspkr

Note: `blacklist` コマンドはモジュールをブラックリスト入りさせて自動でロードしないようにしますが、他のブラックリスト入りしてないモジュールによって必要になった場合、モジュールがロードされることがあります。また、手動でモジュールをロードすることも可能です。

しかしながら、この挙動を変えることが可能です; `install` コマンドを使って、modprobe に通常通りカーネルでモジュールを挿入する代わりにカスタムコマンドを実行させることで、いつでもモジュールのロードが失敗するように強制することができます:

    /etc/modprobe.d/blacklist.conf

    ...
    install module_name /bin/false
    ...

事実上の、モジュールとそれが必要な他のモジュールのブラックリスト化になります。

#### カーネルコマンドラインを使う

Tip: 問題のあるモジュールによってシステムが起動できない場合、この方法が役に立つでしょう。

ブートローダでモジュールをブラックリスト入りさせることもできます。

カーネルパラメータのページで説明されているようにして、あなたのブートローダのカーネルラインに `modprobe.blacklist=modname1,modname2,modname3` を追加するだけです。

Note: 複数のモジュールをブラックリスト入りさせるときは、カンマで分割することを覚えておいて下さい。スペースなどを使うとシンタックスを破壊してしまうおそれがあります。

## 手動でモジュールを扱う

カーネルモジュールは kmod パッケージによって提供されるツールを使って管理します。これらのツールは手動で使用できます。

モジュールをロードするには:

    # modprobe module_name

モジュールをアンロードするには:

    # modprobe -r module_name

もしくは:

    # rmmod module_name

設定ファイルをリロードするには:

    # systemctl restart systemd-modules-load.service

## Tips and tricks

### モジュールパラメータを一覧する Bash 関数

root 権限で実行することで、現在のパラメータ値を含む、現在ロードされているモジュールと全てのパラメータの一覧を表示する関数です。`/proc/modules` を使って現在ロードされているモジュールの一覧を取得して、モジュールファイルに modinfo で直接アクセスしてモジュールや（可能ならば）パラメータの説明を引き出し、最後に sysfs ファイルシステムにアクセスして実際のパラメータ名と現在の値を取得しています。

    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
    }

アウトプットのサンプル:

    # aa_mod_parameters

    >>> 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)

## 参照

- modprobe man ページ
- Disable PC Speaker Beep (日本語)

Categories:

- Kernel (日本語)
- Hardware detection and troubleshooting (日本語)
- Boot process (日本語)