ブートプロセス、Init、およびシャットダウン

このセクションには、Red Hat Linux のブート時またはシャットダウン時に何が起こるのかに関する情報が含まれています。

ブートプロセスの裏側

コンピュータをブートすると、プロセッサはシステムメモリの最後部で BIOS (Basic Input/Output System) を検索し、実行します。BIOS プログラムは読み込み専用の不揮発メモリに書き込まれており、いつでも実行可能な状態になっています。BIOS は周辺機器に対する最低レベルのインタフェースを提供し、ブートプロセスの最初のステップを制御します。

BIOS はシステムをテストし、周辺機器の検索とチェックを行ない、ブート元のドライブを探します。通常、BIOS はフロッピードライブ (最近のシステムでは CD-ROM ドライブ) が存在するならばそれをチェックし、次にハードドライブ上を検索します。ハードドライブに関して、BIOS は先頭ハードドライブの先頭セクタから マスタブートレコード (MBR) の検索を開始し、MBR を起動します。

MBR は先頭のアクティブパーティションを探してパーティションのブートレコードを読み込みます。ブートレコードには、ブートローダ、すなわち LILO (LInux LOader) のロード方法に関する命令が含まれています。次に、MBR が LILO をロードすると、LILO がブートプロセスを引き継ぎます。

LILO は /etc/lilo.conf ファイルを読み込みます。このファイルには、構成するオペレーティングシステム (複数)、起動するカーネル、および自分自身のインストール先 (たとえば、ハードドライブの場合は /dev/hda) が記述されています。LILO は画面上に LILO: プロンプトを表示し、既定の時間の間 (lilo.conf にも設定されています)、ユーザの入力を待機します。LILO にオペレーティングシステムの選択肢を与えるように lilo.conf を設定してある場合は、この時点でブートしたい OS のラベルを入力することができます。

既定の時間 (一般には 5 秒) が経過した場合、LILO は lilo.conf ファイルの中に最初に登場するオペレーティングシステムをブートします。

Linux をブートする場合、LILO はまずカーネル、すなわち /boot ディレクトリ内にある vmlinuz ファイル (およびバージョン番号、たとえば vmlinuz-2.2.15-xx) をブートします。その後は、カーネルがブートプロセスを引き継ぎます。

カーネルはいくつかの場所で init (一般的な場所は /sbin) を検索し、最初に見つかった Init を実行します。init が引き継ぎます。

init は Linux システムを構成するすべてのプロセスを起動します (およびそれらのプロセスの親または親の親となります)。まず、Init は /etc/rc.d/rc.sysinit を実行します。これはパスの設定、必要に応じたネットワークのセットアップ、スワッピングの開始、ファイルシステムのチェックなどを実行します。基本的に、rc.sysinit は、システムの初期化時に行っておく必要のあるすべてのことを取り扱います。たとえば、ネットワークに接続したシステムの場合、rc.sysinit/etc/sysconfig/network ファイルおよび /etc/sysconfig/clock ファイルの情報を使用してネットワークプロセスとクロックを初期化します。初期化する必要のあるシリアルポートがある場合には、rc.serial が実行されることもあります。

init/etc/inittab ファイルを参照してその内容を実装します。/etc/inittab ファイルには、各ランレベルでシステムをどのようにセットアップするのかが記述され、デフォルトのランレベルが設定されています。このファイルには、ランレベルの開始時には必ず /etc/rc.d/rc/sbin/update を実行する必要があることが記述されています。

/sbin/update ファイルは、ゴミを含んだバッファをディスクへとフラッシュバックします。

ランレベルが変化すると、/etc/rc.d/rc は必ずサービスの起動と停止を行います。まず、rc はシステム用のソースファンクションライブラリを設定します (一般には /etc/rc.d/init.d/functions)。このライブラリには、プログラムを start/kill する方法、およびプログラムの PID の検索方法が記述されています。次に、rc ファイルは現在のランレベルと直前のランレベルを調査し、linuxconf に対して適当なランレベルを通知します。

