1.2. ブートプロセスの詳細

ブートプロセスの始まりは使用しているハードウェアプラットフォームによって 異なりますが、カーネルが検出され、ブートローダーでロードされると、 その後はデフォルトのブートプロセスは全てのアーキテクチャーを通じて共通です。 この章ではx86アーキテクチャーに焦点を置いています。

1.2.1. BIOS

x86コンピュータがブートされると、プロセッサはシステムメモリの最後部を見て Basic Input/Output System、いわゆるBIOS プログラムを探しそれを実行します。BIOSは、ブートプロセスの最初のステップだけでなく周辺機器への低レベルインターフェイスも提供します。この為、BIOSは読み込み専用の固定メモリとして書かれており、何時でも使用可能です。

他のプラットフォームは、x86システムの BIOS の働きとほぼ同じ様な低レベルタスクを演じるための別種のプログラムを使用します。例えば、Itanium ベースのコンピュータはEFI (Extensible Firmware Interface)シェル を使用します。

ロードされると、BIOSはシステムを検査し、周辺機器の検索とチェックを行い、システムをブートする為の有効なデバイスを見付けます。BIOS は通常、起動可能なメディアを求めて存在するフロッピィディスクドライブと CD-ROM ドライブを検査します。そしてそれがない場合、システムのハードドライブへと移動します。殆んどの場合、ブート過程でドライブを見て回る順序は BIOS で設定されておりそれがプライマリ IDE バス上のマスター IDE デバイスを見に行きます。BIOSはそこで、このデバイスの最初のセクターにあるマスターブートレコード、いわゆるMBRのプログラムをメモリにロードします。MBR は、サイズとしては512バイトしかなく、マシンをブートするためのブートローダーと呼ばれるマシンコード指示文とパーティションテーブルを一緒に含んでいます。BIOS がブートローダープログラムを見付けて、メモリにロードすると、ブートプロセスの制御はブートローダーに任せます。

1.2.2. ブートローダー

このセクションでは、x86プラットフォーム用のブートローダー、GRUB について説明します。システムのアーキテクチャーによって、ブートプロセスには若干の相違があります。 x86 以外のブートローダーについての概要は項1.2.2.1を参照してください。GRUB の設定と使用法に関する詳細は、章2章で御覧下さい。

x86 プラットフォーム用のブートローダーは、少なくとも2つのステージに分割されています。第1ステージは、MBR 上の小規模のマシンコードバイナリです。その唯一の仕事は第2ステージのブートローダーを見付けてその最初の部分をメモリにロードすることです。

GRUB には、ブート時に ext2 と ext3[1]のパーティションを読み込んで、その設定ファイル — /boot/grub/grub.conf—をロードできるという利点があります。このファイルの編集法ついては項2.7を参照してください。

ヒントヒント
 

Red Hat 更新 エージェントを使用してカーネルをアップグレードする場合は、ブートローダー設定ファイルは自動的に更新されます。Red Hat Networkの詳細はオンラインのサイト、URL:https://rhn.redhat.comで御覧下さい。

第2 ステージブートローダーがメモリにロードされると、ブートするように設定されている異なるオペレーティングシステムやカーネルを表示したグラフィカル画面が現われます。この画面で、ユーザーは矢印キーを使用してブートしたいオペレーティングシステムまたはカーネルを選択し、[Enter]キーを押します。何もキーを押さなければ、ブートローダーは、設定してある待ち時間が経過した後にデフォルトの選択をロードします。

注記注記
 

SMP(Symmetric Multi-Processor)カーネルのサポートがインストールされている場合、システムが始めてブートする時に複数のオプションが表示されます。この状況では、GRUBは、SMP カーネルであるRed Hat Enterprise Linux (<kernel-version>-smp)と、シングルプロセッサ用のRed Hat Enterprise Linux (<kernel-version>)を表示します。

SMPカーネルを使用中に何か問題が発生すれば、再起動して SMPカーネル以外を選択するようにします。

