わかるUNIXの歴史第 2 回 / 輪の着火

再実装の木の若葉・Linux が、どうやって産声をあげたか ── 1991年に密着

最初のLinux ── MINIX上のgccで生まれた 第0回で「輪は1991年に MINIX 上の gcc で着火した」と言いました。今回はその瞬間を、バージョン番号の解像度で見ます。単体では動けなかった赤ちゃん v0.01 から、Linux が Linux 自身をコンパイルできた v0.11 ── 産室(MINIX)から巣立つまでの4か月。

必要な道具:第0回(輪)・第1回(再実装の木) 種明かし:自立とは、輪を自分で回せること

1991年、フィンランドの学生 Linus Torvalds は、買ったばかりの386 PCで、MINIX を開発環境(第1回でいう産室)として使っていました。そこには GNU の道具 ── C コンパイラ gcc と シェル bash ── が移植されていた。この gcc こそ、最初の Linux をコンパイルした「親」です。でも生まれたての Linux は、まだ自分では自分をコンパイルできない。輪(第0回)は、まだ MINIX におんぶしている状態でした。その赤ちゃんが、どうやって自分の足で立つのか。まずは、いちばん最初の“心臓の鼓動”から。

01種火 ── AAAA と BBBB

Linux は「OSを作るぞ」と設計図から始まったわけではありません。最初にあったのは、386の機能を試す2つの小さなプログラムでした。片方はひたすら A を、もう片方はひたすら B を画面に打ち続ける。この2つを、CPUがすばやく切り替えて交互に走らせることに成功したとき ── それが、OSの心臓(タスク切り替え)の最初の鼓動でした。

図1:Linuxの“最初の鼓動”。2つのプロセスA・Bを、カーネルが交互に走らせる(タスク切り替え)。この切り替えが、のちのマルチタスクOSの核になる
プロセスA(AAAA…)とプロセスB(BBBB…)を、CPUが交互に。これがOSの心臓=タスク切り替え。

ここに端末ドライバを足して、自宅から大学のコンピュータへダイヤルアップできるようにし ── と、機能が雪だるま式に増えていく。「OSを作ろう」ではなく「386で遊んでいたら、いつのまにかOSになっていた」。そして1991年8月25日、あの有名な投稿が comp.os.minix に流れます。

From: torvalds@klaava.Helsinki.FI (1991年8月25日, comp.os.minix) Hello everybody out there using minix - I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones ...
つなぐ声 ── “won't be big like gnu” 「GNU みたいに大きく立派にはならない」── この一文が、第1回の再実装の木の位置関係をそのまま映しています。Torvalds が作るのはカーネル。ユーザーランド(gccbash)はすでに GNU が作っていた。だから最初の Linux は、GNU の道具でコンパイルされ、のちに GNU の道具と合体して1つのOSになります(“GNU/Linux”)。謙遜のジョークが、実は系譜の正確な自己紹介でした。

02v0.01(1991年9月)── 単体では立てない赤ちゃん

最初に公開された v0.01 は、約10,239行。ですがこれは、電源を入れれば動く完成品ではありません。コンパイルするにも、セットアップするにも、MINIX が要る。輪はまだ着火しておらず、産室に完全におんぶした状態です。

v0.01 の“おんぶ”の中身

コンパイル:MINIX 上の gcc がやる(Linux 自身にはまだコンパイラが乗らない)。

準備:MINIX のファイルシステムやツールを使ってディスクを整える。

・つまり Linux を用意するために、まず MINIX が動いていないといけない。第0回の言葉でいえば「輪の外の何か(=MINIX+gcc)が、まだ持ち上げ続けている」段階。

03巣立ちの4か月 ── v0.01 → v0.11

ここからが今回の主役です。下のスライダーで v0.01 → 0.02 → 0.11 → 0.12 と進めてください。MINIX への依存が減り、ある一点で「自分で自分をコンパイルできる」自己ホスティングに切り替わるのが見えます。その瞬間が、産室からの巣立ちです。

図2:産室からの巣立ち。左は開発環境(386→MINIX→gcc/bash)。スライダーを進めると、Linuxをコンパイルする矢印が「MINIX上のgcc」から「Linux自身(自己ホスティングの輪)」へ切り替わる
巣立ちの4か月(1991)

v0.01(9月)

MINIX上のgccでコンパイル。単体では実用にならない。おんぶ

v0.02(10月5日)

Linux 上で bashgcc が動きだす。道具を自分の上で動かせ始めた。

v0.11(12月19日)── 巣立ち

自己ホスティング達成。Linux 上で Linux をコンパイルできた。輪が回り始めた瞬間。mkfsfdisk など自前ツールも揃う。

今回の急所 ── 「自立」=依存ゼロ、ではない

v0.11 の自己ホスティングは、「もう何にも頼らない」という意味ではありません。正しくは ── Linux を作るのに、もう MINIX を持ち出さなくてよくなった(輪を自分で回せるようになった)ということ。コンパイラ自体はいまも GNU の gcc。第0回で見たとおり、自己ホスティングとは「外の着火装置(MINIX)を外せる」ことであって、「1人で無から立つ」ことではありません。

◇ ◇ ◇

04v0.12(1992年1月)── ライセンスという二段目のロケット