rc ファイルはシステムが動作するために必要なバックグラウンドプロセスをすべて起動し、そのランレベル用の rc ディレクトリ(/etc/rc.d/rc<x>.d、ここで <x> は 0-6 の番号) を検索します。 rc/rc.d/ に含まれるすべての Kill スクリプト (ファイル名は K で始まります) を Kill します。次に、適当なランレベルディレクトリに含まれるすべての Start スクリプト (ファイル名は S で始まります) をすべて初期化します (したがってすべてのサービスとアプリケーションが正しく起動されます)。

たとえばランレベル 5 の場合、rc/etc/rc.d/rc5.d ディレクトリの中を調べると、rusersdrwalldrwhodmcservmars-nweapmd、および pcmcia を Kill する必要があることが判明します。ひどい障害が発生すると、rc は同じディレクトリの中を調べて、kmodnetworknfsfsrandomcsyslogatdcrondportmapsnmpdinetxntpdlpdnfs.rpmsavedhcpdypbindautofskeytablesendmailgpmsound、および smb.rpmsave に関する Start スクリプトを検索します。そして復活します。

/etc/inittab ファイルは、各ランレベル用の各仮想コンソール (ログインプロンプト) について getty プロセスをフォークします (ランレベル 2-5 は 6 個すべてを獲得します。シングルユーザモードであるランレベル 1 は、コンソールを一つだけ獲得します。ランレベル 0 と 6 は仮想コンソールを獲得しません)。/etc/inittab には、X ログオンマネージャである gdm をランレベル 5 で起動する必要があることも記述されています。

また、/etc/inittab には Ctrl-Alt-Delete/sbin/shutdown -t3 -r now コマンドのようなものに変換する方法も記述されています。最後に、/etc/inittab には、停電の場合にシステムがどうすべきなのかが記述されています。

この時点でログインプロンプトが表示されているはずです。これがすべてですが、ここまでにほんの 2、3 秒しか経過していません。

次に、/etc/sysconfig に含まれるファイルに関する情報について説明します。

Sysconfig の情報

以下の情報は、/etc/sysconfig に含まれる各種ファイル、その機能、および内容の概要を説明しています。

/etc/sysconfig に含まれるファイル

通常、以下のファイルは /etc/sysconfig の中で見つかります。

  • /etc/sysconfig/clock

  • /etc/sysconfig/hwconf (このファイルは編集してはいけません)

  • /etc/sysconfig/mouse

  • /etc/sysconfig/sendmail

  • /etc/sysconfig/apmd

  • /etc/sysconfig/init

  • /etc/sysconfig/keyboard

  • /etc/sysconfig/network

  • /etc/sysconfig/pcmica

  • /etc/sysconfig/soundcard (これは sndconfig によって書き込まれます)

一つずつ説明します。

/etc/sysconfig/clock

/etc/sysconfig/clock ファイルはシステムクロックから読み込んだ値の解釈方法を制御します。以前のリリースの Red Hat Linux は以下の値を使用していました (現在は重要視されません)。

  • CLOCKMODE=mode、ここで mode は以下のいずれかです。

    • GMT -- クロックを UTC に合わせて設定することを示します。

    • ARC -- Alpha のみ。ARC コンソールの「42-year time offset」が有効であることを示します。

現在のところ、正しい値は以下のものです。

  • UTC=boolean、ここで boolean は以下のものです。

    • true -- クロックを UTC に合わせて設定することを示します。その他の値は、クロックをローカル時間に合わせて設定することを示します。

  • ARC=boolean、ここで boolean は以下のものです。

    • ARC -- (Alpha ベースのシステムのみ) ARC コンソールの「42-year time offset」が有効であることを示します。その他の値は、通常の UNIX epoch を使用することを示します。

  • ZONE="ファイル名" -- /etc/localtime のコピー元である /user/share/zoneinfo の下にある zone ファイルを表します。例、

    ZONE="US/Eastern" 

/etc/sysconfig/hwconf

/etc/sysconfig/hwconf ファイルには、kudzu によって検出されたすべてのハードウェア、および使用するドライバ、ベンダ ID、およびデバイス ID 情報がリストされます。ユーザが編集するものではありません。編集すると、追加または削除されるものとしてデバイスが突然現れることがあります。

