hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

カーネルモジュールのロード、アンロード方法



1 はじめに

カーネルモジュール(以降、モジュールと呼びます)のロード、アンロードをmodprobe,insmod/rmmodコマンドを使って確認してみます。
modprobeはモジュールの依存関係を考慮して依存するモジュールを自動的にロードします。一方、insmodは依存するモジュールを手動で先にロードする必要があります。この違いについて確認してみます。なお、カーネルモジュールの作成方法は、カーネルモジュールの作り方 - hana_shinのLinux技術ブログを参照してください。

2 検証環境

CentOS版数は以下のとおりです。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

3 コマンド一覧

モジュールのロード、アンロードに関係するコマンド一覧を以下に示します。

コマンド 概要
lsmod ロードされているモジュールの一覧を表示する
depmod モジュールの依存関係の作成/表示を行う
modprobe 依存するモジュールも含めて自動でロードする。-rを付けるとアンロードする
insmod モジュールをロードする。依存するモジュールがロードされていない場合、エラーになる
rmmod モジュールをアンロードする
modinfo モジュールの情報を表示する

4 モジュールの格納場所

モジュールは、「/lib/modules/カーネル版数」以下の場所に格納されています。本環境のカーネル版数は、uname -rの実行結果より、3.10.0-1160.el7.x86_64です。

モジュールが格納されているディレクトリのパスを確認します。

[root@server 3.10.0-1160.el7.x86_64]# pwd
/lib/modules/3.10.0-1160.el7.x86_64

「/lib/modules/3.10.0-1160.el7.x86_64」配下には、以下のファイル、ディレクトリがあります。

[root@server 3.10.0-1160.el7.x86_64]# ls -F
build@         modules.alias.bin    modules.dep      modules.modesetting  modules.symbols      vdso/
extra/         modules.block        modules.dep.bin  modules.networking   modules.symbols.bin  weak-updates/
kernel/        modules.builtin      modules.devname  modules.order        source@
modules.alias  modules.builtin.bin  modules.drm      modules.softdep      updates/

5 modprobeコマンドによるモジュールのロード/アンロード方法

5.1 依存関係の確認

depmodコマンドを使って依存関係を確認してみます。tcp_diagモジュールは、inet_diagモジュールに依存していることがわかります。

[root@server ~]# depmod -n|grep tcp_diag
kernel/net/ipv4/tcp_diag.ko.xz: kernel/net/ipv4/inet_diag.ko.xz

「依存」とは、tcp_diagモジュールをロードする時、inet_diagモジュールが先にロードされていなければいけない、ということ意味します。

5.2 ロード方法

ここでは、tcp_diagモジュールをロードします。まず、初期状態を確認します。tcp_diagモジュールもinet_diagモジュールもロードされていないことがわかります。

[root@server ~]# lsmod |grep -E 'tcp_diag|inet_diag'
[root@server ~]#

次に、tcp_diagモジュールをロードします。

[root@server ~]# modprobe tcp_diag

ロードされたモジュールを確認します。tcp_diagモジュールとinet_diagモジュールがロードされています。inet_diagモジュールが、自動的にロードされたことがわかります、

[root@server ~]# lsmod |grep -E 'tcp_diag|inet_diag'
tcp_diag               12591  0
inet_diag              18949  1 tcp_diag

5.3 アンロード方法

初期状態を確認します。tcp_diagとinet_diagがロードされていることがわかります。

[root@server ~]# lsmod |grep -E 'tcp_diag|inet_diag'
tcp_diag               12591  0
inet_diag              18949  1 tcp_diag

tcp_diagモジュールをアンロードします。

[root@server ~]# modprobe -r tcp_diag

tcp_diagもinet_diagもロードされていないことがわかります。

[root@server ~]# lsmod |grep -E 'tcp_diag|inet_diag'
[root@server ~]#

6 insmod,rmmodコマンドによるモジュールのロード/アンロード方法

insmod,rmmodコマンドによるモジュールのロード/アンロードは、モジュールの依存関係を考慮して実行する必要があります。たとえば、tcp_diagモジュールをロードする場合、さきにinet_diagモジュールをinsmodコマンドでロードする必要があります。

初期状態を確認します。tcp_diagモジュールもinet_diagモジュールもロードされていないことがわかります

[root@server ~]# lsmod |grep -E 'tcp_diag|inet_diag'
[root@server ~]#

tcp_diagモジュールをロードしてみます。inet_diagモジュールがロードされいないので、エラーが発生します。

[root@server ~]# insmod /lib/modules/3.10.0-1160.el7.x86_64/kernel/net/ipv4/tcp_diag.ko.xz
insmod: ERROR: could not insert module /lib/modules/3.10.0-1160.el7.x86_64/kernel/net/ipv4/tcp_diag.ko.xz: Unknown symbol in module

inet_diagモジュールをロードします。inet_diagモジュールは、依存するモジュールがないので、エラーは発生しません。

[root@server ~]# insmod /lib/modules/3.10.0-1160.el7.x86_64/kernel/net/ipv4/inet_diag.ko.xz

モジュールを確認します。inet_diagモジュールがロードされたことがわかります。

[root@server ~]# lsmod |grep -E 'tcp_diag|inet_diag'
inet_diag              18949  0

tcp_diagモジュールをロードします。先にinet_diagモジュールがロードされているので、エラーは発生しません。

[root@server ~]# insmod /lib/modules/3.10.0-1160.el7.x86_64/kernel/net/ipv4/tcp_diag.ko.xz
[root@server ~]#

モジュールを確認します。tcp_diagモジュールがロードされたことがわかります。

[root@server ~]# lsmod |grep -E 'tcp_diag|inet_diag'
tcp_diag               12591  0
inet_diag              18949  1 tcp_diag

7 modinfoコマンドの使い方

modinfoコマンドを実行して、tcp_diagモジュールの情報を確認してみます。depends行にinet_diagと記載されていることがわかります。つまり、tcp_diagモジュールはinet_diagモジュールに依存していることがわかります。

[root@server ~]# modinfo tcp_diag
filename:       /lib/modules/3.10.0-1160.el7.x86_64/kernel/net/ipv4/tcp_diag.ko.xz
alias:          net-pf-16-proto-4-type-2-6
license:        GPL
retpoline:      Y
rhelversion:    7.9
srcversion:     CE94B895ACFDEA7DE6FB8E5
depends:        inet_diag
intree:         Y
vermagic:       3.10.0-1160.el7.x86_64 SMP mod_unload modversions
signer:         CentOS Linux kernel signing key
sig_key:        E1:FD:B0:E2:A7:E8:61:A1:D1:CA:80:A2:3D:CF:0D:BA:3A:A4:AD:F5
sig_hashalgo:   sha256

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