コメ結び>基本操作からLinux入門
基本操作からLinux入門 | |
-1- | |
-
匿名さん 【Nlj3pbO】 2012/09/06 12:52:31
/etc/rc.d/rc
ランレベルに応じたスクリプトを自動実行します。/etc/rc.d/rcというシェルスクリプトに引数としてランレベル[N]を指定し、その値に対応する/etc/rc.d/rc[N].d以下にあるサービススクリプトを実行します。
/etc/inittabには以下が書かれています。
l0:0:wait:/etc/rc.d/rc 0 ~ l6:6:wait:/etc/rc.d/rc 6
例えばランレベル3の場合は、「/etc/rc.d/rc3.d/S*」のサービスが起動されます。「/etc/rc.d/rc3.d/K*」は停止のままになります。
S<優先度><サービス名>
K<優先度><サービス名>
「/etc/inittab」内容もみてみましょう!!
-
匿名さん 【Nlj3pbO】 2012/09/06 13:21:42
Linux起動の流れ
マシンの電源をオンにすると、BIOSが起動して制御をハードディスクのMBRなどに移管します。Linuxの場合、MBRに書き込まれているブートローダ(LILOやGRUB)を起動し、このブートローダからカーネルを呼び出すのが一般的です。今回、BIOSからカーネルの起動までには深入りしません。とにかく、何らかの方法でカーネルが動き出した後からを追うことにします。
カーネルが起動された後の流れを挙げると、
各種デバイスなどの初期化
initプログラムなどの起動
ブート時の処理
rcスクリプトの実行
といった処理が行われています。
-
匿名さん 【Nlj3pbO】 2012/09/06 13:27:23
デバイスなどの初期化
これは、カーネルに組み込まれた、あるいはモジュールとしてロードしたデバイスドライバを使って行います。各種デバイスの中には、電源投入直後の動作が不定と決まっているものがあります。いずれにしても、実際に利用する方法に合うように設定を変えなければなりません。例えば、シリアルポートなら通信速度、画面ならば表示モードといった部分です。
initプログラムなどの起動
Linux上のプログラムとして最初に実行されるのは、initプログラムです(編注)。initプロセスは、ps(ps ax)コマンドで必ずPIDが「1」と表示されます
Linux上で動くすべてのプログラムは、このinitプログラムから実行されます。ユーザーが実行するプログラムはシェルから実行されますが、そのシェルも元をたどればinitから実行されたプログラムです。そのため、親子関係になぞらえて「initはすべてのプロセスの親である」と表現したりします。
-
匿名さん 【Nlj3pbO】 2012/09/06 13:38:36
initがどのような処理をしているのかは、/etc/inittabを見れば分かります。このファイルは、initが行うべき処理を定義しているもので、各種confファイルのようなものだと考えればよいでしょう。
/etc/inittabには、initの実行から各種デーモンの起動を経て、ログインプロンプトが表示されるまでの処理が記述されているのが分かります。詳細は後述するとして、大まかな流れを挙げると、
ブート時の処理を行うスクリプトの実行
ランレベルに応じたスクリプトの実行
actionにwaitが指定されているので、スクリプトの実行が終了するまで待つ
端末制御
ログインプロンプトを出す。actionにrespawnが指定されているので、終了(ログオフ)された場合は再実行(ログインプロンプトを出力)する
といったことを行っています。
-
匿名さん 【Nlj3pbO】 2012/09/06 13:41:34
ブート時の処理
ブート時に/etc/rc.d/rc.sysinitというスクリプトを実行するようになっています。ざっとその内容を見ると、
ネットワークの初期化
ホスト名の設定
Welcomeバナーの表示
/procファイルシステムのマウント
カーネルパラメータの設定
クロックの設定
keymapの読み込み
システムフォントの読み込み
スワップの有効化
USBの初期化
必要に応じてfsckの実行
quotaの有効化
ハードディスクパラメータの設定
カーネルモジュールの読み込み
RAIDデバイスの組み込み
ファイルシステムのマウント
といった処理が行われています(編注)。これらの処理を行った後、指定されたランレベルに対応したrcスクリプト群を実行して、ログインプロンプトを出すことになります。
-
匿名さん 【Nlj3pbO】 2012/09/06 13:44:34
起動後の仕事
ブート完了後にinitが行うことは、親プロセスを持たなくなったプロセスと端末の制御があります。
プロセスは自分自身が_exitシステムコールを実行し、親プロセスがwait系システムコールを実行することで初めて終了します。ところが、何かの拍子に親プロセスが止まってしまったりすると、_exitしたまま永遠にwaitを待つことになります。こうしたプロセスを探して、本来の親プロセスに代わってwait系システムコールを実行するわけです。
端末制御は、/etc/inittabの記述に従って、各端末(仮想端末を含む)に標準入出力やエラー出力を割り当て、gettyと総称されるプログラムを起動します。このgetty(Red Hat Linux 7.2ではmingetty)がログインプロンプトを出し、ここでようやくユーザーがログインできるようになるわけです。