/etc/sysconfig/mouse

/etc/sysconfig/mouse ファイルは、利用可能なマウスに関する情報を指定するために使用されます。以下の値を使用することができます。

  • MOUSETYPE=type、ここで type は以下のいずれかです。

    • microsoft -- Microsoft マウス。

    • mouseman -- MouseMan マウス。

    • mousesystems -- Mouse Systems マウス。

    • ps/2 -- PS/2 マウス。

    • msbm -- Microsoft バスマウス。

    • logibm -- Logitech バスマウス。

    • atibm -- ATI バスマウス。

    • logitech -- Logitech マウス。

    • mmseries -- 古い MouseMan マウス。

    • mmhittab -- mmhittab マウス。

  • XEMU3=emulation、ここで emulation は以下のいずれかです。

    • yes -- 3 マウスボタンをエミュレートします。

    • no -- マウスにはすでに 3 つのボタンが付いています。

さらに、/dev/mouse は実際のマウスデバイスを指すシンボリックリンクです。

/etc/sysconfig/sendmail

/etc/sysconfig/sendmail を使用すれば、どのようなネットワークに対しても必要に応じてメッセージをルーティングし、一人または複数の受信者に対してメッセージを送信することができます。このファイルは sendmail プログラムを実行するためのデフォルト値を設定します。デフォルト値を使用した場合、このプログラムはバックグラウンドデーモンとして動作し、何かがバックアップされる場合に備えて、一時間に一度キューをチェックします。

以下の値を使用することができます。

  • DAEMON=answer、 ここで answer は以下のいずれかです。

    • yes -- Sendmail を設定する必要があります。yes-bd を意味します。

    • no -- Sendmail を設定する必要はありません。

  • QUEUE=1h これは sendmail に対して -q$QUEUE として与えられます。/etc/sysconfig/sendmail が存在し、かつ QUEUE が空または未定義の場合には、sendmail に対して -q オプションは与えられません。

/etc/sysconfig/apmd

/etc/sysconfig/apmd は、 apmd によって、サスペンド時またはレジューム時に何を起動/停止/変更するのかに関する設定として使用されます。このファイルは、使用ハードウェアが Advanced Power Management (apm) をサポートするか否か、またはユーザが apm を使用しない選択を行ったか否かにしたがって、スタートアップ時に apmd を有効化または無効化するようにセットアップされています。

/etc/sysconfig/init

/etc/sysconfig/init ファイルは、ブートアップ中にシステムが look する方法を制御します。

以下の値を使用することができます。

  • BOOTUP=<some bootup mode>、ここで <some bootup mode> は以下のいずれかです。

    • BOOTUP=color は新しい (Red Hat Linux 6.0 以降) ブート表示を意味します。

    • BOOTUP=verbose は古いスタイルのディスプレイを意味します。

    • その他の値は、新しい表示を意味します。ただし、ANSI フォーマットを除きます。

  • LOGLEVEL=<a number>、ここで <a number> によってカーネルに関する初期コンソールロギングのレベルを設定します。デフォルト値は 7 です。8 はすべてを意味します (デバッグを含む)。1 はカーネルパニックのみを意味します。 syslogd が起動した場合、この値は無効になります。

  • RES_COL=<a number>、ここで <a number> はステータスラベルを表示する画面上のカラムの位置です。デフォルト値は 60 です。

  • MOVE_TO_COL=<a command>、ここで <a command> によってカーソルが $RES_COL まで移動します。デフォルト値は、 echo -e による ANSI シーケンス出力です。

  • SETCOLOR_SUCCESS=<a command>、ここで <a command> によって、成功を表す色を設定します。デフォルト値は echo -e による ANSI シーケンス出力であり、色は緑に設定されます。

  • SETCOLOR_FAILURE=<a command>、ここで <a command> によって、失敗を表す色を設定します。デフォルト値は echo -e による ANSI シーケンス出力であり、色は赤に設定されます。

  • SETCOLOR_WARNING=<a command>、ここで <a command> によって、警告を表す色を設定します。デフォルト値は echo -e による ANSI シーケンス出力であり、色は黄色に設定されます。

  • SETCOLOR_NORMAL=<a command>、ここで <a command> によって、色を「ノーマル」に設定します。デフォルト値は、 echo -e による ANSI シーケンス出力です。

  • MAGIC_SYSRQ=an answer、ここで an answer は以下のいずれかです。

    • yes -- [magic sysrq] キーを有効化します。

    • no -- [magic sysrq] キー、および SPARC の Stop-A (シリアルコンソール上のブレーク) を無効化します。

  • PROMPT=an answer、ここで an answer は以下のいずれかです。

    • yes -- 対話モード用のキーチェックを有効化します。

    • no -- 対話モード用のキーチェックを無効化します。

