28 カーネルモジュールの管理 #
Linuxはモノリシックカーネルですが、カーネルモジュールを使用して拡張することができます。カーネルモジュールは、オンデマンドでカーネルに挿入したり、カーネルから削除したりできる特別なオブジェクトです。実際面では、カーネルモジュール自体に含まれないドライバやインタフェースを追加および削除できます。Linuxは、カーネルモジュールを管理するためのコマンドをいくつか備えています。
28.1 lsmodおよびmodinfoによるロード済みモジュールの一覧作成 #
lsmod
コマンドを使用すると、現在ロードされているカーネルモジュールを表示できます。コマンドの出力は次のようになります。
>
lsmod
Module Size Used by
snd_usb_audio 188416 2
snd_usbmidi_lib 36864 1 snd_usb_audio
hid_plantronics 16384 0
snd_rawmidi 36864 1 snd_usbmidi_lib
snd_seq_device 16384 1 snd_rawmidi
fuse 106496 3
nfsv3 45056 1
nfs_acl 16384 1 nfsv3
出力は3つの列に分かれています。Module
列には、ロード済みモジュールの名前が一覧にされ、Size
列には各モジュールのサイズが表示されます。Used by
列には、参照モジュールの数と名前が表示されます。このリストは完全ではない場合があるので注意してください。
特定のカーネルモジュールに関する詳細情報を表示するには、modinfo MODULE_NAME
コマンドを使用します。MODULE_NAMEには、目的のカーネルモジュールの名前を指定します。modinfo
バイナリは、ユーザのPATH環境変数に存在しない/sbin
ディレクトリにあるので注意してください。つまり、modinfo
コマンドを標準ユーザとして実行する場合、バイナリのフルパスを指定する必要があります。
>
/sbin/modinfo kvm
filename: /lib/modules/5.3.18-57-default/kernel/arch/x86/kvm/kvm.ko.xz
license: GPL
author: Qumranet
suserelease: SLE15-SP3
srcversion: 3D8FBA9060D4537359A06FC
depends: irqbypass
supported: yes
retpoline: Y
intree: Y
name: kvm
vermagic: 5.3.18-57-default SMP mod_unload modversions
28.2 カーネルモジュールの追加と削除 #
insmod
とrmmod
を使用してカーネルモジュールを追加および削除できますが、これらの代わりにmodprobe
ツールを使用することをお勧めします。modprobe
には、依存関係の自動解決やブラックリスト化など、重要な利点がいくつかあります。
パラメータを指定せずに使用すると、modprobe
コマンドは、指定したカーネルモジュールをインストールします。modprobe
はルート特権で実行する必要があります。
>
sudo
modprobe acpi
カーネルモジュールを削除するには、-r
パラメータを使用します。
>
sudo
modprobe -r acpi
28.2.1 ブート時のカーネルモジュールの自動ロード #
カーネルモジュールを手動でロードする代わりに、system-modules-load.service
サービスを使用してブートプロセス中に自動的にロードできます。カーネルモジュールを有効にするには、.conf
ファイルを/etc/modules-load.d/
ディレクトリに追加します。次の例のように、設定ファイルにモジュールと同じ名前を付けることをお勧めします。
/etc/modules-load.d/rt2800usb.conf
設定ファイルには目的のカーネルモジュールの名前を記述する必要があります(例: rt2800usb
)。
ここで説明する方法を使用すると、パラメータなしでカーネルモジュールをロードできます。特定のオプションを指定してカーネルモジュールをロードする必要がある場合は、代わりに/etc/modprobe.d/
ディレクトリに設定ファイルを追加します。ファイルには拡張子.conf
を付ける必要があります。ファイルの名前は、priority-modulename.conf
という命名規則に従う必要があります。たとえば、50-thinkfan.conf
のようにします。設定ファイルには、カーネルモジュールの名前と目的のパラメータを記述する必要があります。次のコマンド例を使用すると、カーネルモジュールの名前とそのパラメータが記述された設定ファイルを作成できます。
>
echo "options thinkpad_acpi fan_control=1" | sudo tee /etc/modprobe.d/thinkfan.conf
ほとんどのカーネルモジュールは、デバイスが検出されたときか、ユーザ空間によって特定の機能が要求されたときに、システムによって自動的にロードされます。したがって、ほとんどの場合、モジュールを手動で/etc/modules-load.d/
に追加する必要はありません。
28.2.2 modprobeによるカーネルモジュールのブラックリスト化 #
カーネルモジュールをブラックリスト化すると、そのカーネルモジュールはブートプロセス中にロードされなくなります。これは、システムで問題を引き起こす疑いがあるモジュールを無効にする場合に便利です。なお、カーネルモジュールをブラックリスト化しても、insmod
ツールまたはmodprobe
ツールを使用してそのカーネルモジュールを手動でロードできます。
モジュールをブラックリストに登録するには、次の内容を含むファイル/etc/modprobe.d/60-blacklist-MODULE_NAME.conf
を作成します。
blacklist MODULE_NAME
rootとしてdracut
コマンドを実行して新しいinitrd
イメージを生成し、マシンを再起動します(NAMEを現在のinitrdの名前に置き換え、KERNELVERSIONを現在実行中のカーネルに置き換えます)。
>
su
echo "blacklist nouveau" >> /etc/modprobe.d/60-blacklist-nouveau.conf
/usr/bin/dracut --logfile /var/log/YaST2/mkinitrd.log --force /boot/$initrd-NAME $KERNELVERSION
reboot
カーネルモジュールを一時的にのみ無効にするには、ブート時にオンザフライでブラックリスト化します。そのためには、ブート画面が表示されたらEキーを押します。最小限のエディタが表示され、そこでブートパラメータを変更できます。次のような行を見つけます。
linux /boot/vmlinuz...splash= silent quiet showopts
行の最後にmodprobe.blacklist=MODULE_NAME
コマンドを追加します。例:
linux /boot/vmlinuz...splash= silent quiet showopts modprobe.blacklist=nouveau
F10キーまたはCtrl–Xキーを押し、指定した設定でブートします。
GRUBを使用してカーネルモジュールを完全にブラックリスト化するには、/etc/default/grub
ファイルを編集用に開き、GRUB_CMD_LINUX
コマンドにmodprobe.blacklist=MODULE_NAME
オプションを追加します。次にsudo grub2-mkconfig -o /boot/grub2/grub.cfg
コマンドを実行して、変更を有効にします。