PC UNIXの起動と起動ファイルの解読

YAMAMORI Takenori ●yamamori

●initの起動からログインプロンプトまで(起動50%〜100%)

initが実行されると,今度はinitからrcスクリプトの実行が始まります. さっそくその様子を見て行きましょう.

○BSD系initとSysV系initの違い

initには,BSD系とSysV系(SVR4を含む)の2つの系統があり, それぞれ動作が異なります. FreeBSDのinitはもちろんBSD系initです. Linuxについては,SysV系の要素とBSD系の要素が混在していますが, 少なくともinitについてはSysV系となっています.

BSD系initには,/etc/rcというスクリプトのパスがハードコーディングされており, これによって/etc/rcが実行されます. 一方,SysV系initの場合は,ハードコーディングされているのは /etc/inittabというファイルであり,init自身は実はrcという名前さえ知りません. SysV系の場合,initの動作は/etc/inittabの記述によって定義されます. inittabには通常rcスクリプトの実行が記述されているため, 結果的にrcスクリプトが実行されているに過ぎないのです.

ところでSysV系のrcスクリプトというと,/etc/rc.d/rc3.dなどのディレクトリ以下に S10xxxx, S20xxxxなどのファイルに細かく分割されたスクリプトを, startの引数を付けて実行する方式を想像する方が多いと思います. しかし,SysV系initだからといって必ずしもそうする必要はありません. SysV系initの動作はあくまでもinittabの記述によるものです. たとえば,Slackware系Linux(Plamoなど)では, inittabの記述によって/etc/rc.d/rc.Mなどのスクリプトを実行するようになっており, どちらかというとBSD系のrcスクリプトに近いファイル構成になっています. 逆にFreeBSDでも,/etc/rcの中から/usr/local/etc/rc.dディレクトリなどの下にある 分割されたスクリプトを起動するという,SysV系の方式を一部取り入れています. これは,/etc/defaults/rc.confの中で,シェル変数local_startupをセットしている ところを見ればわかります.

○シングルユーザモードとランレベル

BSD系initには,動作モードとしてシングルユーザモードとマルチユーザモードの 2種類があります.通常のシステムの起動はマルチユーザモードです. 前述の通り,ブートローダのプロンプトで「boot -s」とオプションをつけて起動すると シングルユーザモードになります. シングルユーザモードは,システムのトラブル時やハードディスクのバックアップ などのメンテナンス時に用いられ,rcスクリプトは全く(または一部のみしか) 実行されません.したがって各種サービスを行なうデーモンなども起動せず, 「login:」のプロンプトも出ずに直接シェルが起動します. この時,OSの設定によってはセキュリティ上,rootのパスワードが要求されます.

そのほか,マルチユーザモードでの起動中にrcスクリプト上でエラーが発生し, 「exit 1」などのエラーコードで終了した場合もシングルユーザモードになります. シングルユーザモードでの作業が終了したら,シェルをexitで終了すると, そのままマルチユーザモードに移行するようになっています.

一方,SysV系initでは,これらのモードはランレベルという概念に拡張されています. ランレベルの内容は,inittabの記述によってどのようにも定義できますが, 通常は,ランレベル1がシングルユーザモード,ランレベル3がマルチユーザモードです. また,SysV系initでは,システムの再起動や停止の際にもランレベルの概念を用い, たとえばランレベル6はシステムの再起動となります.

ランレベル1では,inittabやrcスクリプトの記述により, 最終的にシェルが起動するように設定されています. これにより,BSD系と同様にシングルユーザシェルが起動されることになります.

なお,ランレベルの定義はOSによって若干異なり, たとえば,RedHat系Linuxではランレベル5でxdm系のグラフィカルログイン となるのに対し,Solarisではランレベル5でOSのシャットダウンになるという, 極端な違いがある場合もあります. そのほか,Solarisではinittabでの定義により, ランレベル3であっても,/etc/rc2.d以下も/etc/rc3.d以下も実行されるといった 設定が行なわれています.

