Difference between revisions of "Kernel modules (日本語)"

From ArchWiki
Jump to: navigation, search
m
m
Line 53: Line 53:
 
  $ modprobe --show-depends ''module_name''
 
  $ modprobe --show-depends ''module_name''
  
== ロード ==
+
== 設定 ==
  
Linux カーネルにモジュールを追加・除去するには {{ic|modprobe}} コマンドを使います。
+
今日、必要なモジュールのロードは全て [[udev]] によって自動的に処理されているので、カーネルに含まれていないモジュールを使用する必要がないのならば、起動時にロードするモジュールを設定ファイルに記述する必要はありません。ただし、ブートプロセスで追加のモジュールをロードしたり、コンピューターを正しく機能させるために他のモジュールをブラックリストに入れるなどの場合は考えられます。
手動でモジュールをロード(追加)するには、次を実行してください:
+
  
# modprobe ''module_name''
+
=== ロード ===
  
ほとんどのモジュールは必要に応じてロードしてください。起動時に無条件でロードするモジュールは {{ic|/etc/modules-load.d/}} で明記します、例えば:
+
起動時にロードする追加のカーネルモジュールは {{ic|/etc/modules-load.d/}} 下のファイルにリストとして設定します。それぞれの設定ファイルの名前の形式は {{ic|/etc/modules-load.d/<program>.conf}} です。設定ファイルにはロードするカーネルモジュールの名前の(行で区切られた)リストだけを記述します。空行や、最初の空白以外の文字が {{ic|#}} や {{ic|;}} の行は無視されます。
  
 
{{hc|/etc/modules-load.d/virtio-net.conf|
 
{{hc|/etc/modules-load.d/virtio-net.conf|
#Load 'virtio-net.ko' at boot.
+
#起動時に virtio-net.ko をロード
  
 
virtio-net}}
 
virtio-net}}
  
== 除去 ==
+
詳しくは {{ic|modules-load.d(5)}} を見て下さい。
  
時々、モジュールを除去(アンロード)する必要があるかもしれません; その場合は次のコマンドを使います:
+
=== モジュールオプションを設定する ===
  
# modprobe -r ''module_name''
+
カーネルモジュールにパラメータを指定するために、modprobe の conf ファイルやカーネルコマンドラインを使うことができます。
 
+
もしくは:
+
 
+
# rmmod ''module_name''
+
 
+
== 設定 ==
+
 
+
カーネルモジュールにパラメータを設定するには modprobe .conf ファイルかカーネルコマンドラインを使って下さい。[[Systemd (日本語)#カーネルモジュール]] も見て下さい。
+
  
 
=== /etc/modprobe.d/ 内のファイルを使う ===
 
=== /etc/modprobe.d/ 内のファイルを使う ===
  
システムブート中、{{ic|modprobe}} を使ってモジュールを管理する [[udev]] にモジュールの設定をわたすために {{ic|/etc/modprobe.d/}} ディレクトリが使われます。このディレクトリ内には {{ic|.conf}} 拡張子が付いた名前の設定ファイルを置くことができます。構文は:
+
システムブート中、{{ic|modprobe}} を使ってモジュールを管理する [[udev]] にモジュールの設定をわたすために {{ic|/etc/modprobe.d/}} ディレクトリ内のファイルが使われます。このディレクトリ内のファイルには {{ic|.conf}} 拡張子で終わる名前を付けます。構文は:
 +
 
 
{{hc|/etc/modprobe.d/myfilename.conf|2=
 
{{hc|/etc/modprobe.d/myfilename.conf|2=
options modname parametername=parametercontents}}
+
options modname parametername=parametervalue}}
  
 
例:
 
例:
  
 
{{hc|/etc/modprobe.d/thinkfan.conf|2=
 
{{hc|/etc/modprobe.d/thinkfan.conf|2=
#On Thinkpads, this lets the 'thinkfan' daemon control fan speed.
+
# On Thinkpads, this lets the 'thinkfan' daemon control fan speed
  
 
options thinkpad_acpi fan_control=1}}
 
options thinkpad_acpi fan_control=1}}
  
=== カーネルコマンドラインを使う ===
+
{{Note|影響を受けるモジュールが init ramdisk からロードされる場合、適切な {{ic|.conf}} ファイルを [[mkinitcpio (日本語)|mkinitcpio.conf]] の FILES に追加して、ramdisk に含まれるようにする必要があります。}}
 +
 
 +
==== カーネルコマンドラインを使う ====
  
 
モジュールがカーネルに組み込まれている場合、モジュールにオプションを設定するのにカーネルコマンドラインを使うこともできます。一般的なブートローダでは次の構文を使って下さい:
 
モジュールがカーネルに組み込まれている場合、モジュールにオプションを設定するのにカーネルコマンドラインを使うこともできます。一般的なブートローダでは次の構文を使って下さい:
Line 106: Line 100:
 
[[Kernel parameters (日本語)|カーネルパラメータ]]のページで説明されているようにして、あなたのブートローダのカーネルラインにこれを追加するだけです。
 
[[Kernel parameters (日本語)|カーネルパラメータ]]のページで説明されているようにして、あなたのブートローダのカーネルラインにこれを追加するだけです。
  
== エイリアス ==
+
=== エイリアス ===
  
エイリアスによってモジュールに代わりの名前を付けることができます。例: "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" と同じ意味になります。エイリアスを作るには:
+
エイリアスによってモジュールに代わりの名前を付けることができます。例: {{ic|alias my-mod really_long_modulename}} {{ic|modprobe really_long_modulename}} の代わりに {{ic|modprobe my-mod}} を使うことができるようになります。シェルのようにワイルドカードを使うこともできます。{{ic|alias my-mod* really_long_modulename}} {{ic|modprobe my-mod-something}} {{ic|modprobe really_long_modulename}} と同じ意味になります。エイリアスを作るには:
  
 
{{hc|/etc/modprobe.d/myalias.conf|
 
{{hc|/etc/modprobe.d/myalias.conf|
alias mymod ''really_long_module_name''}}
+
alias mymod really_long_module_name}}
  
 
モジュールによっては、アプリケーションがモジュールを必要としたときに自動でロードするためにエイリアスが設定されているものもあります。こういったエイリアスを無効化すると自動ロードも止まります。ただし手動でモジュールをロードすることはできます。
 
モジュールによっては、アプリケーションがモジュールを必要としたときに自動でロードするためにエイリアスが設定されているものもあります。こういったエイリアスを無効化すると自動ロードも止まります。ただし手動でモジュールをロードすることはできます。
  
 
{{hc|/etc/modprobe.d/modprobe.conf|
 
{{hc|/etc/modprobe.d/modprobe.conf|
#Prevent Bluetooth autoload.
+
# Prevent Bluetooth autoload
  
 
alias net-pf-31 off}}
 
alias net-pf-31 off}}
  
== ブラックリスト ==
+
=== ブラックリスト ===
  
カーネルモジュールで、ブラックリストとはカーネルモジュールをロードしないようにすることを指します。このことが役にたつのは、例えば、関連するハードウェアが必要ない場合や、モジュールをロードすると問題が発生する場合: 2つのカーネルモジュールが同じハードウェアをコントロールしようとして、互いにコンフリクトを生じる場合などです。
+
カーネルモジュールで、ブラックリストとはカーネルモジュールをロードしないようにすることを指します。ブラックリストが役にたつのは、例えば、関連するハードウェアが必要ない場合や、モジュールをロードすると問題が発生する場合: 2つのカーネルモジュールが同じハードウェアをコントロールしようとして、互いにコンフリクトを生じる場合などです。
  
 
いくつかのモジュールは [[mkinitcpio (日本語)|initramfs]] の一部としてロードされます。{{ic|mkinitcpio -M}} ですべての自動検出したモジュールを表示します: initramfs のモジュールのロードを止めるには、モジュールを {{ic|/etc/modprobe.d/modprobe.conf}} でブラックリスト入りさせてください。{{ic|mkinitcpio -v}} を実行することで様々なフック(例: ファイルシステムフック、SCSI フックなど)によって使われている全てのモジュールを一覧できます。モジュールをブラックリスト入りさせたら、{{ic|/etc/mkinitcpio.conf}} の FILES セクションに使った {{ic|.conf}} ファイルを忘れずに追加して initramfs を再生成し、それから再起動してください。
 
いくつかのモジュールは [[mkinitcpio (日本語)|initramfs]] の一部としてロードされます。{{ic|mkinitcpio -M}} ですべての自動検出したモジュールを表示します: initramfs のモジュールのロードを止めるには、モジュールを {{ic|/etc/modprobe.d/modprobe.conf}} でブラックリスト入りさせてください。{{ic|mkinitcpio -v}} を実行することで様々なフック(例: ファイルシステムフック、SCSI フックなど)によって使われている全てのモジュールを一覧できます。モジュールをブラックリスト入りさせたら、{{ic|/etc/mkinitcpio.conf}} の FILES セクションに使った {{ic|.conf}} ファイルを忘れずに追加して initramfs を再生成し、それから再起動してください。
  
=== /etc/modprobe.d/ 内のファイルを使う ===
+
==== /etc/modprobe.d/ 内のファイルを使う ====
  
 
{{ic|/etc/modprobe.d/}} 内に {{ic|.conf}} ファイルを作成し、{{ic|blacklist}} キーワードを使って一行ずつブラックリスト入りさせたいモジュールを追加します。例えば {{ic|pcspkr}} モジュールをロードさせたくない場合:
 
{{ic|/etc/modprobe.d/}} 内に {{ic|.conf}} ファイルを作成し、{{ic|blacklist}} キーワードを使って一行ずつブラックリスト入りさせたいモジュールを追加します。例えば {{ic|pcspkr}} モジュールをロードさせたくない場合:
  
 
{{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}}
Line 146: Line 140:
 
事実上の、モジュールとそれが必要な他のモジュールのブラックリスト化になります。}}
 
事実上の、モジュールとそれが必要な他のモジュールのブラックリスト化になります。}}
  
