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つ調べた