/etc/sysconfig/keyboard

/etc/sysconfig/keyboard ファイルはキーボードの動きを制御します。以下の値を使用することができます。

  • KEYTABLE=file、ここで file はキーテーブルファイルの名前です。たとえば、KEYTABLE="/usr/lib/kbd/keytables/us.map"

  • KEYBOARD=sun|pc は SPARC 上でのみ使用されます。 sun は Sun キーボードが /dev/kbd 上に接続されていることを意味し、 pc は PS/2 ポート上に PS/2 キーボードが接続されていることを意味します。

/etc/sysconfig/network

/etc/sysconfig/network ファイルは、望ましいネットワーク設定に関する情報を指定するために使用されます。以下の値を使用することができます。

  • NETWORKING=answer、ここで answer は以下のいずれかです。

    • yes -- ネットワークを設定する必要があります。

    • no -- ネットワークを設定する必要はありません。

  • HOSTNAME=hostname、ここで hostname を FQDN (Fully Qualified Domain Name) とする必要があります。ただし、任意のホスト名とすることができます。

    注意注意
     

    インストールされている可能性のある古いソフトウェア (trn など) との互換性のために、/etc/HOSTNAME ファイルの中に、ここに示したものと同じ値を組み込む必要があります。

  • FORWARD_IPV4=answer、ここで answer は以下のいずれかです。

    • yes -- IP 転送を実行します。

    • no -- IP 転送を実行しません。

    (現在の Red Hat Linux インストールプロセスでは、デフォルトでこの値が [no] と設定されます [RFC に準拠するため]。ただし、 FORWARD_IPV4 をまったく設定しない場合は、Red Hat Linux のバージョン 4.2 以前で使用される設定ファイルとの互換性のために、転送が有効化されます。)

  • GATEWAY=gw-ip、ここで gw-ip はネットワークのゲートウェイの IP アドレスです。

  • GATEWAYDEV=gw-dev、ここで gw-dev はゲートウェイデバイスです (たとえば eth0)。

  • NISDOMAIN=dom-name、ここで dom-name は NIS ドメイン名です。

/etc/sysconfig/pcmcia

/etc/sysconfig/pcmcia ファイルは、PCMCIA 設定情報を指定するために使用されます。以下の値を使用することができます。

  • PCMCIA=answer、ここで answer は以下のいずれかです。

    • yes -- PCMCIA サポートを有効化する必要があります。

    • no -- PCMCIA サポートを有効化する必要はありません。

  • PCIC=pcic-type、ここで pcic-type は以下のいずれかです。

    • i82365 -- コンピュータには i82365-スタイルの PCMCIA ソケットチップセットが搭載されています。

    • tcic -- コンピュータには tcic-スタイルの PCMCIA ソケットチップセットが搭載されています。

  • PCIC_OPTS=option、ここで option はソケットドライバ (i82365 または tcic) のタイミングパラメータです。

  • CORE_OPTS=option、ここで optionpcmcia_core オプションの一覧です。

  • CARDMGR_OPTS=option、ここで option は PCMCIA cardmgr に関するオプションの一覧です (-q は quiet モード。-m はロード可能カーネルモジュールを指定したディレクトリ内で検索します。等々。詳細については cardmgr man ページを参照してください)。

/etc/sysconfig/soundcard

