Linuxの起動プロセス

PCの電源を入れてから、Linuxが起動してログインコンソールが表示されるまでの起動プロセスを追って行きます。

ここでの環境は、CentOS-5を利用し記載しています。

 

起動プロセスの解説

大まかな起動の関する動作は以下の順番に実行されます。

 

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

 

2.MBR内のブートローダーがロードされ、GRUBが起動します。

 

3.GRUBで指定されたカーネルをロードし、Linuxの起動プロセスが実行されます。ここではじめてLinuxに起動プロセスが渡る事になります。

 

4.Linuxの起動

ブートローダーで指定されたカーネルをロードします。

カーネルにより、メモリ、CPUなどのハードのチェックと初期化を実施します。

このあと、ルートファイルシステムのマウントをおこない、initプロセスを実行します。initプロセスは設定にしたがってシステム(Linux)を初期化しログインプロンプトを表示します。

 

GRUB

GRUBとは、OSを起動する為のブートローダーでMBRから呼び出されて起動します。

GRUBはLinuxに限らずWindowsやその他UNIX系OSの起動が可能ですし、他のブートローダーを起動する事も可能です。

GRUBの設定ファイルは、/boot/grub/grub.confで、ここで起動に関する定義を行います。

以下にGRUBの設定ファイル例を示します。

default=0<---デフォルトの起動OSの指定、0から順番に指定
timeout=30<---grubのブートセレクト画面のタイムアウト時間(秒)
splashimage=(hd0,3)/grub/splash.xpm.gz
hiddenmenu

#Linux
title CentOS (2.6.18-164.15.1.el5xen)
	root (hd0,0)
	kernel /vmlinuz-2.6.18-164.15.1.el5 ro root=/dev/VolGroup00/LogVol00
	module /initrd-2.6.18-164.15.1.el5.img

title CentOS (2.6.18-53.1.4.el5)
	root (hd0,0)
	kernel /vmlinuz-2.6.18-53.1.4.el5 ro root=/dev/VolGroup00/LogVol00
	initrd /initrd-2.6.18-53.1.4.el5.img

#Windows <---/dev/hda2が"Windows"の場合
title Windows
	rootnoverify (hd0,1)
	chainloader +1

#Solaris <---/dev/hda3が"Solaris"の場合
title Solaris
	rootnoverify (hd0,2)
	chainloader +1

Linuxを起動する場合は、起動するカーネルイメージを選択します。

 

initプロセス

initプロセスは、Linuxシステムの初期化処理で、initプロセスは全てのプロセスの親プロセスになります。

これは、pstreeコマンドでそのようすが確認できます。

init─┬─acpid
     ├─atd
     ├─auditd─┬─audispd───{audispd}
     │        └─{auditd}
     ├─automount───4*[{automount}]
     ├─avahi-daemon───avahi-daemon
     ├─blktapctrl───{blktapctrl}
     ├─brcm_iscsiuio───3*[{brcm_iscsiuio}]
     ├─crond
     ├─dbus-daemon
     ├─dnsmasq
     ├─events/0
     ├─events/1
     ├─gpm
     ├─hald───hald-runner─┬─hald-addon-acpi
     │                    ├─hald-addon-keyb
     │                    └─hald-addon-stor
     ├─hidd
     ├─irqbalance
	--------------以下省略------------

initプロセスの設定ファイルは、/etc/inittabになります。この設定ファイルで、initプロセスの動作を定義します。

以下がinittabの中身です。

id:3: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

# 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
x:5:respawn:/etc/X11/prefdm -nodaemon

 

ランレベル

最初に設定されているのが、id:3:initdefault:で、デフォルトランレベルを設定しています。

この3という数字のところを変更することにより、起動時のデフォルトランレベルを変更できます。

CentOSなど、RedHat系Linuxでは、ランレベルの割当が以下のようになっています。

0=停止
1=シングルユーザーモード
2=NFSを使用しないテキストログインモード(マルチユーザーモード)
3=テキストログインモード(マルチユーザーモード)
4=未使用(予備)
5=GUIログインモード(マルチユーザーモード)
6=再起動

 

rc.sysinit

次に設定ファイルにあるのが、si::sysinit:/etc/rc.d/rc.sysinitです。

rc.sysinitはシステムの初期化を担当していて、ハードのチェックや初期化、ファイルシステムの マウントなどを行ないます。

rc.sysinitもスクリプトですから、中を見れば何をしているか大体分かると思いますが、ざっとこんな内容です。

ネットワークの初期化
ホスト名の設定
Welcomeバナーの表示
/procファイルシステムのマウント
カーネルパラメータの設定
クロック(時間)の設定
keymapの読み込み
システムフォントの読み込み
スワップの有効化
USBの初期化
必要に応じてfsckの実行
quotaの有効化
ハードディスクパラメータの設定
カーネルモジュールの読み込み
RAIDデバイスの組み込み
ファイルシステムのマウント

 

rc.dの実行

次は、デフォルトランレベルで指定された/etc/rc.d/内の該当するスクリプトを実行します。

例えば、ランレベルが3の場合は、/etc/rc.d/rc3.d/内のスクリプトが実行されます。

rc.dの設定については、起動デーモンの設定(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数字のデーモンとしてプロセスを立ち上げる指定です。

 

最下行はランレベルが5(GUIログインモード)だった場合に実行されるのが以下の行です。

x:5:respawn:/etc/X11/prefdm -nodaemon

ここで実行されているprefdmは、XのディスプレイマネージャーのXDMですが、オプションで-nodaemonが指定されています。

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

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <img localsrc="" alt="">