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

Linuxディストリビューションとは何か

連載ナビ

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

今回は Linuxを理解する 〜 LFSで学ぶLinux内部構造 〜 の Part 1 / 第2回です。

—

ディストリビューション = カーネル + 選び抜かれた部品一式

「Linuxを始めたい」と調べ始めると、Ubuntu、Debian、Fedora、Arch、Alpine……と無数の名前が出てきて圧倒されます。なぜLinuxにはこれほど多くの「種類」があるのか。

結論はこうです。ディストリビューションとは、Linuxカーネルに、シェル・基本コマンド・Cライブラリ・initシステム・パッケージ管理などを組み合わせ、動作検証済みの「完成品のOS」として配布したものです。そして、どの部品を選ぶかの「思想」がディストリビューションごとに違うから、無数の種類が存在するのです。


ディストリビューション
  = Linuxカーネル
  + Cライブラリ     (glibc / musl など)
  + 基本コマンド群   (ls, cp などのGNU coreutils / BusyBox)
  + initシステム    (systemd / OpenRC など)
  + パッケージ管理   (apt / dnf / apk など)
  + 既定の設定と思想

カーネル単体では、ログインすらできないから

なぜ「組み合わせて配布する人」が必要なのでしょうか。理由は単純で、Linuxカーネルは単体ではOSとして使えないからです。

カーネルの仕事はCPU・メモリ・ディスクなどハードウェアの管理です。カーネルだけを起動しても、シェルがないのでコマンドを打てず、ls も cp もなく、そもそも最初のプロセスを起動するinitシステムがないため、その場で停止します(このとき出るのが有名な Kernel panic - not syncing: No working init found. です)。

つまり実用的なOSにするには、カーネルの上に何百ものソフトウェアを、互換性を確認しながら積み上げる必要があります。これを個人が毎回やるのは非現実的なので、DebianやRed Hatのようなプロジェクトが「検証済みの組み合わせ」をパッケージにして配布してくれている——それがディストリビューションです。

UbuntuとAlpine、部品の選び方でここまで変わる

思想の違いが実際にどんな差を生むのか、対照的な2つを比べます。

  • Ubuntu:「デスクトップでもサーバーでも、誰でもすぐ使える」が思想

Cライブラリには最も普及していて互換性の高い glibc、initには依存関係の自動解決やログ管理まで担う高機能な systemd を採用。apt で7万を超えるパッケージが導入できます。その分、最小構成でもディスク・メモリ消費は大きめです。

  • Alpine Linux:「コンテナや組み込みで、最小・最速・堅牢」が思想

Cライブラリには小さく監査しやすい musl、initには軽量な OpenRC、コマンド群も多数のコマンドを1バイナリに統合した BusyBox を採用。この割り切りにより、DockerイメージはUbuntuの約80MBに対し約8MBという桁違いの小ささになります。

コンポーネント Ubuntu Alpine Linux 実際に効いてくる場面
Cライブラリ glibc musl glibc前提でビルドされたバイナリはAlpineでそのまま動かないことがある(例: 一部のPythonホイールやGoのcgoビルド)
initシステム systemd OpenRC systemd前提のサービス定義(unitファイル)はAlpineでは使えない
コマンド群 GNU coreutils BusyBox BusyBox版の ls や grep はオプションが少なく、シェルスクリプトの互換性に影響
パッケージ管理 apt apk apkは小さく高速。CIでのイメージビルド時間に直結

この表のポイントは、優劣ではなくトレードオフだということです。Alpineの小ささは「glibc互換を捨てる」という選択の対価であり、Ubuntuの互換性の高さは「サイズと複雑さ」の対価です。

では、いま自分が使っているシステムがどんな部品の組み合わせなのか、実際に確認してみましょう。


# 1. ディストリビューション名とバージョンを確認
cat /etc/os-release

# 2. initシステムを確認(PID 1 = 起動後最初のプロセスの名前を表示)
ps -p 1 -o comm=

# 3. Cライブラリの種類とバージョンを確認
ldd --version | head -n 1

Ubuntuなら、PID 1は systemd、Cライブラリは GLIBC と表示されるはずです。もしDockerでAlpineを動かせる環境があれば、同じコマンドを打って違いを見比べると、この記事の内容がそのまま目の前に現れます。

LFSとは「自分の思想でディストリビューションを作る」こと

ディストリビューションとは、カーネルに部品一式を組み合わせた完成品であり、部品選びの思想の数だけ種類が存在する——これが今回の結論です。

そしてこの見方に立つと、この連載で挑むLFSの正体もはっきりします。LFSとは、カーネル・Cライブラリ・コマンド群・initを全部自分で選び、自分でビルドして組み合わせる、つまり「自分だけのディストリビューションを作る」ことに他なりません。次回は、その中核である「カーネル」と「ディストリビューション」の役割分担を、コマンドの動きを追いながら詳しく見ていきます。

図解テキスト


Distribution = Kernel + libc + コマンド群 + init + package manager + 既定設定

例:
Ubuntu = Linux kernel + glibc + GNU coreutils + systemd + apt
Alpine = Linux kernel + musl  + BusyBox       + OpenRC  + apk

この回で実行するコマンド

上から順番に実行すれば、この回の内容を体験できます。

まずはそのままコピペして実行し、次に1行ずつ意味を確認してください。


cat /etc/os-release
ps -p 1 -o comm=
ldd --version | head -n 1

ハンズオン手順

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

2. 出力結果を見て、分かったことを1行メモする

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

4. 各コマンドが何を確認するためのものかを説明してみる

チェックポイント

  • コマンドが最後まで実行できた
  • 自分の環境の「カーネル・libc・init・パッケージ管理」の組み合わせを言える
  • 次の回に進む前に、分からない単語を1つ調べた