/etc/sysconfig/soundcard ファイルは sndconfig によって生成されるものなので、修正すべきではありません。/etc/rc.d/init.d/sound は、システムを適切にセットアップするためにこのファイルを使用します。このファイルの唯一の用途は、次回の sndconfig の実行時に、メニュー内でポップアップさせるデフォルトのカードエントリを決定することです。

以下の値を持つことができます。

  • CARDTYPE=<a card>、ここで <a card>CARDTYPE=SB16 などとなります。

/etc/sysconfig/network-scripts/ に含まれるファイル

通常、以下のファイルは /etc/sysconfig/network-scripts の中で見つかります。

  • /etc/sysconfig/network-scripts/ifup

  • /etc/sysconfig/network-scripts/ifdown

  • /etc/sysconfig/network-scripts/network-functions

  • /etc/sysconfig/network-scripts/ifcfg-<interface-name>

  • /etc/sysconfig/network-scripts/ifcfg-<interface-name>-<clone-name>

  • /etc/sysconfig/network-scripts/chat-<interface-name>

  • /etc/sysconfig/network-scripts/dip-<interface-name>

  • /etc/sysconfig/network-scripts/ifup-post

  • /etc/sysconfig/network-scripts/ifdhcpc-done

一つずつ説明します。

/etc/sysconfig/network-scripts/ifup/etc/sysconfig/network-scripts/ifdown

これらは、それぞれが /sbin/ifup および /sbin/ifdown へのシンボリックリンクです。このディレクトリにはこれら 2 つのみが含まれており、これらを直接コールする必要があります。つまり、この 2 つのスクリプトが必要に応じて他のスクリプトをコールします。これらのシンボリックリンクは、過去の資産のためにのみ存在します - おそらくこれらは将来のバージョンでは取り除かれます。したがって、現在では /sbin/ifup/sbin/ifdown のみを使用すべきです。

通常、これらのスクリプトは一つの引数をとして。デバイス名 (たとえば「eth0」)として。これらはブートシーケンス中に「boot」の 2 番目の引数によってコールされるため、この時点ではブート時に呼び出すつもりのないデバイス (ONBOOT=no、[下記参照]) を無視することができます。

/etc/sysconfig/network-scripts/network-functions

実際にはパブリックファイルではありません。スクリプトがインタフェースを呼び出したり終了させたりするために使用する機能が含まれています。特に、netreport を通じて代替インタフェース設定とインタフェース変更通知を処理するためのほとんどのコードが含まれています。

/etc/sysconfig/network-scripts/ifcfg-<interface-name>, /etc/sysconfig/network-scripts/ifcfg-<interface-name>-<clone-name>

最初のファイルでインタフェースを定義し、2 番目のファイルには「クローン」(または代替) インタフェースでは異なっている定義部分のみが含まれています。たとえば、ネットワーク番号が異なっても、その他はすべてが同じかもしれません。したがって、クローンファイルにはネットワーク番号のみが記述され、すべてのデバイス情報はベースの ifcfg ファイルの中に記述されます。

ifcfg ファイルで定義することのできる項目は、インタフェースのタイプによって異なります。

以下の値はすべてのベースファイルに共通しています。

  • DEVICE=name、ここで name は物理デバイスの名前です (動的にアロケートされる PPP デバイスの場合は、これが「論理名」となります)。

  • IPADDR=addr、ここで addr は IP アドレスです。

  • NETMASK=mask、ここで mask はネットマスクの値です。

  • NETWORK=addr、ここで addr はネットワークアドレスです。

  • BROADCAST=addr、ここで addr はブロードキャストアドレスです。

  • GATEWAY=addr、ここで addr はゲートウェイアドレスです。

  • ONBOOT=answer、ここで answer は以下のいずれかです。

    • yes -- このデバイスをブート時に有効化する必要があります。

    • no -- このデバイスをブート時に有効化する必要はありません。

  • USERCTL=answer、ここで answer は以下のいずれかです。

    • yes -- 非 root ユーザにこのデバイスの制御を許可します。

    • no -- 非 root ユーザにこのデバイスの制御を許可しません。

  • BOOTPROTO=proto、ここで proto は以下のいずれかです。

    • none -- ブート時プロトコルを使用する必要はありません。

    • bootp -- BOOTP プロトコルを使用する必要があります。

    • dhcp -- DHCP プロトコルを使用する必要があります。