技術的な巣立ちは v0.11 でした。でも Linux を世界に広げたのは、次の v0.12(1992年1月5日、約2万行未満)での一手 ── ライセンスを GPLv2 に変えたことです。それ以前は Torvalds 自作の制限付きライセンスで、商用の再配布を禁じていました。

つなぐ声 ── なぜGPLが効いたか GPLは「誰でも自由に使い・改変・再配布してよい。ただし派生物も同じ自由を保て」というルール。これで世界中の人が安心して手を入れ、改良を持ち寄れるようになりました。Torvalds はのちに「GPLv2 にしたのは人生で最良の判断だった」と語っています。第1回のGNUの思想(自由なソフト)が、Linux を再実装の木の“ただの一枚の葉”から、森全体を育てる幹へ変えた。ライセンスは、コードと同じくらい歴史を動かします。
正直な線 ── どこまでが「自立」か、言葉をていねいに

(1) v0.11 の「自己ホスティング」はカーネルとビルドがLinux上で完結するという意味で、コンパイラは今も GNU の gcc(または clang)です。私たちが日常使う“Linux”は、Linuxカーネル+GNUユーザーランドの合作 ── だから “GNU/Linux” とも呼ばれます(第1回「こずえで葉を交換」)。完全な単独自立ではありません。

(2) v0.01 が「動かない」は言い過ぎで、正確には最小限は動くが、準備も改造も MINIX 前提で実用にならないという意味です。(3) 日付は資料により幅があります(v0.01 は1991年9月中旬、通説では9月17日公開)。(4) 「AAAA/BBBB」の逸話は Torvalds 自伝『Just for Fun』などで広く語られる有名なエピソードで、細部の脚色はあり得ます。

練習問題(今回の話だけで解けます)
  1. 最初の Linux(v0.01) は、何の上の何でコンパイルされたか。
    答えを見る
    MINIX(開発環境=産室)上に移植された GNU の gcc。Linux 自身にはまだコンパイラが乗っていない。
  2. 「自己ホスティング達成(v0.11)」を、第0回の“輪”の言葉で説明せよ。
    答えを見る
    Linux を作るのに外の着火装置(MINIX)が要らなくなり、Linux 上の gcc で Linux をコンパイルできる=輪を自分で回せるようになった状態。依存ゼロという意味ではない。
  3. v0.11 が「技術的な巣立ち」なら、v0.12 は何の巣立ちか。
    答えを見る
    社会的・普及の巣立ち。GPLv2 採用で誰でも自由に使い改良を持ち寄れるようになり、世界的な共同開発が始まった。
  4. Torvalds の「won't be big like gnu」は、系譜的にどう正しかったか。
    答えを見る
    彼が作ったのはカーネルで、ユーザーランドは既に GNU が作っていた。最初の Linux は GNU の道具でコンパイルされ、のちに GNU と合体して1つのOS(GNU/Linux)になった。

まとめ4か月で、赤ちゃんは輪を自分で回し始めた

Linux は設計図ではなく、386上のタスク切り替え(AAAA/BBBB)という心臓の鼓動から始まった。開発環境は MINIX(産室)で、そこに移植された GNU の gcc が最初の Linux をコンパイルした。v0.01(1991年9月・約1万行)はコンパイルもセットアップも MINIX が要る“おんぶ”状態 ── 輪はまだ外(MINIX)が回していた。

v0.02(10月)で Linux 上でも bashgcc が動きだし、v0.11(12月19日)で自己ホスティング達成=Linux が Linux をコンパイルし、産室から巣立った。ここでいう自立は「依存ゼロ」ではなく「外の着火装置を外せた(輪を自分で回せる)」こと。翌月の v0.12GPLv2 という二段目のロケットで、Linux を世界の共同開発へ押し上げた。── では、その最初の親 gcc は、いったい何がコンパイルしたのか? 階段を、もう一段下へ。

この文書は「わかるUNIXの歴史」シリーズ第2回です。史実:Linus Torvalds は1991年、386 PC上の MINIX を開発環境とし、移植された GNU の gcc・bash を用いて Linux を開発した。1991年8月25日の comp.os.minix 投稿「just a hobby, won't be big and professional like gnu」は有名。v0.01 は1991年9月(通説9月17日)公開で約10,239行、コンパイル・セットアップに MINIX を要した。v0.02 は1991年10月5日で bash・gcc が動作。v0.11 は1991年12月(19日ごろ)で初めて自己ホスティング(Linux上でコンパイル可能)を達成し、mkfs・fdisk 等を備えた。v0.12 は1992年1月5日で、Torvalds 自作の制限的ライセンスから GNU GPLv2 へ移行(発効1992年2月1日)、規模は2万行未満。ここでの「自己ホスティング」はビルドが Linux 上で完結する意で、コンパイラ(gcc)とユーザーランドは GNU に依存し、通称 GNU/Linux。AAAA/BBBB のタスク切り替えの逸話は Torvalds の回想(自伝『Just for Fun』ほか)で広く知られる。 ── 印刷する場合はブラウザの「印刷」から「PDF に保存」を(印刷版では図の操作とアニメ・解答は静止/非表示になります)。

印刷 / PDF 化:⌘+P(Windows は Ctrl+P)。画面では図1の「▶ 走らせる」でタスク切り替えを、図2のスライダーで v0.01→0.12 の巣立ちを追えます。「答えを見る」で解答が開きます。