また,SysV系のinitは,システム起動後にランレベルを切替えるためのコマンド として,「init 5」のようにランレベルを引数に付けて実行することもできます. (その意味ではtelinitコマンドを使うこともあります) BSD系のinitは,システム起動後にコマンドとして実行されることは本来はありません. ただし,FreeBSDのinitにはSysV系の要素も一部取り込まれており, たとえば「init 6」でリブートしたりすることも可能です.

○rcスクリプトの実行

以上のように,BSD系とSysV系の違いはあるものの, initはrcスクリプトを実行し,その中に記述されたシステムの初期化のための コマンドを実行したり,サービスを行なうためのデーモンを起動したりします. これらの動作は,人間にとってはシステムレベルの初期化に見えますが, カーネル自身にとってはあくまでユーザレベルの初期化であると考えられます.

rcスクリプトの一連の処理の中で,システムクロックの設定,ホスト名の設定, ファイルシステムのマウント,ifconfigによるネットワークインターフェイスの 立ち上げなど,システムの基本に関わる処理はより早い段階で行なわれます. 一方,たとえば(デーモンモードの)apacheとか, WnnやCannaなどの仮名漢字変換サーバなどのように, よりアプリケーションよりのものはrcスクリプト中の後ろに近いところで行なわれます.

○gettyやxdm系のログインプログラムの起動

OSの起動処理の最後は,下の図のような「login:」のプロンプトまたはxdm系の グラフィカルログイン画面を表示することです.

「login:」のプロンプトを出すのはgettyというプログラム (正確にはgettyから呼び出されるloginプログラム)で, rcスクリプトの実行終了後,およびシステム稼働中の必要なタイミングで initによって起動されます.なお,OSによってはgettyがmingettyまたはttymonなどに 置き換わっている場合があります.

●図 gettyによるテキストモードのログイン画面
getty.gif

gettyの起動のしくみはBSD系とSysV系では少々異なります. BSD系initでは,initが/etc/ttys(SunOS 4.xでは/etc/ttytab)というファイルを 参照し,その記述にしたがってgettyを起動します. (シリアル端末からのログインも,ここでの設定で有効になります) SysV系initの場合は,gettyの起動に関する部分もinittabに統合されており, inittabの記述にしたがってgettyが起動されます.

一方,グラフィカルログイン画面を表示するxdm系のプログラムには, X Window Systemに標準で付属する,シンプルな画面のxdmのほか, さらに機能が拡張されたwdm,gdm,あるいはSolarisに付属のdtloginなどがあります.

●図 xdm系のグラフィカルログイン画面(図はwdm)
wdm-s.gif

ところで,テキストで「login:」のプロンプトが出るコマンド行ログインと, Xサーバが立ち上がるグラフィカルログインとでは,見た目が全く異なり, エンドユーザの視点からは全く別のOSが起動したかのように思うかも知れません. しかし,これらの違いは単にxdm系のプログラムを起動しているかどうかの 違いに過ぎません.

xdm系のプログラムを起動するにはいろいろな方法が考えられ, 各OSによって異なる方法が用いられています. RedHat系Linuxでは,ランレベル3でテキストモードのログイン, ランレベル5でxdm系コマンドを起動しグラフィカルログインとなるように 設定されています. FreeBSDでは/etc/ttysにgettyとともにxdmを記述して起動するようになっています. (デフォルトでoff secureと書かれている行をon secureと修正すると xdmが起動します) つまり,FreeBSDではgettyと同じ次元のもとしてxdmを扱うことになります. Solarisでは/etc/rc2.d/S99dtloginというスクリプトによって グラフィカルログイン画面を起動しています.

以上のようにしてログイン画面が表示されれば, 一連のOSの起動処理はすべて完了したことになります.


To『PC UNIXの起動と起動ファイルの解読』[index]


このページは、技術評論社 「SoftwareDesign 2001年9月号、『起動ファイルから解読するPC UNIX』の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 [Home]
yamamori