以下の値はすべての PPP ファイルおよび SLIP ファイルに共通しています。

  • PERSIST=answer、ここで answer は以下のいずれかです。

    • yes -- モデムがハングアップした後に無効化される場合も含めて、常にこのデバイスをアクティブにしておく必要があります。

    • no -- このデバイスを常にアクティブにしておく必要はありません。

  • MODEMPORT=port 、ここで port はモデムポートのデバイス名です (たとえば、「/dev/modem」)。

  • LINESPEED=baud 、ここで baud はモデムの回線速度です (たとえば、「115200」)。

  • DEFABORT=answer、ここで answer は以下のいずれかです。

    • yes -- このインタフェースに関するスクリプトの作成/編集時にデフォルトのアボート文字列を挿入します。

    • no -- このインタフェースに関するスクリプトの作成/編集時にデフォルトのアボート文字列を挿入しません。

以下の値はすべての PPP ファイルに共通しています。

  • DEFROUTE=answer、ここで answer は以下のいずれかです。

    • yes -- このインタフェースをデフォルトの経路として設定します。

    • no -- このインタフェースをデフォルトの経路として設定しません。

  • ESCAPECHARS=answer、ここで answer は以下のいずれかです。

    • yes -- 事前定義された asyncmap を使用します。

    • no -- 事前定義された asyncmap を使用しません。

    (これは、単純なインタフェースを表しています。つまり、ユーザはエスケープすべき文字を指定する必要はありません。ただし、いずれにしてもほぼすべてのユーザは 00000000 の asyncmap を使用することができ、また必要であれば PPPOPTIONS を設定して任意の asyncmap を使用することができます。)

  • HARDFLOWCTL=answer、ここで answer は以下のいずれかです。

    • yes -- ハードウェアフロー制御を使用します。

    • no -- ハードウェアフロー制御を使用しません。

  • PPPOPTIONS=options、ここで options は任意のオプション文字列です。これはコマンドラインの末尾に配置されるので、その前に指定した他のオプション (たとえば asyncmap) を無効化することがあります。

  • PAPNAME=name、ここで namepppd コマンドライン上の「name $PAPNAMEの一部として使用されます。

    remotename」オプションが常に「ppp0」(以前に他の PPP デバイスが呼び出されている場合には、おそらく物理デバイス ppp1 となります) のような論理 PPP デバイス名として指定されることに注意してください。この場合には PAP/CHAP ファイルの管理が容易になります - 名前とパスワードの組が論理 PPP デバイス名と関連付けられるので、これらをまとめて管理することができます。

    原則的に、論理 PPP デバイス名を「ppp0」--「pppN」ではなく「worldnet」または「myISP」のようにすることを妨げるものはないはずです。

  • REMIP=addr、ここで addr はリモート IP アドレスです (通常は未指定)。

  • MTU=value、ここで value は MTU として使用する値です。

  • MRU=value、ここで value は MRU として使用する値です。

  • DISCONNECTTIMEOUT=value、ここで value は、正常に接続したセッションが終了した後で、接続を再確立するまでに待機する秒数を表します。

  • RETRYTIMEOUT=value、ここで value は、直前の試行が失敗した後で、接続の確立を再試行するまでに待機する秒数を表します。

/etc/sysconfig/network-scripts/chat-<interface-name>

このファイルは PPP 接続または SLIP 接続用のチャットスクリプトであり、接続の確立を目的としています。SLIP デバイスの場合には、DIP スクリプトがチャットスクリプトから作成されます。PPP デバイスの場合にはチャットスクリプトが直接使用されます。

/etc/sysconfig/network-scripts/dip-<interface-name>

この書き込み専用スクリプトは、netcfg によってチャットスクリプトから作成されます。このファイルを修正しないでください。将来的にはこのファイルがなくなって、チャットスクリプトから実行中に生成されるようになります。

/etc/sysconfig/network-scripts/ifup-post