第2 ステージブートローダーは、ブートするカーネルを決定すると、次に /boot/ディレクトリ内の対応するカーネルバイナリを見付けます。このカーネルバイナリは以下の形式を使用して名前を付けています。 — /boot/vmlinuz- <kernel-version> ファイル(<kernel-version> はブートローダー設定に指定してあるカーネルバージョンに相当します)。

ブートローダーを使用してカーネルにコマンド行の引数を与える方法については 章2章を参照してください。ブートローダープロンプトで ランレベルを変更する方法については項2.8を 参照してください。

ブートローダーは、それから1つ又は複数の適切な initramfs イメージをメモリに配置します。次ぎにカーネルがこれらのイメージを cpio 経由で RAM ベースの仮想ファイルシステムである /boot/に対してメモリーから展開します。initramfs は、カーネルによってシステムのブートに必要なドライバをロードするのに使用されます。これは、SCSI ハードドライブがある場合、又は、システムが ext3 ファイルシステムを使用する場合、特に重要になります。

カーネルとinitramfsイメージがメモリにロードされるとブートローダーはブートプロセスの制御をカーネルに渡します。

GRUB ブートローダーの更に詳しい概要については章2章を参照してください。

1.2.2.1. 他のアーキテクチャー用ブートローダー

カーネルがロードしてブートプロセスをinitコマンドに渡すと、 全てのアーキテクチャーを通じて同じ工程の流れが起きます。 故に、各アーキテクチャーのブート プロセス間での主な相違は、カーネルを探してロードする アプリケーションにあります。

例えば、Itanium アーキテクチャーは ELILO ブートローダーを使用し、IBM eServer pSeriesアーキテクチャーは YABOOT を使用して、IBM eServer zSeriesとIBM S/390 システムは z/IPL ブートローダを使用します。

それぞれのプラットフォーム特有のブートローダー設定に関する情報は Red Hat Enterprise Linux インストールガイドを参照してください。

1.2.3. カーネル

カーネルがロードされると、すぐにコンピュータのメモリを初期化して設定し、全てのプロセッサ、I/O サブシステム、記憶装置を含むシステムに接続されている各種ハードウェアを設定します。カーネルはそれからメモリ内の事前設定してある場所の圧縮されたinitramfsイメージを見付けて直接/sysroot/に展開し、全ての必要なドライバをロードします。次に LVM 又は ソフトウェア RAID などのファイルシステム関連の仮想デバイスを初期化して、その後 initramfsプロセスを完了し、ディスクイメージで使用されて いたメモリ領域を開放します。

カーネルはその後、ルートデバイスを作成し、読み込み専用のルート パーティションをマウントしてから、未使用のメモリを開放します。

この時点で、カーネルはメモリにロードされ、機能できます。しかし、ここではシステムに目的を持った入力ができるユーザーアプリケーションが何もないので、システムで何かを行なうことができません。

ユーザー環境をセットアップするため、カーネルは/sbin/init プログラムを実行します。

1.2.4. /sbin/initプログラム

The /sbin/init プログラム (initとも 呼ばれます)がブートプロセスの残りを統制して、ユーザーの為の環境を設定します。

initコマンドがスタートする時、それは、システム上で自動的に起動するすべてのプロセスの親か、親の親になります。まず、/etc/rc.d/rc.sysinitスクリプトを実行します。これは環境パスの設定、スワッピングの開始、ファイルシステムのチェックなどを実行して、そしてシステム初期化に必要とされるすべてのステップを実行します。例えば、殆んどのシステムはクロックを使用しますので、rc.sysinit/etc/sysconfig/clockの設定ファイルを読み込んで、ハードウェアクロックを初期化します。もう1つの例としては、初期化されるべき特殊なシリアルポートプロセスがある場合、rc.sysinit/etc/rc.serialファイルを実行します。

initは、それから/etc/inittabスクリプトを実行し、これはシステムが各SysV init ランレベルで設定される方法を説明します。ランレベルとは、状態又はモード というべきもので SysV/etc/rc.d/rc<x> .d/ ディレクトリ内にリストされているサービスにより定義されます。(<x>はランレベルの数字です)。SysV init ランレベルに関する詳細は、項1.4 を参照して下さい。

