筆者の実家の回りでもすっかり田植えが終り、新緑の田んぼを吹き抜ける風が気持ちよく感じられる季節になりました。大震災や原発事故など、人間社会は進む先がよく見えない時代ですが、季節の歩みは止まることなく進んでいくようです。
さて、最近のLinux関連の大きなニュースとして、次のカーネルのバージョンが3.0になる、という話題が飛びこんできました。
具体的には、Linus Torvaldsが5/29付けのLKML(Linux Kernel Mailing List)への投稿で、次のカーネルのバージョンを3.0にする旨のアナウンスを行い、カーネルのバージョン表示に関する部分を3.0に更新して、ソースコードのバージョンタグも3.0に更新したそうです。
ソフトウェアは開発を続けていく限りバージョンが上がるのは当たり前で、PC UNIXのもうひとつの雄であるFreeBSDはすでに8.2にまでバージョンが上っていますし、Firefoxもつい先日4.0がリリースされたと思ったのに、すでに最新版は5.0になっています。
Linus自身、バージョンを3.0にするのは、2.6系が長く続きすぎたことと、そろそろLinux誕生20周年になるという、いわば「キリがいいから」という理由だけで、何ら画期的な新機能が追加されるわけでも、今までのバージョンとの互換性が損なわれるわけでもないことを上記の投稿で力説しています。
一方、筆者のように長くLinuxに触れてきた人間にとっては「3.0」というバージョンにある種の感慨を覚えることも事実です。そこで今回は、Linuxのカーネルバージョンの持つ意味について考えてみたいと思います。
ちなみに図1が現在開発中のPlamo64環境で起動してみたlinux-3.0-rc5のバージョン表示例です。確かにバージョン番号の表示こそ3.0.0-rc5になっていますが、Tuxペンギンの表示も従来の2.6系と何ら変らず、3.0は2.6.40の別名と言っても差し支えなさそうです。
ソフトウェアのバージョン番号
Linuxのカーネルバージョンについて考える前に、まずソフトウェアのバージョン付けの一般的なルールについて紹介しておきましょう。
ほとんどのソフトウェアプロジェクトでは、日々成長を続けていくソフトウェアに適切なタイミングで番号を振り、その番号によってソフトウェアのバージョンを管理しています。
どのようなタイミングでどういうバージョン番号を振るかについての厳密な決まりはなく、日付やアルファベットを含めたバージョン番号を使っているプロジェクトもありますが、たいていのプロジェクトではピリオド(".")を区切りにしたA.Bという2つ、あるいはA.B.Cという3つの数字でソフトウェアのバージョン番号を表現するようにしています。
この場合、1つめの数字("A")を「メジャーバージョン番号」、2つめの数字("B")を「マイナーバージョン番号」、3つめの数字("C")は「リビジョン番号」、あるいは「パッチ番号」と称しています。プロジェクトによってはさらに数字を追加してA.B.C.Dというスタイルを採用することもあり、Linuxでも2.6系では2.6.39.2のように4つの数字でバージョンを管理しています。
それぞれの数字を開発過程のどのような段階で更新するかの判断は開発者に任されていますが、一般的には、左側の数字ほど重要な意味が持たされていて、"A"の部分(メジャーバージョン番号)を更新するのは、重要な機能追加や互換性を失うような変更等があって以前のバージョンとは大きく異なる場合、"B"の部分(マイナーバージョン番号)を更新するのは、メジャーバージョン番号を更新するほどではないけれど、重要なバグを修正したり、新しい機能を追加して以前のバージョンとはかなり異なる場合、と考えられています。
"C"以下の部分は、バグの修正ごとに更新したり、ある程度変更箇所がたまった時点で更新したりと、プロジェクトにより千差万別ですが、以前のバージョンと互換性を損なわないレベルの変更を区別するために用いるのが一般的です。
バージョン番号は、ソフトウェアの更新履歴を管理する以外の目的にも使われることがあります。たとえば、マイナーバージョン番号("B"の部分)に開発版と安定版を区別する意味を持たせて、マイナーバージョン番号が偶数ならば安定版、奇数ならば開発版とする、という流儀があります。これは後述するようにLinuxの開発過程で採用された方法ですが、最近ではGNOMEプロジェクトを始め、さまざまなソフトウェアプロジェクトで採用されています。
このようなバージョン番号のルールを知っていれば、既存のソフトウェアを更新する際にどのバージョンにするべきかのメドが立てやすくなります。たとえば、foobar-1.2.3というソフトウェアを使っていて、このソフトウェアの新しいバージョンを調べたら、foobar-1.2.5とfoobar-2.0.1の2種類があった、という場合、foobar-1.2.5は機能的にはやや古くなっているものの、現在自分が使っているバージョンとそれほど大差なく、バージョンアップしても問題はまず生じないだろう、一方、foobar-2.0.1はこのソフトウェアの最新版で、新機能もあれこれ増えていそうだけど、設定ファイル等を見直さなければ正しく動作しないといったリスクもありそうだ、と判断することができます。筆者なら、バージョンアップしたfoobarをすぐに使わなければならない場合は1.2.5を、ドキュメントを読んだり設定ファイルを調べたりする余裕がある場合は2.0.1を選ぶことになりそうです。
Linuxのバージョン番号の歴史
さて、前節で紹介したバージョン番号のルールを元に、Linuxのバージョン番号の歴史を考えてみます。
最初のLinuxはバージョン0.01として1991年の9月に公開されました。当時Linus Torvaldsは21歳、ヘルシンキ大学コンピュータ科学コースの学生でした。その後、バージョン0.11が91年の12月、0.12が92年の1月に公開され、その次は一気にバージョンが0.95にまで跳んで92年3月に公開されています。
最初期のLinuxはバージョン0.9xまでは数ヶ月で到達したものの、そこから1.0までにはずいぶん長い時間が必要でした。ざっと紹介しておくと1992年には0.95a、0.96、0.97等のバージョンが公開され、翌1993年はずっと0.99.xxでの公開が続き、1994年の2月に0.99系の最終版が0.99.15として公開、翌3月13日にやっと最初の公式版であるLinux-1.0が公開されました。Linuxのメジャーバージョン番号が0から1に更新されるには約2年半の歳月がかかったわけです。
その後、2年ほどはマイナーバージョン番号の更新が続き、94年にはLinux-1.1、95年には1.2と1.3のシリーズが公開され、次のメジャーバージョン番号の更新であるLinux-2.0は1996年の6月に公開されました。
Linuxがお手本としたUNIXは高級言語であるCで記述されているため、さまざまなコンピュータに容易に移植できることが重要な特長でした。一方、1.0のころのLinuxはIBM PC互換機のハードウェアに強く依存したコードになっており、伝統的なモノリシックカーネルデザインとあいまって「時代遅れ」「車輪の再発明」「学生のおもちゃ」と酷評されがちでした。
そのような批評に対して、Linusを中心とした開発者たちは1.x台のマイナーバージョンアップを通じて地道な改良を続けていきました。移植性の問題に関しては、ハードウェアに依存する部分とそうでない部分を切り分けて整理し直し、1.2のころにはPC互換機以外にも、SUNのSPARCやMIPSといったRISCタイプのCPUのみならずDECのAlphaのような64ビットCPUでも動作可能になりました。
モノリシックカーネルの問題に関しても、デバイスドライバをはじめとして、ファイルシステムやネットワークといったさまざまな機能を独立したモジュールドライバとして用意しておき、必要に応じて動作中にでもモジュールドライバを組み込むことで機能を追加できるモジュールカーネルという設計を採用し、マイクロカーネルの柔軟性とモノリシックカーネルの効率の良さの双方を共存可能にしました。
これら2つの大きな改善の結果、「Linuxが新しい段階に入ったと見なせる」と考えたLinusは、Linux-1.3.100を最後にメジャーバージョン番号を2.0に更新したわけです。
一方、Linuxが商用環境へも普及していくにつれ、バージョン1.xのころの開発スタイルでは、安定したカーネルを求めるニーズと新しい機能を求めるニーズの双方を満足させることできないことが明白になり、バージョン2.0以降しばらくの間、Linuxには「安定版」と「開発版」の2種のバージョンが併存するようになりました。
「安定版」は2.0.x, 2.2.x, 2.4.x といったマイナーバージョン番号が偶数のシリーズで、このシリーズでは大きな変更を伴うような新機能の追加は控えられ、以前のバージョンとの互換性を重視した開発が行われます。一方、「開発版」は2.1.x、2.3.x、2.5.xといったマイナーバージョン番号が奇数のシリーズで、このシリーズでは新機能の追加が積極的に試みられ、互換性や安定性が損なわれることもあります。
開発版カーネルで実装された新機能のうち、安定版カーネルの互換性を損なわずに実現できると判断された機能は適宜安定版に移植されますし、開発版が十分熟成したと判断されれば、そのバージョンが次の安定版カーネルの最初のバージョンになってまた新しい開発サイクルが始まる、Linuxが広く普及していく1996年から2003年までの間はそのようなスタイルで開発が行なわれていきました。
それぞれのバージョンがどの程度期間開発されていたかを表1にまとめてみました。
表1 Linuxの各バージョンの継続期間
バージョン | 期間 | 長さ |
0.01-1.0 | 1991/09-1994/03 | 2年6ヵ月 |
1.1-1.1.95 | 1994/05-1995/03 | 10ヵ月 |
1.2-1.2.13 | 1995/03-1995/08 | 5ヵ月 |
1.3-1.3.100 | 1995/06-1996/05 | 11ヵ月 |
2.0-2.0.40 | 1996/06-2004/02 | 7年8ヵ月 |
2.1.0-2.1.132 | 1996/09-1998/12 | 2年3ヵ月 |
2.2.0-2.2.26 | 1999/01-2004/02 | 5年1ヵ月 |
2.3.0-2.3.99 | 1999/05-2000/05 | 1年 |
2.4.0-2.4.37 | 2001/01-2008/12 | 7年11ヵ月 |
2.5.0-2.5.75 | 2001/11-2003/07 | 1年8ヵ月 |
2.6.0-2.6.39 | 2003/12-2011/05 | 7年5ヵ月 |
3.0 - | 2011/07(?)- | ? |
Linux-2.0以降のいくつかのバージョンを取りあげると、開発版である2.1の最初のバージョンである2.1.0が'96年9月、最終バージョン2.1.132が'98年12月に公開され、そのバージョンを元にした新しい安定版である2.2.0は翌'99年の1月に公開されました。
次の開発版の最初のバージョン2.3.0は'99年5月に、最終版は2000年3月に2.3.51から一気に2.3.99にジャンプアップし、2000年の5月には2.3.99-pre9が公開されました。
2.3.99を元にした次の安定版である2.4.0はやや遅れて2001年1月に公開され、次の開発版である2.5.0は01年11月に公開されました。2.5シリーズの開発は2年ほど続き、最終版は03年7月に公開された2.5.75になりました。
2.1、2.3、2.5といった開発版カーネルでは、カーネルの土台となる部分にも積極的に手が加えられ、汎用機から組込み機器用までの多く種類のCPUで動作する高い移植性を持つとともに、CPUやメモリを膨大に積んだエンタープライズ環境でもそれらを使いこなせるスケーラビリティを手に入れました。
このような進化の結果、次の安定版をマイナーバージョン番号の更新に留めた2.6にするべきか、メジャーバージョン番号まで更新した3.0にするべきかは当時も議論になりましたが、結局メジャーバージョン番号の更新は見送られ、2.6.0が2003年12月に公開されました。
当初、2.6系カーネルもしばらく安定版のリリースが続いた後に、新しい開発版の2.7系が公開されるものと思われていましたが、従来のような安定版と開発版を分離する方式では、一般ユーザが新しい便利な機能を使えるようになるまでに時間がかかりすぎると考えたLinusら開発者は、マイナーバージョン番号での安定版と開発版の区別を無くした新しい開発スタイルを採用しました。
この開発スタイルでは、Linusを中心とした新機能の開発者たちは世界中から届くパッチをとりまとめて、数ヵ月の1度のペースで2.6.11、2.6.12、2.6.13、…といった3つの数字からなるバージョンを持つカーネルを開発版として公開し、それを受けてメンテナンスチームが2.6.11.1、2.6.11.2、…といった4つの数字からなるバージョンを持つカーネルを安定版として公開する、という手順になりました。
実際の2.6系の開発過程では、スケジューラやプロセス管理といったカーネルの土台となる部分への修正も加わり、互換性等の問題が生じたこともありましたが、このスタイルでのカーネルの開発は7年以上続き、2011年5月には2.6.39に達しました。
LKMLのログを眺めると、2008年ごろにもカーネルのバージョン付けに関する議論が行われており、その中でLinusは、最近のLinuxでは、ある機能が入ったからバージョンを上げるという従来の機能ベースのバージョン管理ではなく、2、3ヵ月に一度、新バージョンを公開するという時間ベースでバージョン付けをしていること、あまりにバージョン番号が大きくなりすぎると覚えにくいこと、などを指摘して、近いうちにバージョン番号をリセットしたい旨の発言をしていました。
そして0.01が公開された1991年から今年で20周年になることを期して、区切りがいい2.6.39の次でメジャーバージョン番号を更新する気になったのでしょう。
Linux-3.0
こうやってLinuxの発展とバージョン番号の歴史を振りかえると、Linus自身は単なる番号リセットに過ぎないと言う「3.0」というバージョン番号に、筆者が感じる感慨をわかっていただけるでしょうか?
Linux-1.0や2.0のリリースは、筆者のような一般ユーザの目から見ても大きな出来事でした。1.0への更新には「学生のおもちゃ」と思われていたLinuxが、SCSI HDDやネットワーク、X Window Systemなど、既存のUNIXと同等の環境をPC上に実現できたことが、2.0への更新には移植性の向上やモノリシックカーネルの特徴を活かしたモジュールカーネルなど、当時の商用UNIXに勝るとも劣らない機能の実現が、それぞれのメジャーバージョン番号に込められていたように思います。
また、2.1から2.5までの安定版と開発版が分かれたLinuxでは、過去のバージョンで築きあげた成果に立ちどまることなく、安定版を自ら壊して新しい開発版を作りだすところに、伝統にとらわれることなく進み続けるLinuxらしさを感じたものでした。そのLinuxも誕生から20周年を迎え、いよいよ成熟期から円熟期に入った、その象徴が「3.0」というメジャーバージョン番号という気がします。
昔、Plamo Linuxのメンテナたちと飲んでいた際、「もし次の開発版が出るとしたら、UNIXの枠組みから大きく踏み出すような機能をめざすのだろうか?」といった話題で盛りあがったことがあります。Linus自身もいつの間にか不惑の年を越え、UNIXの枠組みから大きく踏み出すような新しい挑戦は、次の世代の開発者たちに委ねる気になったのかも知れません。