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コマンドを実行して、変更を有効にします。