次に、initコマンドはシステム用に、ソース機能ライブラリ、 /etc/rc.d/init.d/functionsをセットします。 これはプログラムのPIDをどのようにスタートするか、キルするか、決定するかを設定します。

init プログラムは /etc/inittab 内にデフォルトとして指定してあるランレベル用の適切なrc ディレクトリを調べて、すべてのバックグラウンドプロセスを開始します。rc ディレクトリはそれが代表するランレベルに相当する番号を付けています。例えば、/etc/rc.d/rc5.d/はランレベル 5 のディレクトリとなります。

ランレベル 5へブートする時、initプログラムは /etc/rc.d/rc5.d/ディレクトリ内を調べ、どの プロセスが開始と停止するのかを決定します。

以下に/etc/rc.d/rc5.d/ディレクトリの サンプル一覧を表示します:

K05innd -> ../init.d/innd
K05saslauthd -> ../init.d/saslauthd
K10dc_server -> ../init.d/dc_server
K10psacct -> ../init.d/psacct
K10radiusd -> ../init.d/radiusd
K12dc_client -> ../init.d/dc_client
K12FreeWnn -> ../init.d/FreeWnn
K12mailman -> ../init.d/mailman
K12mysqld -> ../init.d/mysqld
K15httpd -> ../init.d/httpd
K20netdump-server -> ../init.d/netdump-server
K20rstatd -> ../init.d/rstatd
K20rusersd -> ../init.d/rusersd
K20rwhod -> ../init.d/rwhod
K24irda -> ../init.d/irda
K25squid -> ../init.d/squid
K28amd -> ../init.d/amd
K30spamassassin -> ../init.d/spamassassin
K34dhcrelay -> ../init.d/dhcrelay
K34yppasswdd -> ../init.d/yppasswdd
K35dhcpd -> ../init.d/dhcpd
K35smb -> ../init.d/smb
K35vncserver -> ../init.d/vncserver
K36lisa -> ../init.d/lisa
K45arpwatch -> ../init.d/arpwatch
K45named -> ../init.d/named
K46radvd -> ../init.d/radvd
K50netdump -> ../init.d/netdump
K50snmpd -> ../init.d/snmpd
K50snmptrapd -> ../init.d/snmptrapd
K50tux -> ../init.d/tux
K50vsftpd -> ../init.d/vsftpd
K54dovecot -> ../init.d/dovecot
K61ldap -> ../init.d/ldap
K65kadmin -> ../init.d/kadmin
K65kprop -> ../init.d/kprop
K65krb524 -> ../init.d/krb524
K65krb5kdc -> ../init.d/krb5kdc
K70aep1000 -> ../init.d/aep1000
K70bcm5820 -> ../init.d/bcm5820
K74ypserv -> ../init.d/ypserv
K74ypxfrd -> ../init.d/ypxfrd
K85mdmpd -> ../init.d/mdmpd
K89netplugd -> ../init.d/netplugd
K99microcode_ctl -> ../init.d/microcode_ctl
S04readahead_early -> ../init.d/readahead_early
S05kudzu -> ../init.d/kudzu
S06cpuspeed -> ../init.d/cpuspeed
S08ip6tables -> ../init.d/ip6tables
S08iptables -> ../init.d/iptables
S09isdn -> ../init.d/isdn
S10network -> ../init.d/network
S12syslog -> ../init.d/syslog
S13irqbalance -> ../init.d/irqbalance
S13portmap -> ../init.d/portmap
S15mdmonitor -> ../init.d/mdmonitor
S15zebra -> ../init.d/zebra
S16bgpd -> ../init.d/bgpd
S16ospf6d -> ../init.d/ospf6d
S16ospfd -> ../init.d/ospfd
S16ripd -> ../init.d/ripd
S16ripngd -> ../init.d/ripngd
S20random -> ../init.d/random
S24pcmcia -> ../init.d/pcmcia
S25netfs -> ../init.d/netfs
S26apmd -> ../init.d/apmd
S27ypbind -> ../init.d/ypbind
S28autofs -> ../init.d/autofs
S40smartd -> ../init.d/smartd
S44acpid -> ../init.d/acpid
S54hpoj -> ../init.d/hpoj
S55cups -> ../init.d/cups
S55sshd -> ../init.d/sshd
S56rawdevices -> ../init.d/rawdevices
S56xinetd -> ../init.d/xinetd
S58ntpd -> ../init.d/ntpd
S75postgresql -> ../init.d/postgresql
S80sendmail -> ../init.d/sendmail
S85gpm -> ../init.d/gpm
S87iiim -> ../init.d/iiim
S90canna -> ../init.d/canna
S90crond -> ../init.d/crond
S90xfs -> ../init.d/xfs
S95atd -> ../init.d/atd
S96readahead -> ../init.d/readahead
S97messagebus -> ../init.d/messagebus
S97rhnsd -> ../init.d/rhnsd
S99local -> ../rc.local

