- 技術 💻
カーネルとは|OSの中核の役割・仕組みをstraceと/procの実物で
結論
カーネルとは、OS(オペレーティングシステム)の中核にあるプログラムで、CPU・メモリ・ファイル・デバイス・ネットワークをまとめて管理し、アプリからの要求を「システムコール」という窓口で受け付けます。アプリは自分でハードウェアに触れず、すべてカーネルに頼みます。
この記事でわかること
- カーネルの5つの役割を、ps・free・mount・/sys/module・ip の1コマンドずつで実演した出力
- strace で見た cat の中身(openat→read→write→close)と、システムコール1回の実測コスト
- uname -r・/proc・/sys での確認方法、カーネルパニック、LTS(kernel.org)、WSL2 のカーネル
アプリ(ブラウザ・エディタ・Python のスクリプト)は、ファイルを読むときもネットワークに送るときも、自分では何もせず、カーネルに「読んで」「送って」と頼みます。カーネルだけがハードウェアに触れられる、という分け方が OS の土台です。
flowchart TD
subgraph U[ユーザー空間]
A[アプリ<br>cat・Python・ブラウザ]
L[ライブラリ glibc]
end
subgraph K[カーネル空間]
S[システムコールの窓口<br>openat・read・write]
C[プロセス・メモリ・ファイル<br>デバイス・ネットワークの管理]
end
H[ハードウェア<br>CPU・メモリ・ディスク・NIC]
A --> L --> S --> C --> H
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| カーネルとは | OS の中核。ハードウェアを管理し、アプリの要求を受け付けるプログラム | カーネルとは |
| カーネルの役割 | プロセス・メモリ・ファイル・デバイス・ネットワークの管理と、システムコールの受付 | カーネルの5つの役割 |
| カーネルと OS の違い | OS=カーネル+シェル・ライブラリ・コマンド・画面。カーネルはその芯 | カーネルとは |
| Linux カーネルとは | Linus Torvalds が始めたカーネル。Ubuntu などは「カーネル+周り」の配布物 | Linux カーネルの更新と LTS |
| カーネルのバージョン確認 | uname -r・cat /proc/version・cat /proc/sys/kernel/osrelease |
カーネルの確認方法 |
| システムコールとは | アプリがカーネルに仕事を頼む窓口。strace で1行ずつ見える | システムコール |
| カーネルパニックとは | カーネル自身が続行できないと判断して止まること。sysctl の panic で再起動までの秒数が決まる | カーネルパニックとは |
| WSL2 のカーネル | Microsoft がビルドした本物の Linux カーネルが軽量 VM の中で動く(公式) | WSL2・仮想マシン・コンテナ |
確認環境:Linux カーネル 6.18.44(uname -r は 6.18.44-fc-v185、x86_64・2 CPU・メモリ 8GB)の上で動く Ubuntu 24.04.5 LTS のコンテナ的な作業環境です。/proc/cmdline に --firecracker-init・nomodule・panic=1 があり、仮想マシン(ハイパーバイザー上の microVM)で、ローダブルモジュールを持たないカーネルです。そのため /proc/modules と /lib/modules が無く、lsmod も入っていません。ディスクとネットワークは virtio(virtio_blk・virtio_net)で、一般的な PC のような SATA・NVMe・Wi-Fi のドライバーは見えません。この違いは、該当する節にそのまま書いています。観察は読み取りだけ(uname・/proc・/sys の閲覧・strace 6.8・ps/free(procps-ng 4.0.4)・mount(util-linux 2.39.3)・ip(iproute2 6.1.0)・dmesg)で、カーネルの設定・モジュール・sysctl は変えていません。システムコールの実測は Python 3.13.18 で行いました。カーネルの版と LTS は kernel.org、WSL2 は Microsoft Learn、Windows のユーザーモード/カーネルモードは Microsoft Learn、XNU は Apple の Kernel Programming Guide、sysctl の意味は kernel.org の admin-guide で確かめました。図は mermaid 11.16.0 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「カーネルとは|OSの中核の役割・仕組みをstraceと/procの実物で」
カーネルとは(OSの中核を一言で)
この節では、カーネルという言葉の意味と、OS・シェル・ディストリビューションとの関係が分かります。
カーネル(kernel)は、OS の中でハードウェアに直接触れる唯一の部分です。 名前は「果実の核・種」から来ていて、OS の芯という意味で使われます。電源を入れると、ブートローダーがカーネルをメモリに読み込み、カーネルが CPU・メモリ・ディスク・ネットワークカードを初期化し、最初のプロセス(init・systemd など)を起動します。それ以降、画面に見えるものはすべて、カーネルの上で動くプロセスです。
「OS」と「カーネル」は、日常の会話では同じように使われますが、正確には次の関係です。
| 言葉 | 指すもの | この環境での実物 |
|---|---|---|
| カーネル | ハードウェアを管理し、システムコールを受け付ける1つのプログラム | Linux 6.18.44-fc-v185(uname -r) |
| OS(広い意味) | カーネル+シェル・ライブラリ・基本コマンド・画面・パッケージ管理 | Ubuntu 24.04.5 LTS(/etc/os-release) |
| ディストリビューション | Linux カーネルと周りのソフトをまとめて配る配布物 | Ubuntu・Debian・RHEL・Alpine など |
| シェル | コマンドを受け取ってプロセスを起動するアプリ。カーネルではない | bash 5.2(ユーザー空間で動く) |
| ドライバー | 個々のハードウェアを動かすカーネルの部品 | virtio_net・virtio_blk(/sys/module) |
Red Hat の解説は、カーネルを「コンピュータのハードウェアとプロセスの間のコアインタフェース」と定義し、「責任ある重役(ハードウェア)の多忙な個人秘書」にたとえています。要求を取り次ぎ、誰が何をいつ使うかを覚えておき、順番を決める役です。
「Linux」が指すもの
「Linux のバージョン」と聞かれたら、カーネルの版(uname -r)か配布物の版(os-release)かを確かめる
カーネルの5つの役割(1コマンドずつ実演)
この節では、カーネルが担う5つの管理を、それぞれ1つのコマンドの出力で確かめられます。
カーネルの仕事は、プロセス・メモリ・ファイル・デバイス・ネットワークの5つの管理と、それらをアプリに貸し出す窓口(システムコール)です。 ここで使うコマンドは、どれもカーネルが持っている情報を読んで表示しているだけです。
プロセス管理
ps -eo pid,ppid,stat,pri,ni,comm。どのプロセスを、どの CPU で、どれだけの時間動かすかを決める(スケジューリング)。
PID 2 の kthreadd 以下はカーネル自身のスレッド
メモリ管理
free -m・/proc/meminfo。物理メモリを各プロセスの仮想アドレスに割り当て、キャッシュやスワップを調整する。
buff/cache もカーネルが持つ
ファイルシステム
mount・/proc/filesystems。ディスクの中身を「ファイルとディレクトリ」に見せ、ext4・tmpfs・proc などを同じ API で扱う。
/proc も「ファイルシステム」
デバイス管理
ls /sys/module・/proc/devices・/proc/interrupts。ドライバーでハードウェアを動かし、割り込みを受ける。
この環境では lsmod が無い(後述)
ネットワーク
ip -br a・ip r。TCP/IP のプロトコルスタックはカーネルの中。ソケットを開く・送る・受けるを担う。
iptables・nftables もカーネルの機能
1. プロセス管理:ps
$ ps -eo pid,ppid,stat,pri,ni,rss,comm --sort=pid | head -8
PID PPID STAT PRI NI RSS COMMAND
1 0 SLl 19 0 6324 process_api
2 0 S 19 0 0 kthreadd
3 2 S 19 0 0 pool_workqueue_release
4 2 I< 39 -20 0 kworker/R-rcu_gp
5 2 I< 39 -20 0 kworker/R-sync_wq
6 2 I< 39 -20 0 kworker/R-kvfree_rcu_reclaim
7 2 I< 39 -20 0 kworker/R-slub_flushwq
$ ps -e --no-headers | wc -l
73
PID 1 は最初のユーザープロセス(一般的な Linux では systemd。この環境では process_api という独自の init)です。PID 2 の kthreadd とその子(kworker/…)は、カーネルが自分の仕事のために動かしているスレッドで、RSS(使っているユーザー空間のメモリ)が 0 です。 STAT の S は待機中、I はアイドルのカーネルスレッド、PRI と NI は優先度で、カーネルのスケジューラーがこれを見て CPU を割り当てます。プロセスの見方と止め方は、関連記事「Linuxプロセス確認と停止|ps・top・kill逆引きコマンド一覧」で扱っています。
2. メモリ管理:free と /proc/meminfo
$ free -m
total used free shared buff/cache available
Mem: 8027 1083 6567 15 726 6944
Swap: 0 0 0
$ grep -E 'MemTotal|MemAvailable|^Cached|SwapTotal|Dirty' /proc/meminfo
MemTotal: 8220248 kB
MemAvailable: 7110944 kB
Cached: 677736 kB
SwapTotal: 0 kB
Dirty: 1884 kB
free は /proc/meminfo を読んで表にしているだけです。buff/cache の 726MB は、カーネルが「一度読んだファイルの中身」を空いたメモリに置いているもので、アプリがメモリを欲しがれば手放します。 Dirty はディスクに書き戻していない変更分で、これもカーネルがタイミングを決めて書きます。free の各欄の読み方は、関連記事「Linuxメモリ・ディスク確認|free・df・du・vmstat・iostat見方」で扱っています。
3. ファイルシステム:mount
$ mount | head -6
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=4098912k,nr_inodes=1024728,mode=755)
tmpfs on /dev/shm type tmpfs (rw,relatime,size=8220248k)
devpts on /dev/pts type devpts (rw,relatime,mode=600,ptmxmode=000)
/dev/vda on / type ext4 (rw,relatime,discard,no_prefetch_block_bitmaps,resv_strict,resuid=65534,resgid=65534)
$ mount | wc -l
28
$ grep -c . /proc/filesystems
32
ルート / は /dev/vda(virtio のディスク)の ext4 で、/proc・/sys・/dev/shm はディスクを持たない「カーネルの中の情報を見せる」ファイルシステムです。アプリは、ext4 でも tmpfs でも proc でも、同じ open・read で読めます。 違いを吸収しているのがカーネルの VFS(仮想ファイルシステム)の層です。/proc/filesystems には、このカーネルが扱える32種類(ext4・xfs・squashfs・overlay・fuse など)が並んでいました。
4. デバイス管理:/sys/module・/proc/devices・/proc/interrupts
$ readlink /sys/class/net/eth0/device/driver
../../../../bus/virtio/drivers/virtio_net
$ readlink /sys/block/vda/device/driver
../../../../bus/virtio/drivers/virtio_blk
$ ls /sys/bus/virtio/drivers
nvproxy virtio_balloon virtio_blk virtio_console virtio_mem virtio_net virtio_pmem virtio_rng virtio_rproc_serial vmw_vsock_virtio_transport
$ head -4 /proc/interrupts
CPU0 CPU1
24: 1 0 IO-APIC 5-edge ACPI:Ged
25: 0 1 IO-APIC 6-edge ACPI:Ged
26: 4 0 IO-APIC 4-edge ttyS0
$ grep virtio1-req /proc/interrupts
37: 0 604452 PCI-MSIX-0000:00:02.0 1-edge virtio1-req.0
ネットワークカード eth0 は virtio_net、ディスク vda は virtio_blk というドライバーが動かしています。/proc/interrupts は「ハードウェアがカーネルを呼んだ回数」で、ディスクの要求(virtio1-req.0)が 604,452 回、CPU1 に届いていました。 割り込みを受け取り、ドライバーを呼び、待っていたプロセスを起こすのもカーネルの仕事です。一般的な PC では、ここに nvme・ahci・iwlwifi・i915 のような名前が並びます。
5. ネットワーク:ip
$ ip -br a
lo UNKNOWN 127.0.0.1/8
ifb0 DOWN
ifb1 DOWN
eth0 UP 192.0.2.2/24
$ ip r
default via 192.0.2.1 dev eth0
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.2
$ cat /proc/sys/net/ipv4/ip_forward
0
IP アドレス・経路表・転送の可否は、すべてカーネルが持っている状態です。proto kernel の行は、アドレスを付けたときにカーネルが自動で作った経路です。TCP の再送・輻輳制御(この環境は tcp_cubic)・ポートの管理もカーネルの中にあり、アプリは socket・connect・send を頼むだけです。 ip・ss の使い方は、関連記事「Linuxネットワークコマンド一覧|ip/ss/ncで障害切り分け」で扱っています。
ユーザー空間とカーネル空間(ユーザーモード・カーネルモード)
この節では、「アプリはハードウェアに触れない」という決まりが、どの仕組みで守られているかが分かります。
CPU には「特権モード(カーネルモード)」と「非特権モード(ユーザーモード)」があり、カーネルだけが特権モードで動きます。 アプリはユーザーモードで動くため、ハードウェアのレジスタに触ったり、他のプロセスのメモリを読んだりする命令を実行すると、CPU がそれを止めてカーネルに知らせます。この分け方があるので、アプリ1つが落ちても OS 全体は落ちません。
ユーザー空間(アプリ)
プロセスごとに分かれた仮想アドレス空間
ハードウェアに直接触れない。頼むだけ
落ちてもそのプロセスだけが終わる
cat・bash・Python・nginx・ブラウザ
カーネル空間
1つの空間を全部のカーネルコードが共有
CPU の特権モードで、何でもできる
落ちると OS 全体が止まる(カーネルパニック)
スケジューラー・VFS・ドライバー・TCP/IP
Microsoft Learn は Windows について同じ構造を説明しています。ユーザーモードのプロセスは「プライベート仮想アドレス空間」を持ち「アプリケーションがクラッシュしても、他のアプリケーションやオペレーティング システムには影響しません」。一方「カーネル モードで実行されるすべてのコードは、1 つの仮想アドレス空間を共有」し「カーネル モード ドライバーがクラッシュすると、オペレーティング システム全体がクラッシュします」。Linux も Windows も、この点は同じです。
プロセスの仮想アドレス空間は /proc/<pid>/maps で見えます。bash 自身の例です。
$ head -5 /proc/$$/maps
55becb4e4000-55becb514000 r--p 00000000 fe:00 322639 /usr/bin/bash
55becb514000-55becb603000 r-xp 00030000 fe:00 322639 /usr/bin/bash
55becb603000-55becb638000 r--p 0011f000 fe:00 322639 /usr/bin/bash
55becb638000-55becb63c000 r--p 00154000 fe:00 322639 /usr/bin/bash
55becb63c000-55becb645000 rw-p 00158000 fe:00 322639 /usr/bin/bash
$ grep -E 'VmSize|VmRSS|Threads|Cpus_allowed_list' /proc/$$/status
VmSize: 4628 kB
VmRSS: 3540 kB
Threads: 1
Cpus_allowed_list: 0-1
r-xp は「読める・実行できる・書けない」という、カーネルが付けたメモリの保護です。この領域に書き込もうとすると、カーネルが SIGSEGV(Segmentation fault)を送ってプロセスを止めます。
システムコールとは(straceでcatのopen→read→writeを見る)
この節では、アプリがカーネルに仕事を頼む「システムコール」が、実際にどう並んでいるかが strace の出力で分かります。
システムコール(syscall)は、ユーザー空間からカーネルに仕事を頼む唯一の正規の窓口です。 ファイルを開くのは openat、読むのは read、書くのは write、プロセスを作るのは clone、終わるのは exit_group という具合に、1つ1つに名前と番号があります。strace は、プロセスが呼んだシステムコールを1行ずつ記録する道具です。13バイトのファイルを cat で表示したときの、後半の部分です。
$ printf 'hello kernel\n' > hello.txt
$ strace -e trace=openat,read,write,close cat hello.txt
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
close(3) = 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\220\243\2\0\0\0\0\0"..., 832) = 832
close(3) = 0
openat(AT_FDCWD, "hello.txt", O_RDONLY) = 3
read(3, "hello kernel\n", 131072) = 13
write(1, "hello kernel\n", 13) = 13
read(3, "", 131072) = 0
close(3) = 0
close(1) = 0
close(2) = 0
+++ exited with 0 +++
openat で開く → ファイル記述子 3 が返る
cat は「hello.txt を読み取り専用で開いて」と頼み、カーネルが番号 3 を渡す。0・1・2 は標準入力・出力・エラーで最初から使われている。
read で読む → 13 バイト
「3 番から最大 131072 バイト読んで」と頼み、カーネルがディスク(またはページキャッシュ)から 13 バイトをアプリのメモリに写す。
write で書く → 13 バイト
「1 番(標準出力)に 13 バイト書いて」と頼む。出力先が端末でもファイルでもパイプでも、アプリ側の呼び方は同じ。
read が 0 を返す → 終わり → close
もう読めないと分かったら閉じる。最後の exit_group でプロセスが終わり、カーネルがメモリと記述子を回収する。
この cat は、全部で 43 回のシステムコールを呼んでいました(strace -c の集計)。本来の仕事は openat・read・write・close だけで、残りはプログラムの起動(libc の読み込み・メモリの確保・乱数の取得)です。
$ strace -c cat hello.txt > /dev/null
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 8 mmap
0.00 0.000000 0 5 close
0.00 0.000000 0 4 fstat
0.00 0.000000 0 4 brk
0.00 0.000000 0 3 read
0.00 0.000000 0 3 openat
0.00 0.000000 0 3 mprotect
0.00 0.000000 0 1 write
0.00 0.000000 0 1 1 access
0.00 0.000000 0 1 execve
…
100.00 0.000000 0 43 1 total
失敗もシステムコールの戻り値で分かる
無いファイルを cat すると、カーネルが openat の戻り値で ENOENT を返し、cat がそれを「No such file or directory」と表示します。エラーメッセージの文言は、カーネルが返した番号(errno)をアプリが文字に直したものです。
$ strace -e trace=openat cat nonexist.txt
openat(AT_FDCWD, "nonexist.txt", O_RDONLY) = -1 ENOENT (No such file or directory)
cat: nonexist.txt: No such file or directory
+++ exited with 1 +++
プロセスを作るのも、Python が書くのもカーネル
bash が ls を動かすときは clone(複製)→ execve(別のプログラムに差し替え)→ wait4(終わるのを待つ)の順で、Python の open().write() も最後は同じ openat・write です。
$ strace -f -e trace=clone,execve,wait4 bash -c 'ls / >/dev/null'
23439 execve("/usr/bin/bash", ["bash", "-c", "ls / >/dev/null"], …) = 0
23439 clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, …) = 23440
23439 wait4(-1, <unfinished ...>
23440 execve("/usr/bin/ls", ["ls", "/"], …) = 0
23440 +++ exited with 0 +++
23439 <... wait4 resumed>[{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 23440
23439 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23440, …} ---
$ strace -e trace=openat,write,close python3 -c "f=open('out.txt','w'); f.write('カーネル経由で書く\n'); f.close()" 2>&1 | grep -A2 out.txt
openat(AT_FDCWD, "out.txt", O_WRONLY|O_CREAT|O_TRUNC|O_CLOEXEC, 0666) = 3
write(3, "\343\202\253\343\203\274\343\203\215\343\203\253\347\265\214\347\224\261\343\201\247\346\233\270\343\201\217\n", 28) = 28
close(3) = 0
日本語9文字+改行が 28 バイトで書かれています。どの言語で書いても、ファイルに触る瞬間は必ずカーネルのシステムコールを通ります。
システムコール1回のコストを実測した
ユーザーモードからカーネルモードへの切り替えには時間がかかります。Python で「何もしない関数」と「os.getpid()(カーネルに自分の PID を聞く)」を 100万回ずつ呼んで比べました。
この環境(仮想マシン・Intel Xeon 2.10GHz)では、最も軽いシステムコールでも Python の関数呼び出しの約4.5倍かかりました。「ファイルを1バイトずつ write すると遅い」「ループの中で os.stat を呼ぶと遅い」のは、この切り替えの回数が増えるためです。 ライブラリがバッファリング(まとめて1回の write)をするのは、カーネルへの往復を減らすためです。
カーネルの確認方法(uname -r・/proc/version・/proc/sys/kernel)
この節では、今動いているカーネルの版・種類・ビルド情報を確かめるコマンドと、出力の読み方が分かります。
カーネルの版は uname -r で分かります。 同じ情報が /proc/version・/proc/sys/kernel/osrelease・dmesg の先頭にもあります。
$ uname -r
6.18.44-fc-v185
$ uname -a
Linux vm 6.18.44-fc-v185 #1 SMP PREEMPT_DYNAMIC @0 x86_64 x86_64 x86_64 GNU/Linux
$ cat /proc/version
Linux version 6.18.44-fc-v185 (builder@sandboxing) (gcc (GCC) 15.3.0, GNU ld (GNU Binutils) 2.46) #1 SMP PREEMPT_DYNAMIC @0
$ cat /proc/sys/kernel/ostype /proc/sys/kernel/osrelease /proc/sys/kernel/version
Linux
6.18.44-fc-v185
#1 SMP PREEMPT_DYNAMIC @0
$ sysctl kernel.osrelease
kernel.osrelease = 6.18.44-fc-v185
$ cat /etc/os-release | head -2
PRETTY_NAME="Ubuntu 24.04.5 LTS"
NAME="Ubuntu"
| 出力の部分 | 意味 | この環境の値 |
|---|---|---|
6.18.44 |
メジャー.マイナー.パッチ。6.18 系の 44 番目の修正版 | 6.18 は longterm(kernel.org) |
-fc-v185 |
ビルドした人が付ける識別子(配布物名・独自ビルド名など) | この環境のビルド名。Ubuntu の標準カーネルなら -generic |
#1 SMP PREEMPT_DYNAMIC |
ビルド回数と設定。SMP は複数 CPU 対応、PREEMPT_DYNAMIC は起動時にプリエンプションの方式を選べる | kernel.org の文書どおり、変えるにはビルドし直す |
x86_64 |
CPU のアーキテクチャ(uname -m) |
ARM の Mac や Raspberry Pi なら aarch64 |
gcc (GCC) 15.3.0 |
カーネルをコンパイルしたコンパイラー | /proc/version にだけ出る |
uname -r(カーネル)と /etc/os-release(配布物)は別物で、Ubuntu 24.04 の上で 6.18 のカーネルが動く、という組み合わせがあり得ます。この使い分けは、関連記事「LinuxのOS・バージョン確認コマンド|os-releaseとunameの違い」で扱っています。
起動時のパラメーターとログ
$ cat /proc/cmdline
mitigations=auto,no_guest_host,no_guest_guest deferred_init=lazy dhash_entries=131072 ihash_entries=65536 console=ttyS0 reboot=k panic=1 nomodule random.trust_cpu=1 ipv6.disable=1 swiotlb=noforce psi=1 rdinit=/process_api -- --firecracker-init …
$ dmesg | head -2
[ 0.000000] Linux version 6.18.44-fc-v185 (builder@sandboxing) (gcc (GCC) 15.3.0, GNU ld (GNU Binutils) 2.46) #1 SMP PREEMPT_DYNAMIC @0
[ 0.000000] Command line: deferred_init=lazy … console=ttyS0 reboot=k panic=1 nomodule random.trust_cpu=1 ipv6.disable=1 …
$ dmesg | grep -m3 virtio-pci
[ 1.059440] virtio-pci 0000:00:01.0: enabling device (0000 -> 0002)
[ 1.064194] virtio-pci 0000:00:02.0: enabling device (0000 -> 0002)
[ 1.068884] virtio-pci 0000:00:03.0: enabling device (0000 -> 0002)
/proc/cmdline は、ブートローダーがカーネルに渡した起動時の指定です。この環境では nomodule(モジュールを読み込まない)・panic=1(パニックしたら1秒で再起動)・ipv6.disable=1・--firecracker-init が並んでいて、「仮想マシンの中の、最小構成のカーネル」であることがここから読み取れます。 dmesg はカーネルのログで、起動直後にどのデバイスを見つけたかが時刻付きで残っています。
/procと/sysの読み方(カーネルの中を見る仮想ファイル)
この節では、/proc と /sys が何なのか、なぜサイズが 0 なのか、どこを見ると何が分かるかが分かります。
/proc と /sys はディスク上に実体が無く、読んだ瞬間にカーネルが中身を作って返す仮想のファイルです。 ls -l でサイズが 0 なのはそのためで、cat すると中身が出ます。
$ ls -l /proc/version /proc/meminfo /sys/class/net/eth0/mtu
-r--r--r-- 1 root root 0 Oct 29 21:43 /proc/meminfo
-r--r--r-- 1 root root 0 Oct 29 21:43 /proc/version
-rw-r--r-- 1 root root 4096 Oct 29 22:34 /sys/class/net/eth0/mtu
$ cat /sys/class/net/eth0/mtu /sys/class/net/eth0/address /sys/class/net/eth0/operstate
1400
02:fc:00:00:00:01
up
$ ls /proc/self | tr '\n' ' '
arch_status attr autogroup auxv cgroup clear_refs cmdline comm coredump_filter cpuset cwd environ exe fd fdinfo gid_map io … maps mem mountinfo mounts net ns oom_score root sched stat statm status syscall task …
$ cat /proc/self/cmdline | tr '\0' ' '
cat /proc/self/cmdline
$ ls -l /proc/self/fd/
lr-x------ 1 root root 64 Oct 29 22:36 0 -> /dev/null
l-wx------ 1 root root 64 Oct 29 22:36 1 -> /path/to/output
l-wx------ 1 root root 64 Oct 29 22:36 2 -> /path/to/output
lr-x------ 1 root root 64 Oct 29 22:36 3 -> /proc/25629/fd
| 場所 | 何が分かるか | よく見るファイル |
|---|---|---|
/proc/<pid>/ |
プロセス1つの状態(self は自分自身) |
status・maps・fd/・cmdline・environ・cwd |
/proc/(直下) |
システム全体の状態 | version・cpuinfo・meminfo・interrupts・filesystems・devices・cmdline |
/proc/sys/ |
カーネルの調整値(sysctl)。読むのも書くのもここ | kernel/panic・vm/swappiness・net/ipv4/ip_forward・fs/file-max |
/sys/ |
デバイス・ドライバー・バスの階層(sysfs) | class/net/・block/・bus/virtio/・module/ |
/sys/kernel/ |
カーネル自身の機能の設定 | mm/transparent_hugepage/enabled・tracing/ |
$ cat /proc/sys/kernel/panic /proc/sys/kernel/panic_on_oops /proc/sys/vm/swappiness /proc/sys/fs/file-max /proc/sys/kernel/pid_max
1
0
60
819169
32768
$ cat /sys/kernel/mm/transparent_hugepage/enabled
always [madvise] never
$ cat /proc/self/cgroup | tail -2
1:cpu:/
0::/
/proc/sys/kernel/panic の 1 は、起動パラメーターの panic=1 がそのまま反映された値です。sysctl -a で表示される項目は、すべて /proc/sys/ 以下のファイルです。この記事では読んでいるだけですが、/proc/sys と /sys の多くは root が書き込むと、再起動なしでカーネルの動きが変わります(ip_forward を 1 にするとルーターになる、など)。
カーネルモジュールとドライバー(lsmod・/sys/module)
この節では、カーネルの機能を後から足す「モジュール」の仕組みと、この環境で lsmod が無い理由が分かります。
Linux のドライバーやファイルシステムの多くは、カーネル本体に組み込む(built-in)か、必要なときに読み込むモジュール(.ko ファイル)にするかを、ビルド時に選べます。 一般的なディストリビューションのカーネルは大半をモジュールにしていて、lsmod(/proc/modules の整形)で読み込み済みの一覧が見え、modprobe で足したり外したりできます。
$ lsmod
/bin/bash: line 1: lsmod: command not found
$ cat /proc/modules
cat: /proc/modules: No such file or directory
$ ls /lib/modules
ls: cannot access '/lib/modules': No such file or directory
$ grep -o nomodule /proc/cmdline
nomodule
$ ls /sys/module | wc -l
75
$ ls /sys/module | tr '\n' ' '
8250 acpi amd_uncore blk_cgroup block bridge clocksource cpufreq cpuidle cpuidle_haltpoll cryptomgr dns_resolver eeprom_93cx6 erofs firmware_class fscrypto fuse haltpoll hid intel_idle ip_set ipv6 jbd2 kernel keyboard kvm kvm_pvm libnvdimm loop memory_hotplug nf_conntrack … overlay page_alloc page_reporting pcie_aspm pnp printk processor pstore random rcupdate rcutree rng_core sch_htb secretmem slab_common spurious srcutree tcp_cubic virtio_blk virtio_mem virtio_net virtio_pci virtio_pci_modern_dev vmw_vsock_virtio_transport vsock vt vxlan watchdog workqueue x86_pkg_temp_thermal xt_recent xz_dec zswap
$ cat /sys/module/kernel/parameters/panic /sys/module/loop/parameters/max_loop
1
8
1この環境はモジュール無し
起動パラメーターに nomodule があり、/proc/modules・/lib/modules が無い。必要なドライバーは全部カーネル本体に組み込まれている。仮想マシン向けの最小構成ではよくある作り。
2それでも /sys/module には出る
組み込みでもパラメーターを持つ部品は /sys/module/<名前>/parameters/ に出る。virtio_net・tcp_cubic・overlay が組み込まれていることがここで分かる。
3一般的な PC では
Ubuntu の -generic カーネルなら lsmod に nvme・i915・iwlwifi・snd_hda_intel などが並び、/lib/modules/$(uname -r)/ に数千個の .ko がある。
モジュールはカーネル空間で動くため、カーネル本体と同じ権限を持ちます。ドライバーの不具合でシステム全体が止まるのは、この構造のためです。
モノリシックカーネルとマイクロカーネルの違い
この節では、カーネルの設計の2つの方針と、Linux がどちらで、何を取り入れているかが分かります。
モノリシックカーネルは、ファイルシステム・ドライバー・ネットワークをすべてカーネル空間の1つのプログラムに入れる設計、マイクロカーネルは、カーネルにはスケジューリング・メモリ・プロセス間通信だけを残し、それ以外をユーザー空間のサーバーとして動かす設計です。 Linux はモノリシックで、そこにモジュールの仕組みを足して「必要な部品だけ後から入れる」柔軟さを持たせています。
| モノリシック | マイクロカーネル | ハイブリッド | |
|---|---|---|---|
| カーネル空間にあるもの | すべて(ドライバー・FS・ネットワーク) | 最小限(スケジューラー・メモリ・IPC) | 多くをカーネル空間に置きつつ、構造はマイクロカーネル由来 |
| 部品同士のやり取り | 関数呼び出し(速い) | メッセージ(プロセス間通信。往復が増える) | 主に関数呼び出し |
| 部品が落ちたとき | カーネルごと止まる | そのサーバーだけ再起動できる設計にしやすい | カーネル空間の部品なら全体が止まる |
| 代表 | Linux・FreeBSD | MINIX 3・seL4・QNX | Windows NT・XNU(macOS) |
「速さを取るか、分離を取るか」の選択です。Linux は速さを取り、ドライバーをモジュール化して開発のしやすさを補っています。Apple の文書は、XNU を Mach(マイクロカーネル)・BSD・I/O Kit の組み合わせと説明していて、分類としてはハイブリッドに当たります。
Linux・Windows NT・XNU(macOS)のカーネル比較
この節では、主要な OS のカーネルの名前・設計・確認方法が一覧で分かります。
| Linux | Windows NT カーネル | XNU(macOS・iOS) | |
|---|---|---|---|
| 設計 | モノリシック+モジュール | ハイブリッド(Executive・HAL・カーネルモードドライバー) | ハイブリッド(Mach+BSD+I/O Kit) |
| ソース | 公開(GPLv2) | 非公開 | 公開(APSL。Darwin として) |
| ドライバーの形 | built-in またはモジュール(.ko) | カーネルモードドライバー(.sys)。ユーザーモードのドライバーもある | I/O Kit(C++ のサブセット)。近年は DriverKit でユーザー空間へ |
| 版の確認 | uname -r |
winver・ver |
uname -r(Darwin の版が出る) |
| クラッシュの呼び名 | カーネルパニック(oops を経ることも) | ブルースクリーン(バグチェック) | カーネルパニック |
Microsoft Learn は、Windows のアプリがユーザーモード、「コア オペレーティング システム コンポーネントはカーネル モードで機能」し、「多くのドライバーはカーネル モードで動作しますが、ユーザー モードで機能するドライバーもあります」と説明しています。Apple の Kernel Programming Guide は「OS X のカーネル環境は Mach カーネル、BSD、I/O Kit、ファイルシステム、ネットワークのコンポーネントを含み、これらをまとめてカーネルと呼ぶことが多い」と書いています。
カーネルパニックとは(oopsとの違い・panic=1の意味)
この節では、「カーネルパニック」という言葉の意味と、それが起きたときに何が決まっているかが分かります。
カーネルパニックは、カーネル自身が「これ以上安全に続けられない」と判断して停止することです。 アプリが落ちるのとは違い、カーネルが止まるとすべてのプロセスが止まり、画面にはログが残るか、設定によっては自動で再起動します。原因は、ドライバーの不具合、ハードウェアの故障(メモリ・ディスク)、ルートファイルシステムが見つからない(VFS: Unable to mount root fs)、カーネルの更新の失敗、などです。
oops と panic
panic_on_oops=1 なら oops の時点で panic に切り替えるこの環境は panic_on_oops=0・panic=1(パニックしたら1秒後に再起動)
kernel.org の admin-guide は /proc/sys/kernel/panic について「0 なら無限に待ち続ける、負なら即座に再起動、正ならその秒数の後に再起動」と説明しています。サーバーや仮想マシンで panic=1 や panic=10 を指定するのは、人が画面を見に行けないので自動で立ち上がらせるためです。デスクトップでは 0 のまま、画面に残ったメッセージ(Kernel panic - not syncing: …)を読んで原因を探します。
- 1直前に変えたものを戻すカーネルの更新・ドライバーの追加・ハードウェアの増設の直後なら、ブートメニューで前の版のカーネルを選んで起動する
- 2メッセージの1行目を記録する
Kernel panic - not syncing:の後ろに理由がある。写真でもよい - 3再起動後に dmesg・journalctl -k -b -1 を見る前回起動時のカーネルログが残っていれば、oops のスタックトレースが読める
- 4繰り返すならハードウェアを疑うメモリテスト・ディスクの SMART。仮想マシンならホスト側のログ
Linuxカーネルの更新とLTS(kernel.orgの版の読み方)
この節では、Linux カーネルの版がどう付き、どれがどのくらい保守されるかが、kernel.org の公開情報で分かります。
Linux カーネルは、Linus Torvalds が管理する mainline が約9〜10週ごとに新しい版を出し、その後は stable・longterm として修正だけが続きます。 kernel.org の 2026年10月29日時点の表です。
| 種別 | 版(2026年10月29日時点) | 意味 |
|---|---|---|
| mainline | 7.3(2026-10-18) | 新機能が入る本流。Linus Torvalds がリリース |
| stable | 7.2.13(2026-10-26) | mainline の後にバグ修正を取り込んだ版。おおむね週1回 |
| longterm | 6.18.59・6.12.114・6.6.160・6.1.190・5.15.223・5.10.272 | 重要な修正だけを長期間バックポート。LTS と呼ばれる |
| linux-next | next-20261028 | 次の mainline に入る予定の変更を先に集めた開発用 |
| longterm の系列 | 最初のリリース | 保守終了の予定(kernel.org) |
|---|---|---|
| 6.18 | 2025-11-30 | 2028年12月 |
| 6.12 | 2024-11-17 | 2028年12月 |
| 6.6 | 2023-10-29 | 2027年12月 |
| 6.1 | 2022-12-11 | 2027年12月 |
| 5.15 | 2021-10-31 | 2026年12月 |
| 5.10 | 2020-12-13 | 2026年12月 |
この環境の 6.18.44 は longterm の 6.18 系で、kernel.org の最新は 6.18.59 です。第3の数字(パッチ版)が上がっても機能は変わらず、修正だけが入ります。 一方、Ubuntu や RHEL のようなディストリビューションは、kernel.org の版をそのまま配るのではなく、自分たちで修正を選んで当てた独自の版(6.8.0-xx-generic のような名前)を配ります。そのため「配布物のカーネルが kernel.org の表で保守終了になっている版でも、配布元が保守している」ことがあります。
- 1配布物の更新で入れる(多くの人はこれ)apt・dnf でカーネルのパッケージが更新され、再起動で切り替わる。前の版は残るので戻せる
- 2配布物が用意する新しめの系列を選ぶUbuntu の HWE カーネル、RHEL の kernel-ml など。新しいハードウェアを使いたいとき
- 3kernel.org のソースから自分でビルドする組み込み・検証・特定の機能が要るとき。
make menuconfigで組み込みかモジュールかを選ぶ - 4再起動せずに修正を当てる(ライブパッチ)Red Hat の解説にある「ライブパッチ適用中も Linux カーネルは動作し続ける」仕組み。止められないサーバー向け
WSL2・仮想マシン・コンテナとカーネルの関係
この節では、Windows の WSL2、仮想マシン、コンテナのそれぞれで「カーネルがどこにいるか」が分かります。
仮想マシンはカーネルを1つ丸ごと持ち、コンテナはホストのカーネルを借りて動きます。 この違いが、起動の速さ・分離の強さ・カーネルの版を選べるかどうかの差になります。
| 仮想マシン | コンテナ(Docker 等) | WSL2 | |
|---|---|---|---|
| カーネル | ゲストごとに1つ(この環境の 6.18.44 もこれ) | ホストのカーネルを共有。コンテナの中で uname -r するとホストの版が出る |
Microsoft がビルドした Linux カーネルが、軽量 VM の中で1つ動く |
| カーネルの版を選べるか | 選べる | 選べない(ホスト次第) | Windows Update で配られる。自分でビルドした版も指定できる |
| 分離 | ハイパーバイザーで強い | namespace・cgroup による分離 | VM と同じ |
| ドライバーの見え方 | virtio などの仮想デバイス | ホストのデバイスがそのまま | WSL 用に調整された構成 |
Microsoft Learn は WSL2 について、「WSL 2 の Linux カーネルは、kernel.org で使用可能なソースに基づいて、最新の安定したブランチから Microsoft によって構築されています」「カーネルは Windows 更新プログラムによって処理されます」「WSL 1 は WSL チームによって構築された変換レイヤーを使用していましたが、WSL 2 には、システム呼び出しの完全な互換性を備えた独自の Linux カーネルが含まれています」と説明しています。WSL1 はシステムコールを Windows の呼び出しに「翻訳」していたのに対し、WSL2 は本物の Linux カーネルが動いている、という違いです。WSL2 の環境の整え方は、関連記事「WSL2環境構築|Ubuntu開発環境をコマンドだけで整える手順」で扱っています。
コンテナが「ホストのカーネルを共有したプロセス」であることを、namespace と cgroup で手作りして確かめた記事「コンテナとは?仮想マシンとの違い|namespace・cgroupで手作りして理解」も、この記事の続きとして読めます。この環境の /proc/self/cgroup にも、メモリの cgroup にこの作業用の名前が付いていました。
よくあるエラー・つまずきと判断表
この節では、カーネルを調べるときに出る文言と、その意味・対処が分かります。
| 出た文言(原文) | 意味 | 対処 |
|---|---|---|
lsmod: command not found |
kmod が入っていない(この環境) | ls /sys/module で代用。一般的な環境では kmod パッケージ |
cat: /proc/modules: No such file or directory |
カーネルがモジュールに対応していない(nomodule・CONFIG_MODULES 無し) |
全部組み込み。/sys/module と /proc/cmdline を見る |
dmesg: read kernel buffer failed: Operation not permitted |
dmesg_restrict=1 で一般ユーザーが読めない(この環境で nobody として実行) |
sudo dmesg、または journalctl -k |
strace: attach: ptrace(PTRACE_SEIZE, 1): Operation not permitted |
動いているプロセスへの接続が権限や ptrace の制限で断られた(この環境では PID 1 に対して) | 自分の子プロセスとして起動して追う。Yama の ptrace_scope がある環境ではその値を確認 |
echo: write error: Input/output error |
読み取り専用の /proc のファイル(/proc/version)に書こうとした |
書けるのは /proc/sys と /sys の一部だけ |
openat(…) = -1 ENOENT (No such file or directory) |
システムコールがエラー番号で失敗を返した | strace の行で、どのパスをどこから開こうとしたかを見る |
Kernel panic - not syncing: VFS: Unable to mount root fs |
ルートファイルシステムが見つからない(initramfs・ドライバー・UUID の不一致) | 前の版のカーネルで起動して initramfs を作り直す |
何を見るかの判断表
| 知りたいこと | 見る場所・コマンド |
|---|---|
| カーネルの版 | uname -r・/proc/version |
| 起動時の指定 | /proc/cmdline |
| プログラムがカーネルに何を頼んでいるか | strace -f -e trace=…・strace -c |
| ハードウェアを認識したか | dmesg・/sys/bus/*/devices・/proc/interrupts |
| ドライバーが読み込まれたか | lsmod・/sys/module・/sys/class/net/eth0/device/driver |
| カーネルの調整値 | sysctl -a・/proc/sys/ |
| プロセス1つの中身 | /proc/<pid>/status・maps・fd/ |
| 落ちた原因 | dmesg の oops・journalctl -k -b -1 |
よくある質問
Q. カーネルとは何ですか? A. OS の中核にあるプログラムで、CPU・メモリ・ファイル・デバイス・ネットワークを管理し、アプリからの要求をシステムコールで受け付けます。ハードウェアに直接触れるのはカーネルだけです。
Q. カーネルと OS は同じものですか? A. 違います。OS はカーネルに加えて、シェル・ライブラリ・コマンド・画面・パッケージ管理を含んだ全体です。Ubuntu は OS(配布物)、その中で動く Linux 6.x がカーネルです。
Q. Linux カーネルとは何ですか? A. Linus Torvalds が1991年に始め、今も mainline として管理されているカーネルです。kernel.org で配られているのはカーネルだけで、Ubuntu・RHEL・Android はそれに周りのソフトを足した配布物です。
Q. カーネルのバージョンはどう確認しますか?
A. uname -r です。cat /proc/version ならコンパイラーの情報も出ます。配布物の版は cat /etc/os-release で、別物です。
Q. システムコールとは何ですか?
A. アプリがカーネルに仕事を頼む窓口です。openat・read・write・clone などがあり、strace を付けて実行すると1行ずつ見えます。手元の cat は43回呼んでいました。
Q. カーネル空間とユーザー空間の違いは? A. カーネル空間は CPU の特権モードで動き、ハードウェアに触れ、1つの空間を共有します。ユーザー空間はプロセスごとに分かれた仮想アドレス空間で、ハードウェアには触れません。アプリが落ちても他に影響しないのはこの分離のためです。
Q. カーネルパニックとは何ですか?
A. カーネル自身が続行できないと判断して止まることです。/proc/sys/kernel/panic の秒数で自動再起動するかが決まり、原因はドライバー・ハードウェア・ルートファイルシステムが見つからない、などです。
Q. モノリシックカーネルとマイクロカーネルの違いは? A. モノリシックはドライバーやファイルシステムまで全部カーネル空間に入れる設計(Linux)、マイクロカーネルは最小限だけ残して他をユーザー空間に出す設計(MINIX 3・seL4)です。Windows NT と XNU はその中間(ハイブリッド)です。
Q. カーネルモジュールとは何ですか?
A. カーネルに後から読み込める部品(.ko ファイル)で、ドライバーやファイルシステムが多いです。lsmod で一覧、modprobe で追加します。この記事の環境は nomodule で全部組み込みでした。
Q. WSL2 のカーネルは本物の Linux ですか? A. はい。Microsoft Learn によると、kernel.org のソースから Microsoft がビルドした Linux カーネルが軽量 VM の中で動き、Windows Update で更新されます。WSL1 は変換レイヤーで、カーネルは持っていませんでした。
Q. Docker のコンテナにカーネルはありますか?
A. ありません。コンテナはホストのカーネルを共有するプロセスです。コンテナの中で uname -r するとホストの版が出ます。
Q. カーネルを更新すると何が変わりますか? A. パッチ版(第3の数字)の更新は修正だけで機能は変わりません。系列(6.12→6.18 など)が上がると新しいハードウェアの対応や機能が入ります。配布物の更新なら前の版が残るので、問題があればブートメニューで戻せます。
まとめ
- カーネルは OS の中核で、プロセス・メモリ・ファイル・デバイス・ネットワークを管理し、システムコールでアプリの要求を受け付ける。ハードウェアに触れるのはカーネルだけ。
straceで見ると、catはopenat→read→write→closeをカーネルに頼んでいた。全部で43回、エラーは errno の番号で返る。システムコール1回は Python の関数呼び出しの約4.5倍(196ns)かかった。- 版は
uname -r、起動時の指定は/proc/cmdline、調整値は/proc/sys、デバイスは/sys。どれも読むとカーネルが中身を作る仮想ファイル。 - この環境は仮想マシン内の最小構成(
nomodule・virtio)でlsmodも/proc/modulesも無かった。一般的な PC ではlsmodにドライバーが並ぶ。 - Linux はモノリシック+モジュール、Windows NT と XNU はハイブリッド。longterm(LTS)は kernel.org で保守終了の予定が公開され、配布物は独自の版を保守する。WSL2 は本物の Linux カーネルを VM で動かし、コンテナはホストのカーネルを共有する。
参考・出典
確認日はいずれも 2026年10月29日です。
- The Linux Kernel Archives(mainline・stable・longterm の一覧):https://www.kernel.org/
- The Linux Kernel Archives「Releases」(longterm の保守終了予定・各種別の定義):https://www.kernel.org/category/releases.html
- The Linux Kernel documentation「Documentation for /proc/sys/kernel/」(panic・panic_on_oops・osrelease・dmesg_restrict):https://www.kernel.org/doc/html/latest/admin-guide/sysctl/kernel.html
- Microsoft Learn「WSL 1 と WSL 2 の比較」:https://learn.microsoft.com/ja-jp/windows/wsl/compare-versions
- Microsoft Learn「ユーザー モードとカーネル モード」:https://learn.microsoft.com/ja-jp/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode
- Apple Developer「Kernel Programming Guide: Kernel Architecture Overview」:https://developer.apple.com/library/archive/documentation/Darwin/Conceptual/KernelProgramming/Architecture/Architecture.html
- Red Hat「Linux カーネルとは」:https://www.redhat.com/ja/topics/linux/what-is-the-linux-kernel
- strace「strace - linux syscall tracer」:https://strace.io/
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「カーネルとは|OSの中核の役割・仕組みをstraceと/procの実物で」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。