ブートプロセスの始まりは使用しているハードウェアプラットフォームによって 異なりますが、カーネルが検出され、ブートローダーでロードされると、 その後はデフォルトのブートプロセスは全てのアーキテクチャーを通じて共通です。 この章ではx86アーキテクチャーに焦点を置いています。
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 がブートローダープログラムを見付けて、メモリにロードすると、ブートプロセスの制御はブートローダーに任せます。
このセクションでは、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 ステージブートローダーがメモリにロードされると、ブートするように設定されている異なるオペレーティングシステムやカーネルを表示したグラフィカル画面が現われます。この画面で、ユーザーは矢印キーを使用してブートしたいオペレーティングシステムまたはカーネルを選択し、
![]() | 注記 |
---|---|
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章を参照してください。
カーネルがロードしてブートプロセスをinitコマンドに渡すと、 全てのアーキテクチャーを通じて同じ工程の流れが起きます。 故に、各アーキテクチャーのブート プロセス間での主な相違は、カーネルを探してロードする アプリケーションにあります。
例えば、Itanium アーキテクチャーは ELILO ブートローダーを使用し、IBM eServer pSeriesアーキテクチャーは YABOOT を使用して、IBM eServer zSeriesとIBM S/390 システムは z/IPL ブートローダを使用します。
それぞれのプラットフォーム特有のブートローダー設定に関する情報は Red Hat Enterprise Linux インストールガイドを参照してください。
カーネルがロードされると、すぐにコンピュータのメモリを初期化して設定し、全てのプロセッサ、I/O サブシステム、記憶装置を含むシステムに接続されている各種ハードウェアを設定します。カーネルはそれからメモリ内の事前設定してある場所の圧縮されたinitramfsイメージを見付けて直接/sysroot/に展開し、全ての必要なドライバをロードします。次に LVM 又は ソフトウェア RAID などのファイルシステム関連の仮想デバイスを初期化して、その後 initramfsプロセスを完了し、ディスクイメージで使用されて いたメモリ領域を開放します。
カーネルはその後、ルートデバイスを作成し、読み込み専用のルート パーティションをマウントしてから、未使用のメモリを開放します。
この時点で、カーネルはメモリにロードされ、機能できます。しかし、ここではシステムに目的を持った入力ができるユーザーアプリケーションが何もないので、システムで何かを行なうことができません。
ユーザー環境をセットアップするため、カーネルは/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ファイルの内容に応じてgdm、kdm、xdmのいずれかになります。
完了すると、システムはランレベル 5で動作して、ログイン画面を表示します。
[1] | GRUBは、そのジャーナルファイルを無視して、ext3ファイルシステムを ext2として読み込みます。ext3ファイルシステムに関する詳細はRed Hat Enterprise Linux システム管理ガイドのext3 ファイルシステムの章を参照してください。 |
[2] | ttyデバイスに関する詳細情報は項5.3.11を参照してください |
[3] | ディスプレイマネージャについての詳細は、項7.5.2 を参照してください。 |