- 1 はじめに
- 2 検証環境
- 3 コマンド一覧
- 4 モジュールの格納場所
- 5 modprobeコマンドによるモジュールのロード/アンロード方法
- 6 insmod,rmmodコマンドによるモジュールのロード/アンロード方法
- 7 modinfoコマンドの使い方
- Z 参考情報
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技術ブログ