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

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

1.2.1. BIOS

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

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

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

1.2.2. ブートローダー

このセクションでは、x86プラットフォーム用のブートローダーについて 考察しています。システムのアーキテクチャーによって、ブートプロセスには 少々相違がありますので、x86以外のブートローダーについての概要は項1.2.2.1で御覧下さい。

Red Hat Linuxでは、2種類のブートローダーが利用できます: GRUB か又は LILOです。 GRUBがデフォルトのブートローダーですが、LILOもこれを必要な人又は、 好む人の為に利用可能です。 GRUB又はLILOの使用とその設定については 第2章を参照して下さい。

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

GRUBは、より新しいブートローダーでext2 と ext3[1]パーティションを読み込める優位性を持ち、その設定ファイル— /boot/grub/grub.conf—をブート時にロードします。 このファイルの編集法のついては項2.7を御覧下さい。

LILOでは、第2ステージブートローダーは、MBRの情報を使用してユーザーが 利用できるブートオプションを決定します。これは、設定の変更がされた場合や カーネルが手動で更新された場合などはいつも、MBRに適切な情報を書き込む為に /sbin/lilo -v -vコマンドが実行される必要があることを 意味します。その実践法については項2.8を参照して 下さい。

ティップヒント
 

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

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

注意注意
 

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

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

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

ブートローダーを使用してカーネルにコマンド行の引数を与える方法については 第2章を参照して下さい。GRUB 又は LILOでランレベルを変更 する方法については項2.10を御覧下さい。

ブートローダーは、それからinitrdと呼ばれる 適切な初期 RAMディスクイメージをメモリに配置 します。initrdはカーネルによってシステムのブートに 必要なドライバをロードするのに使用されます。これは、SCSIハードドライブが ある場合、又は、システムがext3ファイルシステムを使用する場合に特に 重要になります。 [2].

警告警告
 

いかなる理由があっても、ファイルシステムから/initrd/ ディレクトリを削除しないで下さい。このディレクトリを削除するとブート時に カーネルパニックエラーでシステムが停止する原因になります。

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

GRUB と LILOブートローダーのより詳しい概要については第2章を 御覧下さい。

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

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

例えば、Alphaアーキテクチャーはabootブートローダーを使用し、 ItaniumアーキテクチャーはELILOブートローダーを使用します。

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

1.2.3. カーネル

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

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

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

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

1.2.4. /sbin/initプログラム

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

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