=== カーネルコマンドラインを使う ===
+
==== カーネルコマンドラインを使う ====
  
 
{{Tip|問題のあるモジュールによってシステムが起動できない場合、この方法が役に立つでしょう。}}
 
{{Tip|問題のあるモジュールによってシステムが起動できない場合、この方法が役に立つでしょう。}}
Line 155: Line 149:
  
 
{{Note|複数のモジュールをブラックリスト入りさせるときは、カンマで分割することを覚えておいて下さい。スペースなどを使うとシンタックスを破壊してしまうおそれがあります。}}
 
{{Note|複数のモジュールをブラックリスト入りさせるときは、カンマで分割することを覚えておいて下さい。スペースなどを使うとシンタックスを破壊してしまうおそれがあります。}}
 +
 +
== 手動でモジュールを扱う ==
 +
 +
カーネルモジュールは {{Pkg|kmod}} パッケージによって提供されるツールを使って管理します。これらのツールは手動で使用できます。
 +
 +
モジュールをロードするには:
 +
 +
# modprobe ''module_name''
 +
 +
モジュールをアンロードするには:
 +
 +
# modprobe -r ''module_name''
 +
 +
もしくは:
 +
 +
# rmmod ''module_name''
  
 
== Tips and tricks ==
 
== Tips and tricks ==
Line 213: Line 223:
 
== 関連項目 ==
 
== 関連項目 ==
  
*[[Disable PC Speaker Beep (日本語)]]
+
* [[Disable PC Speaker Beep (日本語)]]

Revision as of 12:07, 3 September 2013

Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary heading Template:Article summary link Template:Article summary end

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

概要

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

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

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

情報を取得

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

$ 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 に追加して、ramdisk に含まれるようにする必要があります。

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

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

modname.parametername=parametercontents

例:

thinkpad_acpi.fan_control=1

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

エイリアス

エイリアスによってモジュールに代わりの名前を付けることができます。例: alias my-mod really_long_modulenamemodprobe really_long_modulename の代わりに modprobe my-mod を使うことができるようになります。シェルのようにワイルドカードを使うこともできます。alias my-mod* really_long_modulenamemodprobe my-mod-somethingmodprobe 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

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)

関連項目