このファイルは、ネットワークデバイス (SLIP デバイスを除く) が現れるとコールされます。/etc/sysconfig/network-scripts/ifup-routes をコールして、デバイスに依存する静的経路を設定します。そのデバイスのエイリアスを設定します。まだホスト名が設定されておらず、そのデバイスの IP に対するホスト名が見つかる場合には、ホスト名を設定します。ネットワークイベントの通知を要求した任意のプログラムに対して SIGIO を送信します。

拡張することで、ネームサービス設定の修正や、任意のスクリプトのコールなどこのファイルを必要に応じて実行することができます。

/etc/sysconfig/network-scripts/ifdhcpc-done

DHCP 設定が完了すると、このファイルは dhcpcd によってコールされます。このファイルは /etc/dhcpc/resolv.conf でドロップされたバージョン dhcpcd から /etc/resolv.conf をセットアップします。

System V init

このセクションでは、ブートプロセスの内面について簡単に説明します。マシンが SysV init を使用してブートする方法、および他の Linux のリリースで使用される initSysV init の違いを説明します。

init プログラムはブート時にカーネルによって実行されます。このプログラムは、ブート時に実行する必要のある、通常のすべてのプロセスの起動を担当します。それらのプロセスの中には、ログインを可能にする getty プロセス、NFS デーモン、FTP デーモン、およびマシンのブート時に実行させたいプロセスのすべてが含まれます。

Linux の世界において、急速に SysV init はブート時のソフトウェア起動を制御するものの標準となりつつあります。なぜならば、これは伝統的な BSD init よりも使いやすく強力かつ柔軟だからです。

設定ファイルが /etc 自体の中にあるのではなく、/etc のサブディレクトリの中にある点でも、SysV initBSD init と異なっています。/etc/rc.d の中には、 rc.sysinit および以下のディレクトリが見つかります。

init.d
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
        

init.d ディレクトリには各種のスクリプトが含まれています。基本的に、ブート時または別のランレベルに入る際に起動する必要のある可能性のある各サービスごとに、スクリプトが一つなければなりません。サービスの中には、ネットワーキング、nfssendmailhttpd、などが含まれます。一度だけ実行してその後終了する必要のある setserial などはサービスに含まれません。そのようなものは、rc.local または rc.serial の中に配置する必要があります。

rc.local が必要な場合、それは /etc/rc.d の中にあるはずです。あまり役には立ちませんが、これはほとんどのシステムに含まれています。ブート時にシリアルポート固有の作業を実行する必要がある場合には、rc.serial ファイルを /etc/rc.d に組み込むこともできます。

イベントのチェーンは以下のようになります。

デフォルトのランレベルは /etc/inittab で決定されます。先頭行の近くに以下のような行を挿入する必要があります。

id:3:initdefault:

ここで 2 番目のカラムを参照するとデフォルトのランレベルが 3 であることが分かります。変更したい場合は、/etc/inittab を手動で編集することができます。inittab ファイルを編集する際には十分注意してください。ミスをした場合には、リブートして以下を入力すれば修正することができます。

LILO boot:  linux single
        

こうすれば当然シングルユーザモードでブートするはずですから、inittab を再度編集して元の値に戻すことができます。

さて、どのようにして正しいスクリプトがすべて実行されるのでしょうか。rc3.d について ls -l と入力すると、以下のようなものが表示されます。

lrwxrwxrwx 1 root root 17 3:11 S10network -> ../init.d/network
lrwxrwxrwx 1 root root 16 3:11 S30syslog -> ../init.d/syslog
lrwxrwxrwx 1 root root 14 3:32 S40cron -> ../init.d/cron
lrwxrwxrwx 1 root root 14 3:11 S50inet -> ../init.d/inet
lrwxrwxrwx 1 root root 13 3:11 S60nfs -> ../init.d/nfs
lrwxrwxrwx 1 root root 15 3:11 S70nfsfs -> ../init.d/nfsfs
lrwxrwxrwx 1 root root 18 3:11 S90lpd -> ../init.d/lpd.init
lrwxrwxrwx 1 root root 11 3:11 S99local -> ../rc.local
        

