>開発>Linux>[Linux]カーネルの基本コマンド

カーネル

カーネルは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コマンドのオプション

システムのすべての情報を表示し、カーネルのバージョンを確認してみる。

$ 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ファイル名を表示する。
modinfoコマンドのオプション

オプションを省略するとすべての情報を表示する。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より多くのメッセージを有効にする。
rmmodコマンドにオプション

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より多くのメッセージを有効にする。
rmmodコマンドにオプション

オプションなしでモジュールをロードする。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

カーネルモジュールの依存関係

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=FILESystem.mapファイルのパスを指定する
-E, –symvers=FILEModule.symversファイルを使ってシンボルのバージョンをチェックする
depmodコマンドのオプション

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

ubuntu

記事を読んでいただきありがとうございました。

Page Top