ソースコード・リテラシーのススメ

第14回 initrdを読む

この記事を読むのに必要な時間:およそ 6 分

前回はLinuxの起動の仕組みをブートローダ段階,カーネル段階,/sbin/init段階の3つに分けて解説しました。

その際にも簡単に触れましたが,最近のほとんどのディストリビューションでは,初期化用ramdiskを用いて起動に必要なモジュールドライバを組み込むようになっています。

初期化用ramdiskは,1つの汎用的なカーネル設定であらゆる環境に対応できるようになる,ディストリビューターにとっては便利な仕組みですが,余計な仕組みが入っている分,カーネル再構築の敷居が高くなっていることも事実です。そこで,今回はこの初期化用ramdiskやその元になっているモジュールカーネルの考え方について解説すると共に,実際の初期化用ramdiskを調べてその中身を紹介しようと思います。

モノリシックカーネルとマイクロカーネル

最近では大型コンピュータから携帯機器までカバーしていますが,元々のLinuxはUNIXを参考にしながらPC互換機向けに0から開発されたカーネルです。

最初のバージョンのLinuxは,ヘルシンキ大学の学生だったリーナス・トーバルズ(Linus Torvalds)さんが一人で書きあげました。その際に彼は,プログラミングやデバッグの容易さから,モノリシック(monolithic)カーネルという伝統的なデザインを採用しました。

カーネルには各種ハードウェアを操作するデバイスドライバからファイルシステムやネットワークの操作,メモリやプロセスの管理,スケジューリングといったさまざまな機能が必要です。モノリシック(一枚岩)カーネルとは,これらすべての機能が1つの実行ファイルの中にまとめて組み込まれているタイプのカーネルのことです。

元々UNIXのカーネルはモノリシックカーネルのデザインになっていましたが,OSの研究が進むにつれ,モノリシックカーネルには欠点が目立つようになってきました。

たとえば,モノリシックカーネルは多数の機能が1つの実行ファイルに詰め込まれているため,複雑で肥大化しがちな上,一部の機能に問題が生じても全体に影響が出ますし,新しいハードウェア用のデバイスドライバを追加するだけでも全体を再構築する必要がありました。

それらの欠点を克服するために考案されたのがマイクロ(micro)カーネルというデザインです。マイクロカーネルでは,カーネルに必要なさまざまな機能をカーネル本体とは独立したアプリケーションとして実現し,カーネル本体にはそれら外部アプリケーション間の通信を管理する最小限の機能だけを残すことで,見通しがよく移植性や拡張性を高めることを目指しています。

モノリシックカーネルとマイクロカーネルの違い

モノリシックカーネルとマイクロカーネルの違い

モノリシックカーネルという名称は,従来のデザインの欠点を表現するためにマイクロカーネルと比較して名付けられたものだそうです。

'80年代の半ばにマイクロカーネルの概念とそれを実装したMachと呼ばれるマイクロカーネルが公開されると,OS研究の中心はモノリシックカーネルからマイクロカーネルへと移り,OSF/1やNEXTSTEPなど新しく開発されたOSではマイクロカーネルのデザインが積極的に採用されるようになり,Linuxが公開されたころにはモノリシックカーネルのデザインは時代遅れと考えられていました。

OS研究の世界的な大家で,自らMinixと言うマイクロカーネルのデザインを採用した教材用のOSを開発したアンドリュー・タンネンバウム(Andrew Tannenbaum)教授がLinuxは時代遅れ(Linux is obsolete)という意見を表明して,リーナスさんとの間で熱い議論(flame war)を闘わせたことは語り草になっています。

もっとも,モノリシックカーネルは時代遅れな分,必要な機能や処理の詳細が十分検討され,実現が容易になっていたことも忘れてはならないでしょう。GNUプロジェクトではHurdというマイクロカーネルのデザインを採用したシステムを開発していますが,HurdはLinuxと同じころに開発が始まったものの,完成は大幅に遅れ現在も正式版のリリースには至っていません。

モジュールカーネル

モノリシックカーネルとして生まれ,開発の容易さから多数の開発者を集めることで急速に成長したLinuxですが,リーナスさんを始めとする開発者たちもモノリシックカーネルの問題点は熟知していました。一方,マイクロカーネルではカーネル外部のアプリケーション間の通信が多数発生するためにパフォーマンスが出にくいという問題点も明らかになってきました。そこでLinuxの開発者たちが採用したのは,両者の長所を組み合わせたモジュールカーネルというアプローチです。

LinuxがターゲットとしているPC互換機の場合,利用可能な周辺機器は膨大な種類に及びます。これら周辺機器を操作するためのドライバをすべてカーネルの実行ファイルに組み込むことは現実的ではありません。かと言って,新しい周辺機器を追加する度に実行ファイルを作り直すのも面倒な作業です。

そこでLinuxではこれら周辺機器用のドライバをモジュールとしてカーネル本体の実行ファイルとは独立に用意しておき,必要に応じてそれらをカーネル本体に動的に組み込むという方法を採用しました。

モジュールカーネルの場合,マイクロカーネルのようにOSの本質的な機能を分割してカーネル外部へ出すのではなく,必要な機能を担うモジュールをプラグイン的にカーネル本体に組み込むため,モノリシックカーネルの特徴である効率性は維持しつつ,マイクロカーネルの持つ拡張性も手に入れた形になっています。

当初,モジュール化に対応していたのは一部のデバイスドライバだけでしたが,次第にその範囲は広がり,最近のカーネルではネットワーク機能やファイルシステム,I/Oスケジューラといったカーネルの本質的な部分までモジュール化され,多くの機能を動的に追加したり削除したりすることが可能になっています。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたのが,いつの間にかミイラ取りがミイラになってOSSを仕事にするようになってしまいました。最近はスペシャリスト養成を目的とした専門職大学院で教壇に立ったりもしています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

  • ソフトウエア、OSの技術を定年後に勉強したい

     はじめまして、高橋良夫と申します。
     現役引退後のために、数年前よりLinuxを触り始めました、Plamoも試しことがあります。
     自宅では、IOデータの白箱(debian)でファイルサーバを稼働させ、ESXiまたはXenでのPC仮想化に興味を持ち、十分楽しんではおります。が残念ながら人まねの域を出ておらず、Install本の通りの操作は出来ても、それ以上のことには歯が立ちません。技術的にPoorなので基礎から勉強すべきと思います。
     今春で会社を引退し、本格的にOSの研究・開発の実践方法を考え始めてます。基礎技術の習得には大学での聴講が早道と思いますが、どこの大学で、どんな講義があって、何を得意としているか、などの情報があれば教えて頂けませんでしょうか?
     私は、横浜市内在住ですので、慶応の日吉校舎などは比較的通いやすいのですが、宜しく御願いします。

    Commented : #1  高橋良夫 (2009/03/26, 21:54)

コメントの記入