この一覧に表示されているように、実際にサービスを開始や停止をするスクリプトはどれも /etc/rc.d/rc5.d/ ディレクトリにはありません。むしろ、/etc/rc.d/rc5.d/ 内のファイル全ては/etc/rc.d/init.d/ ディレクトリ内に位置してあるスクリプトを指すシンボリックリンクなのです。シンボリックリンクは各rcディレクトリ内に使用され、それらが参照するスクリプトに影響を与えることなく、それらを作成、修正、削除したりしてランレベルを再構成できるようにします。

各シンボリックリンクの名前は、Kか、又はSで始まります。Kリンクはそのランレベル上でキル(kill)されるプロセスで、 Sで始まる物はスタートされます。

initコマンドは最初に、/etc/rc.d/init.d/ <command>stopコマンド(<command>は キルされるプロセス)を発行することにより、ディレクトリのK シンボリックリンクを停止します。そして/etc/rc.d/init.d/<command> startコマンドを発行してSシンボリック リンクを開始します。

ヒントヒント
 

システムがブートを完了した後は、rootとしてログインして同じスクリプトを実行し、 サービスの開始や停止を行うことができます。例えば、コマンド /etc/rc.d/init.d/httpd stopは Apache HTTP サーバー を停止します。

それぞれのシンボリックリンクは開始順を決定するために番号が付いています。サービスが開始、又は停止される順序は、この番号を変更することで変えることが出来ます。番号が低いとより早くスタートします。同じ番号を持つシンボリックリンク同士はアルファベット順に開始されます。

注記注記
 

initプログラムが実行する最後の役目の内の1つは /etc/rc.d/rc.localファイルです。このファイルは システムのカスタマイズに役に立ちます。rc.local ファイルの使用法についての詳細は項1.3を参照してください。

initコマンドがそのランレベルに適切なrcディレクトリを通過すると、/etc/inittabスクリプトは、ランレベルに割り当てられた各仮想コンソール(ログインプロンプト)用に /sbin/mingettyプロセスをフォーク(分岐)します。ランレベル2から 5は 6つの仮想コンソールをすべて持ちますが、ランレベル1(シングルユーザーモード)は1つしか持たず、ランレベル 0 とランレベル 6は仮想コンソールがありません。/sbin/mingettyプロセスは通信経路をttyデバイス[2]に対して開き、そのモードを設定、ログインプロンプトを表示、ユーザーのユーザー名とパスワードを受け取ってからログインプロセスを開始します。

ランレベル 5では、/etc/inittab/etc/X11/prefdmと 呼ばれるスクリプトを実行します。prefdmスクリプトは、好みの X ディスプレイマネージャを実行します [3]/etc/sysconfig/desktopファイルの内容に応じてgdmkdmxdmのいずれかになります。

完了すると、システムはランレベル 5で動作して、ログイン画面を表示します。

注記

[1]

GRUBは、そのジャーナルファイルを無視して、ext3ファイルシステムを ext2として読み込みます。ext3ファイルシステムに関する詳細はRed Hat Enterprise Linux システム管理ガイドext3 ファイルシステムの章を参照してください。

[2]

ttyデバイスに関する詳細情報は項5.3.11を参照してください

[3]

ディスプレイマネージャについての詳細は、項7.5.2 を参照してください。