ディレクトリの中に「実在の」ファイルがないことに気づくでしょう。そこにあるのは、init.d ディレクトリに含まれるいずれかのスクリプトに対するリンクです。リンクの先頭には「S」と番号が付いています。「S」はそのスクリプトを起動することを意味し、「K」は停止することを意味します。ファイル名に含まれる番号は、順序付けを目的としています。init は、サービスが登場する順序にしたがってすべてのサービスを起動します。番号が重複してもかまいませんが、少し混乱することになります。必要なサービスを起動または停止するには、2 桁の数字と大文字の「S」または「K」を使用するだけで済みます。

init はどのようにしてサービスの起動と停止を行うのでしょうか?簡単です。各スクリプトは一つの引数を受け付けるように作成されており、その引数を「start」および「stop」とすることができます。実際に、以下のようなコマンドを使用することで、それらのスクリプトを手動で実行することができます。
/etc/rc.d/init.d/httpd stop
これにより httpd サーバが停止されます。読み込んだ名前に「K」が付いていれば、init は「stop」という引数を持ったスクリプトをコールします。「S」が付いていれば、「start」という引数を持ったスクリプトをコールします。

なぜランレベルが必要なのでしょうか?多目的用にマシンをセットアップするための簡単な手段を望むユーザもいます。httpdsendmail、ネットワーキングなどのみを実行する「サーバ」ランレベルを持つことができます。また、gdm、ネットワーキングなどを実行する「ユーザ」ランレベルを持つこともできます。

Init ランレベル

一般に、Red Hat Linux はランレベル 3、すなわちフルマルチユーザモードで動作します。Red Hat Linux では以下のランレベルが定義されています。

  • 0 -- 停止

  • 1 -- シングルユーザモード

  • 2 -- マルチユーザモード、NFS なし

  • 3 -- フルマルチユーザモード

  • 4 -- 未使用

  • 5 -- フルマルチユーザモード (X-ベースのログイン画面を使用)

  • 6 -- リブート

/etc/inittab が間違っているためにマシンがブートできないような状況に陥った、または /etc/passwd が壊れたか、単純にパスワードを忘れたためにログインできないような状況では、LILO ブートプロンプトに対して linux single と入力して、シングルユーザモードでブートしてください。そうするとごく基本的なシステムがブートしてシェルが与えられるので、状況を修正することができます。

Initscript ユーティリティ

chkconfig ユーティリティは、/etc/rc.d ディレクトリ階層を保守するための単純なコマンドラインツールを提供します。このユーティリティがあるので、システム管理者は /etc/rc.d に含まれる多数のシンボリックリンクを直接操作しなくても済みます。

さらに、chkconfig のコマンドラインインタフェースとは対照的な、画面指向のインタフェースを提供する ntsysv ユーティリティもあります。

詳細については chkconfigntsysv に関する man ページを参照してください。

ブート時におけるプログラムの実行

ファイル /etc/rc.d/rc.local が実行されるのは、ブート時に他のすべての初期化処理が完了した後、およびランレベルを変更した後です。ここに追加の初期化コマンドを追加することができます。たとえば、追加のデーモンを起動したり、プリンタを初期化したいかもしれません。さらに、シリアルポートをセットアップする必要がある場合は、/etc/rc.d/rc.serial を編集すれば、ブート時に自動的に実行されるようになります。

デフォルトの /etc/rc.d/rc.local は、カーネルバージョンとマシンのタイプを含んだログインバナーを作成するだけです。

シャットダウン

Red Hat Linux をシャットダウンするには、shutdown コマンドを発行します。詳細は shutdown の man ページに記載されていますが、一般的な 2 つの使用法は以下のものです。

shutdown -h now
shutdown -r now

どちらでもシステムが綺麗にシャットダウンされます。すべてがシャットダウンした後で、-h オプションを使用した場合はマシンが停止し、-r オプションを使用した場合にはマシンがリブートします。

現在のところ、システムがランレベル 1-5 で動作している時に reboot および halt コマンドを使用すれば、 shutdown を呼び出すことができますが、すべての Linux 系システムがこの機能を持っている訳ではないので、そのような習慣を身につけるのは良いことではありません。