initコマンドは、それぞれのSysV init ランレベルがどの様にセットアップするかが 記述してある/etc/inittabスクリプトを実行します。 [3] 他の作業も含めて、/etc/inittabはデフォルトの ランレベルを設定し、/sbin/updateが、あるランレベルが開始 される時には必ず実行するように指示します。 [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
K10psacct -> ../init.d/psacct
K12cWnn -> ../init.d/cWnn
K12FreeWnn -> ../init.d/FreeWnn
K12kWnn -> ../init.d/kWnn
K12mysqld -> ../init.d/mysqld
K12tWnn -> ../init.d/tWnn
K15httpd -> ../init.d/httpd
K15postgresql -> ../init.d/postgresql
K16rarpd -> ../init.d/rarpd
K20bootparamd -> ../init.d/bootparamd
K20iscsi -> ../init.d/iscsi
K20netdump-server -> ../init.d/netdump-server
K20nfs -> ../init.d/nfs
K20rstatd -> ../init.d/rstatd
K20rusersd -> ../init.d/rusersd
K20rwalld -> ../init.d/rwalld
K20rwhod -> ../init.d/rwhod
K24irda -> ../init.d/irda
K25squid -> ../init.d/squid
K28amd -> ../init.d/amd
K34dhcrelay -> ../init.d/dhcrelay
K34yppasswdd -> ../init.d/yppasswdd
K35atalk -> ../init.d/atalk
K35dhcpd -> ../init.d/dhcpd
K35smb -> ../init.d/smb
K35vncserver -> ../init.d/vncserver
K35winbind -> ../init.d/winbind
K40mars-nwe -> ../init.d/mars-nwe
K45arpwatch -> ../init.d/arpwatch
K45named -> ../init.d/named
K45smartd -> ../init.d/smartd
K46radvd -> ../init.d/radvd
K50netdump -> ../init.d/netdump
K50snmpd -> ../init.d/snmpd
K50snmptrapd -> ../init.d/snmptrapd
K50tux -> ../init.d/tux
K54pxe -> ../init.d/pxe
K55routed -> ../init.d/routed
K61ldap -> ../init.d/ldap
K65identd -> ../init.d/identd
K65kadmin -> ../init.d/kadmin
K65kprop -> ../init.d/kprop
K65krb524 -> ../init.d/krb524
K65krb5kdc -> ../init.d/krb5kdc
K70aep1000 -> ../init.d/aep1000
K70bcm5820 -> ../init.d/bcm5820
K74ntpd -> ../init.d/ntpd
K74ups -> ../init.d/ups
K74ypserv -> ../init.d/ypserv
K74ypxfrd -> ../init.d/ypxfrd
K84bgpd -> ../init.d/bgpd
K84ospf6d -> ../init.d/ospf6d
K84ospfd -> ../init.d/ospfd
K84ripd -> ../init.d/ripd
K84ripngd -> ../init.d/ripngd
K85zebra -> ../init.d/zebra
K90isicom -> ../init.d/isicom
K92ipvsadm -> ../init.d/ipvsadm
K95firstboot -> ../init.d/firstboot
S00microcode_ctl -> ../init.d/microcode_ctl
S05kudzu -> ../init.d/kudzu
S08ip6tables -> ../init.d/ip6tables
S08ipchains -> ../init.d/ipchains
S08iptables -> ../init.d/iptables
S09isdn -> ../init.d/isdn
S10network -> ../init.d/network
S12syslog -> ../init.d/syslog
S13portmap -> ../init.d/portmap
S14nfslock -> ../init.d/nfslock
S17keytable -> ../init.d/keytable
S20random -> ../init.d/random
S24pcmcia -> ../init.d/pcmcia
S25netfs -> ../init.d/netfs
S26apmd -> ../init.d/apmd
S28autofs -> ../init.d/autofs
S44acpid -> ../init.d/acpid
S55sshd -> ../init.d/sshd
S56rawdevices -> ../init.d/rawdevices
S56xinetd -> ../init.d/xinetd
S80sendmail -> ../init.d/sendmail
S80spamassassin -> ../init.d/spamassassin
S84privoxy -> ../init.d/privoxy
S85gpm -> ../init.d/gpm
S90canna -> ../init.d/canna
S90crond -> ../init.d/crond
S90cups -> ../init.d/cups
S90xfs -> ../init.d/xfs
S95anacron -> ../init.d/anacron
S95atd -> ../init.d/atd
S97rhnsd -> ../init.d/rhnsd
S99local -> ../rc.local
S99mdmonitor -> ../init.d/mdmonitor

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

各シンボリックリンクの名前は、Kか、 又はSで始まります。K リンクはそのランレベル上でキルされるプロセスで、 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 Webサーバを停止します。

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

注意注意
 

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デバイス[5]に対して開き、そのモードを設定、ログプロンプトを表示、ユーザー名の取得をして ユーザーの為にログインプロセスを開始します。

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

この時点で、システムはランレベル 5で動作しており、ログイン画面を 表示しています。

注意

[1]

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

[2]

initrd作成の詳細に関しては、Red Hat Linux カスタマイズガイドの 中のext3ファイルシステムの章を御覧下さい。

[3]

SysV initランレベルの詳細情報は項1.4で 御覧下さい。

[4]

updateコマンドは、変更されたバッファをディスクへ フラッシュバックするために使用されます。

[5]

ttyデバイスに関する詳細情報は項5.3.11で 御覧下さい