5 カーネル・モジュール

警告:

Oracle Linux 7は現在延長サポート中です。詳細は、Oracle Linux拡張サポートおよびOracleオープン・ソース・サポート・ポリシーを参照してください。

できるだけ早くアプリケーションとデータをOracle Linux 8またはOracle Linux 9に移行してください。

この章では、カーネル・モジュールのロード、アンロード、および動作の変更を行う方法について説明します。

カーネル・モジュールについて

ブート・ローダーはカーネルをメモリーにロードします。ソース・ファイルをカーネル・ソース・ツリーに含めてカーネルを再コンパイルすることにより、新しいコードをカーネルに追加できます。カーネル・モジュールは、要求に応じて動的にロードおよびアンロードでき、カーネルによる新しいハードウェアへのアクセス、異なるファイル・システム・タイプのサポート、および他の方法での機能の拡張を可能にするデバイス・ドライバを提供します。未使用のデバイス・ドライバにメモリーを浪費しないよう、Oracle Linuxではロード可能なカーネル・モジュール(LKM)をサポートしているので、メモリーにロードする必要があるデバイス・ドライバとカーネル・コードのみを使用してシステムを実行できます。

ロードしたモジュールに関する情報のリスト

lsmodコマンドを使用して、現在カーネルにロードされているモジュールをリストします。

sudo lsmod
Module                  Size  Used by
nls_utf8                1405  1 
fuse                   59164  0 
tun                    12079  0  
autofs4                22739  3 
...
ppdev                   7901  0 
parport_pc             21262  0 
parport                33812  2 ppdev,parport_pc
...

ノート:

このコマンドでは、/proc/modulesファイルを読み取ることによってその出力が生成されます。

出力には、モジュール名、使用しているメモリーの量、モジュールを使用しているプロセスの数、およびそのモジュールが依存している他のモジュールの名前が表示されます。サンプル出力では、モジュールparportはモジュールppdevparport_pcに依存し、これらはparportの前にロードされます。2つのプロセスが現在、3つのモジュールすべてを使用しています。

モジュールの詳細情報を表示するには、modinfoコマンドを使用します。たとえば:

sudo modinfo ahci
filename:       /lib/modules/2.6.32-300.27.1.el6uek.x86_64/kernel/drivers/ata/ahci.ko
version:        3.0
license:        GPL
description:    AHCI SATA low-level driver
author:         Jeff Garzik
srcversion:     AC5EC885397BF332DE16389
alias:          pci:v*d*sv*sd*bc01sc06i01*
...
depends:        
vermagic:       2.6.32-300.27.1.el6uek.x86_64 SMP mod_unload modversions 
parm:           skip_host_reset:skip global host reset (0=don't skip, 1=skip) (int)
parm:           ignore_sss:Ignore staggered spinup flag (0=don't ignore, 1=ignore) (int)
...

出力には、次の情報が含まれています。

filename

カーネル・オブジェクト・ファイルの絶対パス。

version

モジュールのバージョン番号。

description

モジュールの簡単な説明。

srcversion

モジュールを作成するために使用されたソース・コードのハッシュ。

alias

モジュールの内部別名。

depends

このモジュールが依存しているモジュールのカンマ区切りリスト。

vermagic

モジュールのコンパイルに使用されたカーネル・バージョンであり、モジュールのロード時に現在のカーネルに対してチェックされます。

parm

モジュール・パラメータおよび説明。

モジュールは、/lib/modules/kernel_version/kernelディレクトリのカーネル・オブジェクト(ko)ファイルからカーネルにロードされます。カーネル・オブジェクト・ファイルの絶対パスを表示するには、-nオプションを指定します。たとえば:

sudo modinfo -n parport
/lib/modules/2.6.32-300.27.1.el6uek.x86_64/kernel/drivers/parport/parport.ko

詳細は、lsmod(5)およびmodinfo(8)の各マニュアル・ページを参照してください。

モジュールのロードおよびアンロード

次の例のように、modprobeコマンドでカーネル・モジュールがロードされます。

sudo modprobe nfs
sudo lsmod | grep nfs
nfs                   266415  0 
lockd                  66530  1 nfs
fscache                41704  1 nfs
nfs_acl                 2477  1 nfs
auth_rpcgss            38976  1 nfs
sunrpc                204268  5 nfs,lockd,nfs_acl,auth_rpcgss

-v詳細オプションを使用すると、依存性を解決するために追加のモジュールがロードされるかどうかが表示されます。

sudo modprobe -v nfs
insmod /lib/modules/2.6.32-300.27.1.el6uek.x86_64/kernel/net/sunrpc/auth_gss/auth_rpcgss.ko 
insmod /lib/modules/2.6.32-300.27.1.el6uek.x86_64/kernel/fs/nfs_common/nfs_acl.ko 
insmod /lib/modules/2.6.32-300.27.1.el6uek.x86_64/kernel/fs/fscache/fscache.ko 
...

依存性を確認するには、modprobeコマンドで、カーネル・モジュールのインストール時にdepmodユーティリティによって作成される、/lib/modules/kernel_version/modules.depファイルを問い合せます。

ノート:

modprobeでは、すでにロードされているモジュールはリロードされません。モジュールを再度ロードするには、最初にアンロードする必要があります。

カーネル・モジュールをアンロードするには、-rオプションを使用します。たとえば:

sudo modprobe -rv nfs
rmmod /lib/modules/2.6.32-300.27.1.el6uek.x86_64/kernel/fs/nfs/nfs.ko
rmmod /lib/modules/2.6.32-300.27.1.el6uek.x86_64/kernel/fs/lockd/lockd.ko
rmmod /lib/modules/2.6.32-300.27.1.el6uek.x86_64/kernel/fs/fscache/fscache.ko
...

モジュールはロードされた順序と逆の順序でアンロードされます。モジュールは、プロセスまたは別のロード済モジュールで必要な場合はアンロードされません。

ノート:

modprobeでは、モジュールのロードとアンロードにinsmodおよびrmmodユーティリティが使用されます。insmodおよびrmmodではモジュールの依存性が解決されないため、これらのユーティリティは使用しないでください。

詳細は、modprobe(8)およびmodules.dep(5)の各マニュアル・ページを参照してください。

モジュール・パラメータについて

モジュールでは、modprobeを使用してモジュールの動作を変更する際に指定できるパラメータを受け入れます。

sudo modprobe module_name parameter=value ...

複数のパラメータ/値ペアはスペースを使用して区切ります。配列値は、カンマ区切りリストで表します。たとえば:

sudo modprobe foo arrayparm=1,2,3,4

また、/sys/module/module_name/parametersの下のファイルに新しい値を記述して、ロードされたモジュールおよび組込みドライバのパラメータの値を変更することもできます。たとえば:

echo 0 > /sys/module/ahci/parameters/skip_host_reset

/etc/modprobe.dディレクトリには.conf構成ファイルが含まれ、このファイルでは、モジュール・オプションの指定、モジュール別名の作成、および特別な要件があるモジュールでのmodprobeの通常動作のオーバーライドを行います。以前のバージョンのmodprobeで使用されていた/etc/modprobe.confファイルも有効です(存在する場合)。/etc/modprobe.confファイルと/etc/modprobe.d/*.confファイルのエントリには同じ構文を使用します。

次に、modprobe構成ファイルで一般的に使用されるコマンドを示します。

alias

モジュールの代替名を作成します。aliasには、シェルのワイルドカードを含めることができます。たとえば、次のように、sd-modモジュールの別名を作成します。

alias block-major-8-* sd_mod

これにより、modprobe block-major-8-0のようなコマンドはmodprobe sd_modと同じ結果になります。

blacklist

modinfoコマンドによって表示されるモジュールの内部別名を無視します。通常、このコマンドは、関連付けられたハードウェアが不要な場合、複数のモジュールが同じデバイスをサポートする場合、またはモジュールがデバイスのサポートを不正に要求する場合に使用されます。たとえば、フレーム・バッファ・ドライバcirrusfbの別名をブロックリストするには:

blacklist cirrusfb

/etc/modprobe.d/blacklist.confファイルによってhotplugスクリプトがモジュールをロードできないため、通常は、最初にどのドライバがプローブされるかに関係なく、別のドライバがかわりにモジュールをバインドします。

install

モジュールをカーネルにロードするかわりに、シェル・コマンドを実行します。たとえば、次のように、snd-emu10k1のかわりにモジュールsnd-emu10k1-synthをロードします。

install snd-emu10k1 /sbin/modprobe --ignore-install snd-emu10k1 && \
/sbin/modprobe snd-emu10k1-synth
options

モジュールのオプションを定義します。たとえば、次のように、b43モジュールのnohwcryptおよびqosオプションを定義します。

options b43 nohwcrypt=1 qos=0
remove

モジュールをアンロードするかわりに、シェル・コマンドを実行します。たとえば、次のように、nfsdモジュールをアンロードする前に/proc/fs/nfsdをアンマウントします。

remove nfsd { /bin/umount /proc/fs/nfsd > /dev/null 2>&1 || :; } ; \
/sbin/modprobe -r --first-time --ignore-remove nfsd

詳細は、modprobe.conf(5)マニュアル・ページを参照してください。

ブート時にロードされるモジュールの指定

ほとんどのモジュールはブート時に自動的にロードされます。必要であれば、ロードするモジュールを追加で指定できます。

ブート時にロードするモジュールを指定するには:

  1. /etc/sysconfig/modulesディレクトリにファイルを作成します。ファイル名には拡張子.modules (たとえばfoo.modules)を指定する必要があります。

  2. ファイルを編集して、モジュールをロードするスクリプトを作成します。

    モジュールをロードするスクリプトは、単純なmodprobeコールにできます。たとえば:

    #!/bin/sh
    modprobe foo

    あるいは、より複雑な方法を使用してエラー処理を含めます。

    #!/bin/sh
    if [ ! -c /dev/foo ] ; then
      exec /sbin/modprobe foo > /dev/null 2>&1
    fi
  3. 次のコマンドを使用して、スクリプトを実行可能にします。

    sudo chmod 755 /etc/sysconfig/modules/foo.modules

弱い更新モジュールについて

ドライバ更新ディスクを使用してインストールされたドライバなどの外部モジュールは、通常、/lib/modules/kernel-version/extraにインストールされます。このディレクトリに格納されているモジュールは、ロードしようとすると、カーネル自体に含まれている一致するモジュールより優先されます。つまり、外部ドライバおよびモジュールをインストールして、ハードウェアの問題を解決する必要があるカーネル・モジュールをオーバーライドできます。後続の各カーネルの更新では、互換性のあるカーネルで外部モジュールを利用できるようにして、影響を受けるハードウェアとのドライバの非互換性によるブートの問題を避けることが重要です。

互換性のあるカーネル更新ごとに外部モジュールをロードする必要があることはシステムに不可欠であるため、互換性のあるカーネルの弱い更新モジュールとして外部モジュールをロードできるように、メカニズムが確立されています。弱い更新モジュールは、/lib/modules/kernel-version/weak-updatesディレクトリに互換性のあるモジュールへのシンボリック・リンクを作成することで利用できます。パッケージ・マネージャは、互換性のあるカーネルの/lib/modules/kernel-version/extraディレクトリにインストールされているドライバ・モジュールを検出すると、このプロセスを自動的に処理します。たとえば、Oracle Linux 7.4のDriver Update Disk (DUD)にkmod-megaraid_sas-uekドライバ更新パッケージをインストールすると、次のものがインストールされることがあります。

/lib/modules/4.1.12-61.1.18.el7uek.x86_64/extra/megaraid_sas
/lib/modules/4.1.12-61.1.18.el7uek.x86_64/extra/megaraid_sas/megaraid_sas.ko

新しいドライバ・モジュールは、当初モジュールを構築するために使用されたカーネル・バージョンである4.1.12-61.1.18.el7uek.x86_64extraディレクトリにインストールされます。

後続のカーネル更新とは、システムが現在4.1.12-112.14.13.el7uek.x86_64バージョンのカーネルを実行していることを意味します。このカーネルは、以前のカーネルにインストールされたモジュールと互換性があるため、インストール・プロセスの一部として外部モジュールがシンボリック・リンクとしてweak-updatesディレクトリに自動的に追加されます。

ls -l /lib/modules/4.1.12-112.14.13.el7uek.x86_64/weak-updates/megaraid_sas/*.ko
lrwxrwxrwx. 1 root root 76 Jan 30 04:52 /lib/modules/4.1.12-112.14.13.el7uek.x86_64\
    /weak-updates/megaraid_sas/megaraid_sas.ko \
     -> /lib/modules/4.1.12-61.1.18.el7uek.x86_64/extra/megaraid_sas/megaraid_sas.ko

出力は、後続のカーネル更新のために外部モジュールがロードされることを意味します。

ほとんどの場合、弱い更新は理にかなっており、後続のカーネル更新で外部モジュールを実行するために余分な作業をする必要がないことを保証します。これにより、カーネルのアップグレード後にドライバに関連するブートの問題の可能性が回避され、システムとそのハードウェアの予測可能な実行を維持できます。

場合によっては、新しいカーネルの弱い更新モジュールを削除することもできます。たとえば、新しいカーネルで出荷されたドライバで問題が解決されており、ドライバの更新の一部としてインストールした外部モジュールよりもこのドライバの使用を優先する場合です。

弱い更新モジュールは、各カーネルのシンボリック・リンクを手動で削除することによって削除できます。次に例を示します。

sudo rm -rf /lib/modules/4.1.12-112.14.13.el7uek.x86_64/weak-updates/megaraid_sas/

外部ドライバ・モジュールおよびドライバ更新ディスクの詳細は、Oracle Linux 7: インストレーション・ガイドを参照してください。