ブートプロセスの始まりは使用しているハードウェアプラットフォームによって 異なりますが、カーネルが検出され、ブートローダーでロードされると、 その後はデフォルトのブートプロセスは全てのアーキテクチャーを通じて共通です。 この章ではx86アーキテクチャーに焦点を置いています。
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がブートローダープログラムを見付けて、メモリに ロードすると、ブートプロセスの制御はブートローダーに任せます。
このセクションでは、x86プラットフォーム用のブートローダーについて説明していきます。 システムのアーキテクチャーによって、ブートプロセスには 若干の相違があります。 x86以外のブートローダーについての概要は項1.2.2.1を参照してください。
Red Hat Enterprise Linuxでは、2種類のブートローダーが利用できます。 GRUB か又は LILOです。 GRUBがデフォルトのブートローダーですが、LILOが必要な場合や、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 Networkの詳細はオンラインの サイト、URL:https://rhn.redhat.comで 御覧下さい。 |
第2ステージブートローダーがメモリにロードされると、ブートするように 設定されている異なるオペレーティングシステムやカーネルを表示したグラフィカル画面が現われます。 この画面で、ユーザーは矢印キーを使用してブートしたいオペレーティングシステムまたはカーネルを 選択し、
![]() | 注記 |
---|---|
SMP(Symmetric Multi-Processor)カーネルのサポートがインストールされている場合、 システムが始めてブートする時に複数のオプションが表示されます。この状況では、 LILOは、SMPカーネルであるlinuxと、シングル プロセッサ用のlinux-upを表示します。 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章を参照してください。GRUB 又は LILOのプロンプトで ランレベルを変更する方法については項2.10を参照してください。
ブートローダーは、それからinitrdと呼ばれる適切な初期 RAMディスクイメージをメモリに配置します。initrdは、カーネルによってシステムのブートに必要なドライバを ロードするのに使用されます。これは、SCSIハードドライブがある場合、又は、システムがext3ファイルシステムを使用する場合、特に重要になります [2]。
![]() | 警告 |
---|---|
いかなる理由があっても、ファイルシステムから/initrd/ ディレクトリを削除しないで下さい。このディレクトリを削除するとブート時に カーネルパニックエラーでシステムが停止する原因になります。 |
カーネルとinitrdイメージがメモリにロードされると ブートローダーはブートプロセスの制御をカーネルに託します。
GRUB と LILOブートローダーの更に詳しい概要については第2章を参照してください。
カーネルがロードしてブートプロセスをinitコマンドに渡すと、 全てのアーキテクチャーを通じて同じ工程の流れが起きます。 故に、各アーキテクチャーのブート プロセス間での主な相違は、カーネルを探してロードする アプリケーションにあります。
例えば、Alphaアーキテクチャーは aboot ブートローダーを使用し、 Itaniumアーキテクチャーは ELILO ブートローダーを使用、IBM pSeriesは YABOOT を使用、IBM s390 システムは z/IPL ブートローダを使用します。
それぞれのプラットフォーム特有のブートローダー設定に関する情報は Red Hat Enterprise Linux インストールガイドを参照してください。
カーネルがロードされると、すぐにコンピュータのメモリを初期化して設定し、 全てのプロセッサ、I/Oサブシステム、記憶装置を含むシステムに接続されている 各種ハードウェアを設定します。カーネルはそれからメモリ内の事前設定 してある場所の圧縮されたinitrdイメージを見付けて 展開し、マウントし、全ての必要なドライバをロードします。次にLVM 又は ソフトウェアRAIDなどのファイルシステム関連の仮想デバイスを初期化して、 その後initrdディスクイメージをアンマウントし、 ディスクイメージで使用されていたメモリ領域を空けます。
カーネルはその後、ルートデバイスを作成し、読み込み専用のルート パーティションをマウントしてから、未使用のメモリを開放します。
この時点で、カーネルはメモリにロードされ、機能できます。 しかし、 ここではシステムに目的を持った入力ができるユーザー アプリケーションが何もないので、 システムで何かを行なうことができません。
ユーザー環境をセットアップするため、カーネルは/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 のランレベルでどのようにセットアップされるべきか が記述されています[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 K10radiusd -> ../init.d/radiusd K12mysqld -> ../init.d/mysqld K15httpd -> ../init.d/httpd K15postgresql -> ../init.d/postgresql K16rarpd -> ../init.d/rarpd K20iscsi -> ../init.d/iscsi K20netdump-server -> ../init.d/netdump-server K20nfs -> ../init.d/nfs K20tomcat -> ../init.d/tomcat K24irda -> ../init.d/irda K25squid -> ../init.d/squid K28amd -> ../init.d/amd K34dhcrelay -> ../init.d/dhcrelay K34yppasswdd -> ../init.d/yppasswdd K35dhcpd -> ../init.d/dhcpd K35smb -> ../init.d/smb K35vncserver -> ../init.d/vncserver K35winbind -> ../init.d/winbind K36lisa -> ../init.d/lisa 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 K50vsftpd -> ../init.d/vsftpd K54pxe -> ../init.d/pxe 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 K74ntpd -> ../init.d/ntpd 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 K92ipvsadm -> ../init.d/ipvsadm K95firstboot -> ../init.d/firstboot S00microcode_ctl -> ../init.d/microcode_ctl 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 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 S59hpoj -> ../init.d/hpoj S80sendmail -> ../init.d/sendmail S85gpm -> ../init.d/gpm S90canna -> ../init.d/canna S90crond -> ../init.d/crond S90cups -> ../init.d/cups S90FreeWnn -> ../init.d/FreeWnn S90xfs -> ../init.d/xfs 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 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デバイス[5]に対して開き、そのモードを設定、ログインプロンプトを表示、ユーザーのユーザー名と パスワードを受け取りログインプロセスを開始します。
ランレベル 5では、/etc/inittabが/etc/X11/prefdmと 呼ばれるスクリプトを実行します。prefdmスクリプトは、好みの X ディスプレイマネージャを実行します [6]—/etc/sysconfig/desktopファイルの内容に応じてgdm、kdm、xdmのいずれかになります。
完了すると、システムはランレベル 5で動作しており、ログイン画面を表示しています。
[1] | GRUBは、そのジャーナルファイルを無視して、ext3ファイルシステムを ext2として読み込みます。ext3ファイルシステムに関する詳細はRed Hat Enterprise Linux システム管理ガイド のext3 ファイルシステムの章を参照してください。 |
[2] | initrd作成の詳細に関しては、Red Hat Enterprise Linux システム管理ガイドのext3ファイルシステムの章を参照してください |
[3] | SysV initランレベルの詳細情報は 項1.4を参照してください。 |
[4] | updateコマンドは、変更されたバッファをディスクへ フラッシュバックするために使用されます |
[5] | ttyデバイスに関する詳細情報は項5.3.11を参照してください |
[6] | ディスプレイマネージャについての詳細は、項7.5.2 を参照してください。 |