目次
カーネル
カーネルはOSの中隔を構成するプログラムのことで、メモリに常駐し、ハードウェアの管理やプロセスのスケジューリングなどを行う。本来、Linuxとはカーネルのことを指す。
バージョンの確認
カーネルのバージョンを確認する。
unameコマンド
システムの詳細情報を確認できるコマンド。
uname [オプション]
オプション | 内容 |
-a, –all | すべての情報を表示する。 |
-s, –kernel-name | カーネル名を表示する。 |
-n, –nodename | ホスト名を表示する。 |
-r, –kernel-release | カーネルのリリース情報を表示する。 |
-v, –kernel-version | カーネルのバージョンを表示する。 |
-m, –machine | ハードウェアアーキテクチャを表示する。 |
-p, –processor | CPU情報を表示する。 |
-i, –hardware-platform | ハードウェアプラットフォームを表示する。 |
-o, –operating-system | オペレーションシステムを表示する。 |
システムのすべての情報を表示し、カーネルのバージョンを確認してみる。
$ uname -a
Linux Ubuntu 6.5.0-14-generic #14~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Nov 20 18:15:30 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
ファイルから確認
“/proc/version”でもカーネルのバージョンを確認できる。
$ cat /proc/version
Linux version 6.5.0-14-generic (buildd@lcy02-amd64-110) (x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0, GNU ld (GNU Binutils for Ubuntu) 2.38) #14~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Nov 20 18:15:30 UTC 2
Makefileから確認
ソースからコンパイルした場合は、Makefileからカーネルのバージョンを確認できる。
head [ソースパス]\Makefile
カーネルイメージ
カーネルイメージは、ファイルシステムに格納されているカーネルのイメージファイル。通常、”vmlinuz-バージョン”というファイル名で格納されている。
ls /boot/vmlinuz*
/boot/vmlinuz /boot/vmlinuz-5.19.0-50-generic /boot/vmlinuz-6.5.0-14-generic /boot/vmlinuz.old
カーネルモジュール
カーネルモジュールとは、デバイスドライバといったカーネルに機能を追加するようなソフトウェアのこと。ローダブルモジュールのサポートを有効にすると、カーネルの機能の一部をモジュール化し、カーネルから分離することができる。モジュール化することで、必要なときに必要なモジュールだけを読込んで使用でき、カーネルのサイズを小さくしたり、起動時間の短縮やメモリの節約が期待できる。
カーネルモジュールは、”/lib/modules/バージョン”以下のパスにあり、機能ごとにサブディレクトリに分けて配置されている。モジュールファイルは、“.ko”という拡張子で保存されている。
カーネルモジュールの確認
lsmodコマンド
ロードされているすべてのモジュールの一覧を表示するコマンド。モジュール名、モジュールのサイズ、参照された回数、モジュールが利用している他のモジュール名が表示される。
$ lsmod
Module Size Used by
vboxsf 45056 1
vboxguest 57344 7 vboxsf
binfmt_misc 24576 1
intel_rapl_msr 20480 0
nls_iso8859_1 12288 1
snd_intel8x0 53248 4
snd_ac97_codec 196608 1 snd_intel8x0
intel_rapl_common 36864 1 intel_rapl_msr
ac97_bus 12288 1 snd_ac97_codec
crct10dif_pclmul 12288 1
snd_pcm 196608 3 snd_intel8x0,snd_ac97_codec
・
・
・
modulesファイル
“/proc/modules”を参照することでモジュールの一覧を表示できる。
$ cat /proc/modules
serio_raw 20480 0 - Live 0x0000000000000000
binfmt_misc 24576 1 - Live 0x0000000000000000
sch_fq_codel 20480 2 - Live 0x0000000000000000
ip6t_REJECT 16384 1 - Live 0x0000000000000000
nf_reject_ipv6 20480 1 ip6t_REJECT, Live 0x0000000000000000
nf_log_ipv6 16384 5 - Live 0x0000000000000000
xt_hl 16384 22 - Live 0x0000000000000000
ip6t_rt 20480 3 - Live 0x0000000000000000
ipt_REJECT 16384 1 - Live 0x0000000000000000
nf_reject_ipv4 16384 1 ipt_REJECT, Live 0x0000000000000000
xt_comment 16384 4 - Live 0x0000000000000000
nf_log_ipv4 16384 5 - Live 0x0000000000000000
nf_log_common 16384 2 nf_log_ipv6,nf_log_ipv4, Live 0x0000000000000000
・
・
・
カーネルモジュールの詳細情報
modinfoコマンド
カーネルの詳細情報を表示するコマンド。ファイル名、作者、説明、ライセンスなど、モジュールの情報を表示する。
modinfo [オプション] [モジュール名]
オプション | 内容 |
-a | 作者を表示する。 |
-d | 説明を表示する。 |
-l | ライセンスを表示する。 |
-n | ファイル名を表示する。 |
オプションを省略するとすべての情報を表示する。ip_tablesモジュールの詳細を確認してみる。
$ modinfo ip_tables
filename: /lib/modules/6.5.0-14-generic/kernel/net/ipv4/netfilter/ip_tables.ko
description: IPv4 packet filter
author: Netfilter Core Team <coreteam@netfilter.org>
license: GPL
srcversion: 48318B01494EA0C1C2A27E9
depends: x_tables
retpoline: Y
intree: Y
name: ip_tables
vermagic: 6.5.0-14-generic SMP preempt mod_unload modversions
sig_id: PKCS#7
signer: Build time autogenerated kernel key
sig_key: xxxxx
sig_hashalgo: sha512
signature: xxxxx
カーネルモジュールのロード・アンロード
insmodコマンド
ローダブルモジュールをロードするコマンド。ローダブルモジュールとは、カーネルから独立しており、ロード/アンロードして利用するデバイスドライバのこと。カーネルに組み込まれないので、ビルトする必要がない。動作するのに他のモジュールが必要なモジュールの場合は、ロードする順番が重要になる。
insmod [モジュールのパス]
rmmodコマンド
モジュールをアンロードするコマンド。使用されているモジュール、または依存関係のあるモジュールはアンロードできない。
rmmod [オプション] [モジュール名]
オプション | 内容 |
-s, –syslog | 動作結果をsyslogへ出力する。 |
-v, –verbose | より多くのメッセージを有効にする。 |
modprobeコマンド
モジュールのロードとアンロードができるコマンド。依存関係を調査し、必要なモジュールも自動でロードし解決してくれる。
modprobe [オプション] [モジュール・パス等]
オプション | 内容 |
-a, –all | すべてのモジュールをロードする。 |
-r, –remove, –remove-dependencies | モジュールをアンロードし、依存するモジュールも使われていない場合はアンロードする。 |
-R, –resolve-alias | エイリアスの検索と表示する。 |
-i, –ignore-install, –ignore-remove | 指定モジュールの設定ファイルの”install”及び”remove”コマンドを無視する。 |
-D, –show-depends | 依存関係を表示する。 |
-c, –showconfig | 設定を表示する。 |
-n, –dry-run, –show | 実行せず表示する。 |
-C, –config=FILE | 設定ファイルを指定する。 |
-s, –syslog | 動作結果をsyslogへ出力する。 |
-v, –verbose | より多くのメッセージを有効にする。 |
オプションなしでモジュールをロードする。ip_tablesモジュールをロードしてみる。動作結果は特に表示されない。
$ modprobe ip_tables
モジュールの依存関係を確認してみる。
$ modprobe -D ip_tables
insmod /lib/modules/6.5.0-14-generic/kernel/net/netfilter/x_tables.ko
insmod /lib/modules/6.5.0-14-generic/kernel/net/ipv4/netfilter/ip_tables.ko
kmodというLinux のカーネルモジュールを管理するプログラムがある。kmodは、ローダブルモジュールの自動ロード・アンロードを行なうカーネルの機能で、カーネルモジュールが必要になると、modprobeコマンドで自動的に必要なモジュールをロードしてくれる。
カーネルモジュールの依存関係
modeprobeコマンドが参照するモジュールの依存関係は、”modules.dep”に記載されている。”modules.dep”は、”\lib\modules\カーネルのバージョン\”以下に保存されている。”modules.dep”がない場合は、depmodコマンドで作成することができる。
“modules.dep”の書式は、下記の通り。1行目は、モジュールXは、モジュールYとモジュールZと依存関係にあることを示している。2行目は、モジュールYはモジュールZと依存関係にあることを示している。3行目は、モジュールZと依存関係にあるモジュールはないことを示している。
X.ko: Y.ko Z.ko
Y.ko: Z.ko
Z.ko
カーネルモジュールの依存関係を確認してみる。
$ cat /lib/modules/カーネルのバージョン/modules.dep
kernel/lib/lz4/lz4hc_compress.ko:
kernel/lib/xz/xz_dec_test.ko:
kernel/lib/test_bpf.ko:
kernel/lib/test_blackhole_dev.ko:
kernel/lib/crc-itu-t.ko:
kernel/lib/crc4.ko:
kernel/lib/crc7.ko:
kernel/lib/libcrc32c.ko:
・
・
・
depmodコマンド
モジュールの依存関係に関する情報を更新する。更新内容は”modules.dep”に反映される(”modules.dep”がない場合は作成される)。
オプション | 内容 |
-a, –all | 現行のカーネルだけでなくシステム上にあるすべてのカーネルのモジュールの依存関係を更新 |
-A, –quick | 新しいモジュールがある場合のみ作業を行う |
-e, –errsyms | 提供されていないシンボルを出力する |
-n, –show | modules.depファイルでなく標準出力に出力する |
-C, –config=PATH | パスから設定を読み込む |
-v, –verbose | 詳細な情報を出力する。デバッグや詳細な出力が必要な場合に使用する。 |
-w, –warn | 重複を警告する |
-V, –version | バージョンを出力する |
-b, –basedir=DIR | 基準ディレクトリを指定する。モジュールを他のディレクトリにインストールして検証したい場合などに利用する。 |
-F, –filesyms=FILE | System.mapファイルのパスを指定する |
-E, –symvers=FILE | Module.symversファイルを使ってシンボルのバージョンをチェックする |
depmodの実行内容を標準出力してみる。
$ depmod -n
・
・
・
alias symbol:hci_reset_dev bluetooth
alias symbol:ip_set_get_byname ip_set
alias symbol:iwl_fw_runtime_init iwlwifi
alias symbol:mlx4_SYNC_TPT mlx4_core
alias symbol:mt7615_wait_for_mcu_init mt7615_common
alias symbol:tee_client_open_session tee
alias symbol:hci_cmd_sync_submit bluetooth
alias symbol:mlxsw_core_skb_transmit_busy mlxsw_core
alias symbol:nci_nfcee_discover nci
alias symbol:rtl8366_reset_vlan rtl8366
alias symbol:rtl92c_phy_lc_calibrate rtl8192c_common
alias symbol:rtllib_wx_set_freq rtllib
alias symbol:sa_set_userp zfs
alias symbol:si476x_core_cmd_fm_rsq_status si476x_core
alias symbol:unregister_snap_client psnap
# Device nodes to trigger on-demand module loading.
cuse cuse c10:203
autofs4 autofs c10:235
btrfs btrfs-control c10:234
nvram nvram c10:144
userio userio c10:240
uhid uhid c10:239
vfio vfio/vfio c10:196
hci_vhci vhci c10:137
vhost_net vhost-net c10:238
vhost_vsock vhost-vsock c10:241
snd_timer snd/timer c116:33
snd_seq snd/seq c116:1
zfs zfs c10:249
設定ファイル
設定ファイルに設定を記述することで、モジュールのロード時やアンロード時に前処理や後処理、ロード時のパラメータを指定することができる。設定ファイルのパスは、”/etc/modprobe.conf”、または”/etc/modprobe.d/”以下に”.conf”ファイルで保存されている。
設定ファイルの書式は下記の通り。
内容 | |
alias | エイリアスを指定し、モジュールに別名を付ける。 |
options | オプションを指定。カーネルに登録される際に毎回使用される。 |
install | 指定されたシェルコマンドを実行する。 |
remove | “modprobe -r”が実行されたときに指定されたシェルコマンドを実行する。 |
設定ファイルを見てみる。
$ cat /etc/modprobe.d/alsa-base.conf
# autoloader aliases
install sound-slot-0 /sbin/modprobe snd-card-0
install sound-slot-1 /sbin/modprobe snd-card-1
install sound-slot-2 /sbin/modprobe snd-card-2
install sound-slot-3 /sbin/modprobe snd-card-3
install sound-slot-4 /sbin/modprobe snd-card-4
install sound-slot-5 /sbin/modprobe snd-card-5
install sound-slot-6 /sbin/modprobe snd-card-6
install sound-slot-7 /sbin/modprobe snd-card-7
# Cause optional modules to be loaded above generic modules
install snd /sbin/modprobe --ignore-install snd $CMDLINE_OPTS && { /sbin/modprobe --quiet --use-blacklist snd-ioctl32 ; /sbin/modprobe --quiet --use-blacklist snd-seq ; }
#
# Workaround at bug #499695 (reverted in Ubuntu see LP #319505)
install snd-pcm /sbin/modprobe --ignore-install snd-pcm $CMDLINE_OPTS && { /sbin/modprobe --quiet --use-blacklist snd-pcm-oss ; : ; }
install snd-mixer /sbin/modprobe --ignore-install snd-mixer $CMDLINE_OPTS && { /sbin/modprobe --quiet --use-blacklist snd-mixer-oss ; : ; }
install snd-seq /sbin/modprobe --ignore-install snd-seq $CMDLINE_OPTS && { /sbin/modprobe --quiet --use-blacklist snd-seq-midi ; /sbin/modprobe --quiet --use-blacklist snd-seq-oss ; : ; }
#
install snd-rawmidi /sbin/modprobe --ignore-install snd-rawmidi $CMDLINE_OPTS && { /sbin/modprobe --quiet --use-blacklist snd-seq-midi ; : ; }
# Cause optional modules to be loaded above sound card driver modules
install snd-emu10k1 /sbin/modprobe --ignore-install snd-emu10k1 $CMDLINE_OPTS && { /sbin/modprobe --quiet --use-blacklist snd-emu10k1-synth ; }
install snd-via82xx /sbin/modprobe --ignore-install snd-via82xx $CMDLINE_OPTS && { /sbin/modprobe --quiet --use-blacklist snd-seq ; }
# Load saa7134-alsa instead of saa7134 (which gets dragged in by it anyway)
install saa7134 /sbin/modprobe --ignore-install saa7134 $CMDLINE_OPTS && { /sbin/modprobe --quiet --use-blacklist saa7134-alsa ; : ; }
# Prevent abnormal drivers from grabbing index 0
options bt87x index=-2
options cx88_alsa index=-2
options saa7134-alsa index=-2
options snd-atiixp-modem index=-2
options snd-intel8x0m index=-2
options snd-via82xx-modem index=-2
options snd-usb-audio index=-2
options snd-usb-caiaq index=-2
options snd-usb-ua101 index=-2
options snd-usb-us122l index=-2
options snd-usb-usx2y index=-2
# Ubuntu #62691, enable MPU for snd-cmipci
options snd-cmipci mpu_port=0x330 fm_port=0x388
# Keep snd-pcsp from being loaded as first soundcard
options snd-pcsp index=-2
# Keep snd-usb-audio from beeing loaded as first soundcard
options snd-usb-audio index=-2
記事を読んでいただきありがとうございました。