3. コンピュータの電源を入れた時に何が起こるのか?

プログラムが動いていないコンピュータは、役立たずな電子部品のかたまり にすぎません。電源を入れた際、コンピュータがまず最初に行うべきことは、 オペレーティングシステムと呼ばれる 特別なプログラムをスタートさせることです。オペレーティングシステムの 仕事は、コンピュータハードウェアの制御という極めて煩雑な処理をやってのける ことで、その他のプログラムの仕事を支援することです。

オペレーティングシステムを起動する処理のことは、ブート (boot) と呼ばれています(ブートとは、 もともと「編み上げ靴のつまみ革(bootstrap)」のことであり、靴のつまみ革を 引っ張って自分自身を持ち上げる(困難な事柄の例え)という言い方がオペレーティング システムの起動処理に似ていることから名付けられました)。ブートの手順は コンピュータチップのひとつである BIOS (Basic Input/Output System の略) に書き込まれているので、(オペレーティングシステムが起動する前でも) コンピュータはブート方法を知ることができるようになっています。

BIOS チップは、コンピュータに対して、ある決まった場所にある 特別のプログラムを探すように指示します。これは通常、一番若い番号が 付けられたハードディスク (ブートディスク (boot disk)) 上にある、ブートローダ (boot loader) とよばれる プログラムです (Linux 上では、このブートローダは LILO とよばれています)。 そして、ブートローダがメモリに読み込まれ、起動されます。ブートローダの仕事は、 オペレーティングシステムそのものを起動することです。

このローダによるオペレーティングシステムの起動というのは、 カーネルを探して、それをメモリにロードし、スタートさせることにより 実行されます。読者が Linux を起動すると、 スクリーンに "LILO" という文字と、 その後にドットがいくつか表示されるのが分かると思います。その時は、 ブートローダがカーネルをロードしているのです (ひとつのドットの表示は、 ディスクブロック (disk block) ひとつ分のカーネルコードがロードされたことを意味しています)。

(読者は、BIOS がなぜ直接カーネルをロードしないのか、なぜわざわざブート ローダを使って 2 段階の処理をするのかについて不思議に思うかもしれません。 これは、BIOS というのが、あまり賢くないからなのです。実際コイツはとても頭 が悪いので、ブートが終われば Linux は全く BIOS を使いません。BIOS はもともと ディスクもあまり積んでいない原始的な 8 ビット PC のために書かれたもので、 ディスクにアクセスしてカーネルを直接ロードするような処理は事実上できない のです。また、Unix では都合の悪いような作業があったとしても、ブートローダと いう処理過程を介在させることで、ディスク上の別の場所から異なる オペレーティングシステムを起動させることも可能になります。)

いったんカーネルが始動すると、カーネルは周辺装置の検出を行い、 ハードウェアを残らず認識して、プログラムを実行する準備を整えます。その際、 カーネルは、通常のメモリではなく、I/O ポート (I/O ports) という場所とやりとりをします。I/O ポートとは、特別なバス アドレスであり、デバイスコントローラカードはたいていこのポートを監視しながら カーネルからのコマンドを待っています。この時、カーネルは、I/O ポートを ランダムに探すわけではありません。どこを探せば何があるのか、コントローラ が存在する場合はどういう反応があるのかといった情報が、カーネルのなかに あらかじめぎっしりと組み込まれているからです。このプロセスは、 自動検出 (autoprobing) と呼ばれています。

起動時に表示されるメッセージのほとんどは、カーネルが I/O ポート経由で ハードウェアを自動検出しながら、どういった周辺機器が利用可能であるのかを 認識し、そのマシンの動作環境に適合していく過程で表示されるものです。Linux カーネルは、この機能が秀逸であり、他の大部分の Unix よりも優れていて、 DOS や Windows よりもずっと優秀です。実際、多くの Linux 古参ユーザの考えるところによると、(インストールを比較的容易にする)この 起動時の自動検出機能の出来の良さによって、Linux はフリーな Unix を作るという 一連の実験プロジェクトから抜け出て、膨大な数のユーザを一気に引きつけられる ようになったのだと言われています。

しかし、カーネルを完全にロードして実行することだけで、ブートプロセスが 終了するわけではありません。これはまだ、第一段階にすぎません(この段階は、 ランレベル 1 (run level 1) ともよばれてい ます)。第一段階が済むと、カーネルは、'init' と呼ばれる特別なプロセスに 制御を渡し、この 'init' プロセスが各種の管理プロセスを立ち上げます。

通常、この init プロセスは、最初の仕事として、まずディスクが正常か どうかの確認を行います。ディスクファイルシステムは繊細にできているので、 もしハードウェアの故障や突然の電源遮断などでダメージを受けていた場合は、 Unix が完全に立ち上がってしまう前に、ファイルシステム修復の作業が必要 です。これについては、後ほど、ファイルシステムが 壊れるというのはどういうことかの章で説明します。

init の次の仕事は、プリントスプーラ (print spooler)やメールサーバ、 WWW サーバといった、いくつかのデーモン (daemon) を起動することです。このデーモンというのは、バックグラウンドで地道に動きなが ら、仕事が与えられるのを待っているプログラムのことです。こうした特別の プログラムは、競合する複数のリクエストを上手に調整しつつ処理をしなければ ならないことがよくあります。そうしたプログラムがデーモンプログラムで あるのは、たいていその方がプログラムを書きやすいからです。ひとつの リクエストをひとつのプログラムが処理することにして、同じプログラムを同時に実行 しながら、相互に絶対に干渉しあわないように工夫するよりも、ひとつの プログラムだけが常時動いていて、すべてのリクエストを処理するように したほうが簡単だからです。どういった種類のデーモンが起動するのかは システムによって異なりますが、たいていの場合、少なくともプリントスプーラ (プリンタの門番をしているデーモン)は起動されていることと思われます。

さらに次の仕事は、ユーザのための準備作業です。init は、 getty とよばれるプログラムをスタートさせて、コンソール を監視します(もしくは、複数の getty を起動して、ダイヤルイン用のシリアル ポートも監視することがあります)。このプログラムは、コンソール上に login プロンプトを表示するものです。すべてのデーモンが 起動し、ターミナル毎に getty プロセスがスタートしたら、この時点で ランレベル 2 (run level 2) に入ったことになります。 ログインやプログラムの実行は、このランレベルにおいて、可能になります。

とはいえ、まだすべてが完了したわけではありません。次の仕事は、 ネットワーキング等のサービスをサポートする各種デーモンを起動 することです。そして、それらが終了すると、ランレベル 3 (run level 3) に入り、システムが完全に使える状態に なります。