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で観察できる - 分離して考えるとトラブルの切り分けが速くなる