PK
パーネルカニック研究所
今日もどこかでkernel panic。
root@pk-lab:~#

LinuxカーネルとUbuntuの違い

連載ナビ

この連載は「Linuxを使えるようになる」ではなく、「Linuxがどう動いているのか」を理解するための実践シリーズです。

今回は Linuxを理解する 〜 LFSで学ぶLinux内部構造 〜 の Part 1 / 第3回として、仕組みのつながりを意識しながら学びます。

—

カーネルは「資源を管理する核」、Ubuntuは「核を含む完成品」

「普段Linuxを使っています」という一言が指すものは、実は人によって違います。結論を先に言うと、

  • Linuxカーネルは、CPU・メモリ・ディスク・ネットワークといったハードウェア資源を管理する、OSの核となる1つのプログラム
  • Ubuntuは、そのカーネルに、シェル・コマンド・ライブラリ・デスクトップ環境などのユーザー空間のソフトウェアを組み合わせた完成品(ディストリビューション)

です。「Linux」という言葉は文脈によってこの両方を指すため、システムを深く理解したいなら、まずこの2つを意識的に区別することが出発点になります。

境界が分かると、問題の切り分けができるから

なぜこの区別が重要なのか。理由は、Linuxではカーネル空間とユーザー空間が明確に分離されていて、トラブルの原因も対処法もどちら側かで全く変わるからです。

  • カーネルの役割(カーネル空間):

どのプロセスにCPU時間を割り当てるか、メモリをどう配分するか、ディスクへの読み書きをどう行うか。プログラムはハードウェアに直接触れられず、「ファイルを開いてほしい」といった依頼をシステムコールという決まった窓口経由でカーネルに伝えます。

  • Ubuntuが提供するもの(ユーザー空間):

bash などのシェル、ls や cp などのコマンド、libc などのライブラリ、apt によるパッケージ管理、デスクトップ環境。私たちが日常的に「触っている」ものは、ほぼすべてユーザー空間のソフトウェアで、Ubuntuプロジェクトが選定・ビルド・配布しています。

この分離を知っていると、調査の入り口が変わります。たとえば「アプリが起動しない」ならまずユーザー空間(ライブラリ不足、設定ミス、権限)を疑い、「特定のハードウェアが認識されない」「システム全体がフリーズする」ならカーネル側(ドライバ、カーネルバージョン)を疑う、という切り分けが最初の一手でできるようになります。

cp コマンド1つに、両者の連携が全部詰まっている

cp source.txt dest.txt という単純なコマンドの裏側を追ってみます。

1. あなたが入力したコマンドを、シェル(bash。Ubuntuが提供)が解釈し、/usr/bin/cp(GNU coreutilsの一部。これもUbuntuが提供)を起動する

2. cp は source.txt を開くため、カーネルに openat() システムコールを発行する

3. カーネルはファイルの存在とアクセス権を確認し、ファイル記述子(番号札のようなもの)を返す

4. cp は read() でデータを読み、write() で dest.txt に書き込む。これを繰り返す

5. ディスクのどの物理位置にデータがあるか、キャッシュをどう使うかは、すべてカーネルが処理する。cp 自身はディスクの仕組みを一切知らない

つまり cp という「Ubuntuの部品」が、システムコールという窓口を通じて「カーネルの機能」を借りている、という構図です。

これは想像ではなく、strace というコマンドで実際に観察できます。


# straceが未導入なら: sudo apt install strace
echo "hello" > source.txt
strace -e trace=openat,read,write cp source.txt dest.txt

出力には openat(...)、read(...)、write(...) の行が並びます。これが「cp がカーネルに発行したシステムコールの一覧」です。ユーザー空間とカーネル空間の境界線を、自分の目で見られる瞬間です。

バージョン番号にも「誰の担当か」が現れている

自分のシステムで、カーネルとディストリビューションそれぞれの「型番」を確認してみましょう。


# 1. カーネルのバージョンを確認(-r はカーネルのリリース番号)
uname -r

# 2. ディストリビューションの情報を確認
cat /etc/os-release

Ubuntuで uname -r を実行すると、たとえば 6.8.0-45-generic のような出力が得られます。この文字列は分解して読めます。

  • 6.8 — Linus Torvaldsらが開発する本家(アップストリーム)カーネルのバージョン
  • 0-45 — Ubuntuが独自の修正を加えてビルドした際のリビジョン
  • generic — Ubuntuが用途別に用意しているカーネルの種類(フレーバー)

つまりバージョン番号そのものが、「本家カーネル」と「それを調整して配布するUbuntu」という役割分担を表しているのです。

分けて考えれば、調査は速くなる

Linuxカーネルは資源管理を担う核、Ubuntuはその核に部品一式を組み合わせた完成品。両者はシステムコールという境界で連携しており、strace を使えばその境界を実際に観察できる——これが今回のポイントです。

LFSでは、このカーネルを自分でビルドし、ユーザー空間の部品も自分で揃えることになります。つまり今回の「境界線」を、両側から自分の手で作るわけです。次回は、その作業を安全に行うための仮想環境をM1 Macに構築します。

ハンズオン手順

1. ターミナルを開いて、上のコマンドを1行ずつ実行する

2. uname -r の出力を、本家バージョン・リビジョン・フレーバーに分解してメモする

3. strace の出力から openat の行を1つ探し、何のファイルを開いているか読んでみる

4. エラーが出たら、そのエラーメッセージをそのまま残す

チェックポイント

  • コマンドが最後まで実行できた
  • 「カーネル空間」と「ユーザー空間」の違いを一言で説明できる
  • 次の回に進む前に、分からない単語を1つ調べた

今回理解できたこと

  • LinuxカーネルとUbuntuは同じではない
  • カーネルは資源管理、Ubuntuはユーザー空間一式を提供する
  • 両者の境界はシステムコールで、strace で観察できる
  • 分離して考えるとトラブルの切り分けが速くなる