UNIXな生活
更新:2002/12/5  
Linuxな生活  FreeBSDな生活
 Solarisな生活
 JAVAな生活
 Practical use
 掲示版
LinuxがBootする仕組み

まずPCの電源を入れて、ログイン画面が出るまでを大まかに追って行きます。

1.PCの電源ONでBIOSがロードされ、ハードのセルフテストを実行したあと、指定された起動ドライブの先頭にある マスターブートレコード(MBR)を読みこみます。

2.MBR内のブートローダーがロードされます。

3.ブートローダーで指定されたOSをロードします。
ここではじめてLinuxに起動プロセスが渡ります。

4.Linuxの起動
ブートローダーで指定されたカーネルをロードします。
カーネルにより、メモリ、CPUなどのハードのチェックと初期化を実施します。
このあと、ルートファイルシステムのマウントをおこない、initプロセスを実行し、initプロセスは設定にした がってシステム(Linux)を初期化しログインプロンプトを表示します。

あっさり行きすぎましたので、もうすこし詳しく行きます。
わたしはRedHatLinux7.3を使用していますので、それを例に説明します。
まず、ブートローダーですが、RedHatLinux7.xではGRUBを使用しています。
このGRUBで選択されたOSをロードするんですが、GRUBの設定はこちらで見て下さい。
カーネルへのパラメータもここで指定します
GRUBの設定

つぎにカーネルがロードされたあとの、initプロセスの説明をします。
initプロセスは全てのプロセスの親プロセスになります。
pstreeコマンドでそのようすが確認できます。

$pstree

init-+-apmd
    |-atd
    |-battstat_applet
    |-bdflush
    |-cannaserver
    |-cardmgr
    |-crond
    |-deskguide_apple
    |-gconfd-1
    |-gdm---gdm-+-X
    |    `-gnome-session---Xsession---kinput2
    |-gedit
    |-gnome-name-serv
    |-gnome-smproxy
    |-gnome-terminal-+-bash---su---bash---pstree
    |    |-2*[bash]
    |    `-gnome-pty-helpe
    |-gpm
    |-httpd---7*[httpd]
    |-java---java---22*[java]
    |-jserver
    |-kapmd
    |-keventd
    |-khubd
************以下省略********

initプロセスの設定ファイルは、/etc/inittabで、内容は以下を見て下さい。

# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:5:initdefault:

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Things to run in every runlevel.
ud::once:/sbin/update

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon

例のごとく、#で始まる行はコメントです。
指定の書式は、id:runlevels:action:processです。

id=エントリの識別子。ユニークな文字列(1から4文字)
runlevels=ランレベルを1から6まで指定、2345など複数選択可
action=プロセスの起動または終了時の動作
    respawn=指定されたプロセスを起動、プロセスが終了したら再起動する。
    wait=指定されたプロセスを起動し、終了をまつ。
    once=指定したランレベルに移行後に1度だけ実行
    initdefault=デフォルトのランレベルの設定
    sysinit=ブート時の実行プロセス
    powerfail=UPS電源切断を検出したときの実行プロセス
    powerokwait=UPS電源ONを検出したときの実行プロセス
    ctrlaltdel=[Ctrl]+[Alt]+[Delete]キーが押されたときの時の動き
process=起動するプログラム

最初に設定されているのが、id:5:initdefault:で、デフォルトランレベルを設定しています。
この5という数字のところを変更することにより、起動時のデフォルトランレベルを変更できます。

*デフォルトランレベルとは?
initの動作モードで、0から6の数字で表されます。
RedHatLinuxの場合は、
0=停止
1=シングルユーザーモード
2=NFSを使用しないテキストログインモード(マルチユーザーモード)
3=テキストログインモード(マルチユーザーモード)
4=未使用?
5=GUIログインモード(マルチユーザーモード)
6=再起動


次に設定されているのが、si::sysinit:/etc/rc.d/rc.sysinitです。
この設定で/etc/rc.sysinitが実行されます。
rc.sysinitスクリプトはシステムの初期化を担当していて、ハードのチェックや初期化、ファイルシステムの マウントなどを行ないます。
rc.sysinitもスクリプトですから、中を見れば何をしているか大体分かると思いますが、ざっとこんな内容です。
    * ネットワークの初期化
    * ホスト名の設定
    * Welcomeバナーの表示
    * /procファイルシステムのマウント
    * カーネルパラメータの設定
    * クロックの設定
    * keymapの読み込み
    * システムフォントの読み込み
    * スワップの有効化
    * USBの初期化
    * 必要に応じてfsckの実行
    * quotaの有効化
    * ハードディスクパラメータの設定
    * カーネルモジュールの読み込み
    * RAIDデバイスの組み込み
    * ファイルシステムのマウント


次は/etc/rc.d/rcスクリプトが実行されます。これは最初にid:5:initdefault:で設定されたデフォルトランレベルを引数にして、該当する/etc/rc.d/rcデフォルトランレベルの数字.d内のスクリプト(システムサービス[デーモン]の起動と停止)を実行します。
この例では、id:5:initdefault:ですから、/etc/rc.d/rc5.d内のスクリプトが実行されることになります。
rc*.d内は以下のリンク先で説明してあります。ちなみに/etc/rc.localはこの中で読みこまれます。

rc*.dの設定

途中は飛ばして、# Run gettys in standard runlevels以下の設定を見て下さい。
ここでは、mingetty(ログインプロンプトを表示する)のプロセスを立ち上げています。
書式はid:runlevels:action:processですから、あてはめてみましょう。
idの決め方、mingettyは6行指定があります。当然idはそれぞれユニークな数字になります。
runlevelsでは、2345の指定があります。すなわち、ランレベル2から5の時に、これを実行します。
actionでは、respawnが指定してあります。これはプロセスが終了したときに再起動すると言う指定です。
processでは、/usr/sbin/mingetty tty数字と指定してあります。tty数字とは、/usr/sbin/mingettyコマンドの引数で、tty数字のデーモンとしてプロセスを立ち上げる指定です。

ちなみに、rcスクリプトのactionで指定されているwaitは、一回のみ実行しランレベルが変更されるまで読みこまれることはありません。(再起動すれば当然読みこまれます。)

最後に、ランレベルが5(GUIログインモード)だった場合に実行されるのが以下の行です。
x:5:respawn:/etc/X11/prefdm -nodaemon
ここで実行されているprefdmは、XのディスプレイマネージャーのXDMですが、オプションで-nodaemonが指定されています。

initの最後はログインプロンプトの表示ですから、ログインプロンプトが表示されるまでが、Linuxの起動プロセスと言うことになります。




Producted by Tomoya Sakurai