20 カーネルモジュールの管理 #
Linuxはモノリシックカーネルですが、カーネルモジュールを使用して拡張することができます。カーネルモジュールは、オンデマンドでカーネルに挿入したり、カーネルから削除したりできる特別なオブジェクトです。実際面では、カーネルモジュール自体に含まれないドライバやインタフェースを追加および削除できます。Linuxは、カーネルモジュールを管理するためのコマンドをいくつか備えています。
20.1 lsmodおよびmodinfoによるロード済みモジュールの一覧作成 #
lsmod
コマンドを使用すると、現在ロードされているカーネルモジュールを表示できます。コマンドの出力は次のようになります。
tux >
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/4.12.14-94.37-default/kernel/arch/x86/kvm/kvm.ko license: GPL author: Qumranet srcversion: BDFD8098BEEA517CB75959B depends: irqbypass intree: Y vermagic: 4.4.57-18.3-default SMP mod_unload modversions signer: openSUSE Secure Boot Signkey sig_key: 03:32:FA:9C:BF:0D:88:BF:21:92:4B:0D:E8:2A:09:A5:4D:5D:EF:C8 sig_hashalgo: sha256 parm: ignore_msrs:bool parm: min_timer_period_us:uint parm: kvmclock_periodic_sync:bool parm: tsc_tolerance_ppm:uint parm: lapic_timer_advance_ns:uint parm: halt_poll_ns:uint parm: halt_poll_ns_grow:int parm: halt_poll_ns_shrink:int
20.2 カーネルモジュールの追加と削除 #
insmod
とrmmod
を使用してカーネルモジュールを追加および削除できますが、これらの代わりにmodprobe
ツールを使用することをお勧めします。modprobe
には、依存関係の自動解決やブラックリスト化など、重要な利点がいくつかあります。
パラメータを指定せずに使用すると、modprobe
コマンドは、指定したカーネルモジュールをインストールします。modprobe
はルート特権で実行する必要があります。
tux >
sudo modprobe acpi
カーネルモジュールを削除するには、-r
パラメータを使用します。
sudo modprobe -r acpi
20.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/
に追加する必要はありません。
20.2.2 modprobeによるカーネルモジュールのブラックリスト化 #
カーネルモジュールをブラックリスト化すると、そのカーネルモジュールはブートプロセス中にロードされなくなります。これは、システムで問題を引き起こす疑いがあるモジュールを無効にする場合に便利です。なお、カーネルモジュールをブラックリスト化しても、insmod
ツールまたはmodprobe
ツールを使用してそのカーネルモジュールを手動でロードできます。
モジュールをブラックリスト化するには、blacklist MODULE_NAME
という行を/etc/modprobe.d/50-blacklist.conf
ファイルに追加します。次に例を示します。
blacklist nouveau
mkinitrd
コマンドをrootとして実行して、新しいinitrd
イメージを作成し、マシンを再起動します。これらの手順は次のコマンドを使用して実行できます。
su echo "blacklist nouveau" >> /etc/modprobe.d/50-blacklist.conf && mkinitrd && 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
コマンドを実行して、変更を有効にします。