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
はモジュールppdev
とparport_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)
マニュアル・ページを参照してください。
ブート時にロードされるモジュールの指定
ほとんどのモジュールはブート時に自動的にロードされます。必要であれば、ロードするモジュールを追加で指定できます。
ブート時にロードするモジュールを指定するには:
-
/etc/sysconfig/modules
ディレクトリにファイルを作成します。ファイル名には拡張子.modules
(たとえばfoo.modules
)を指定する必要があります。 -
ファイルを編集して、モジュールをロードするスクリプトを作成します。
モジュールをロードするスクリプトは、単純なmodprobeコールにできます。たとえば:
#!/bin/sh modprobe foo
あるいは、より複雑な方法を使用してエラー処理を含めます。
#!/bin/sh if [ ! -c /dev/foo ] ; then exec /sbin/modprobe foo > /dev/null 2>&1 fi
-
次のコマンドを使用して、スクリプトを実行可能にします。
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_64
のextra
ディレクトリにインストールされます。
後続のカーネル更新とは、システムが現在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: インストレーション・ガイドを参照してください。