RC(8) FreeBSD システム管理者マニュアル RC(8)
名称
rc − 自動リブート処理とデーモン起動のためのコマンドスクリプト |
書式
rc |
rc.conf |
rc.conf.local |
rc.d/ |
rc.firewall |
rc.local |
rc.shutdown |
rc.subr |
解説 |
rc ユーティリティは、自動ブート処理を制御するコマンドスクリプトで、 init(8) に呼ばれます。 rc.local は特定サイトに特化したコマンドを記述する スクリプトです。今日では、典型的には /usr/local/etc/rc.d/ の機構が rc.local の代りに使用されます。しかしながら、 rc.local を使用したいのであ ればこれはまだサポートされています。この場合、 rc.local が /etc/rc.conf を読み取るようにしてから、あなたのシステム特有の更なるカスタムスタート アップコードを rc.local に追加してください。 rc.local を扱う最良の方法 は、これを rc.d/ スタイルのスクリプトとして分割して、これらを /usr/local/etc/rc.d/ に置くことです。 rc.conf ファイルはスタートアップス クリプト群から参照されるグローバルなシステム構成情報を持ち、 rc.conf.local はローカルなシステム構成情報を持ちます。更なる情報について は rc.conf(5) を参照してください。 rc.d/ ディレクトリは、ブート時およびシャットダウン時に自動的に実行される スクリプトを保持します。 |
rc の動作 |
1. /etc/rc.subr をソースし、様々な rc.subr(8) シェル関数を使えるようにロードします。
2. 自動ブート時には、 autoboot=yes を設定し、フラグ (rc_fast=yes) を有 効にすることで rc.d/ スクリプトが既に動作中のプロセスのチェックをし ないようにします (これによりブート処理を高速化します)。この rc_fast=yes による高速化は、シングルユーザシェルから抜けた後で rc が 起動されるときには使用されません。 3. rcorder(8) を起動し、 /etc/rc.d/ 中のファイルで ‘‘nostart’’ キーワー ド (rcorder(8) の −s フラグを参照) を持たないものを並び換え、結果を ある変数に代入します。 4. (rc.subr(8) の) run_rc_script() を使用し、各スクリプトを順番に呼び出 します。この関数は $1 を ‘‘start’’ に設定し、サブシェルにてスクリプ トをソースします。スクリプトに .sh サフィックスがある場合、スクリプ トは現在のシェルに直接ソースされます。 rc.shutdown の動作 1. /etc/rc.subr をソースし、様々な rc.subr(8) シェル関数を使えるように ロードします。 2. rcorder(8) を起動し、 /etc/rc.d/ 中のファイルで ‘‘shutdown’’ キー ワード (rcorder(8) の −k フラグを参照) を持つものを逆順に並び換え、 結果をある変数に代入します。 3. (rc.subr(8) の) run_rc_script() を使用し、各スクリプトを順番に呼び出 します。この関数は $1 を ‘‘stop’’ に設定し、サブシェルにてスクリプト をソースします。スクリプトに .sh サフィックスがある場合、スクリプト は現在のシェルに直接ソースされます。 rc.d/ の内容 ALLUPPERCASE NETWORKING SERVERS DAEMON LOGIN foo.sh bar if [ "$autoboot" = yes ]; then |
kill -TERM $$ |
fi これを使用することはかなり控えてください! 各スクリプトは rcorder(8) キーワード、特に適切な ‘‘PROVIDE’’ エントリと必 要に応じた ‘‘REQUIRE’’ および ‘‘BEFORE’’ のキーワードを含むべきです。 各スクリプトは少なくとも下記の引数を扱えることを期待されます。これらは、 run_rc_command() 関数を使用する場合には自動的にサポートされます: |
start
サービスを開始します。サービスが開始するよう rc.conf(5) で 指定されるか確認すべきです。また、サービスが既に実行中かど うか確認し、その場合にはサービス開始を拒否すべきです。シス テムが直接マルチユーザモードを起動する場合、ブート処理を高 速するために、標準の FreeBSD スクリプトは、後者の確認を行 いません。 forcestart が指定された場合、 rc.conf(5) の チェックは無視し、強制的に開始します。 stop restart status poll rcvar スクリプトが追加コマンドを実装する必要がある場合、 extra_commands 変数に それらを列挙し、コマンド名からなる変数にその動作を定義可能です (使用例節 を参照してください)。 /usr/local/etc/rc.d/ ディレクトリ内の古いスクリプトには、次の重要事項が適 用されます: • スクリプトは、 basename(1) がシェルグロブパターン *.sh にマッチし、実 行可能である場合のみ、実行されます。このディレクトリ中の他のファイル やディレクトリは、黙って無視されます。 • ブート時にスクリプトを実行するとき、文字列 ‘‘start’’ が、最初かつ唯一 の引数として渡されます。シャットダウン時には、文字列 ‘‘stop’’ が、最 初かつ唯一の引数として渡されます。すべての rc.d/ スクリプトは、これら 引数を適切に扱えるものであると期待されます。指定時に動作不要の場合 ( ブート時にもシャットダウン時にも)、スクリプトは成功裏に終了し、エラー メッセージを出力してはなりません。 • 各ディレクトリ内のスクリプトは、辞書順に処理されます。特定の順序が必 要な場合には、既存のファイル名の前に番号を付けると良いかもしれませ ん。例えば、 100.foo は 200.bar の前に実行されますが、番号を前に付け ないと逆の順番になります。 • 典型的な各スクリプトの出力は、1 個の空白文字の後に、起動または終了さ れたソフトウェアパッケージ名が続き、最後には改行文字は 付きません ( 使用例の節を見てください)。 興味深いスクリプト |
自動リブート処理の進行中、 rc は autoboot を引数として起動されます。 /etc/rc.d/ から起動されるスクリプトのひとつが /etc/rc.d/fsck です。このス クリプトは fsck(8) を −p および −F オプション付きで実行し、前回のシステム シャットダウンによる些細なディスク不整合を全て ‘‘修繕’’ し、ハードウェア あるいはソフトウェアの障害から生じた重大なディスク不整合を調べます。これ が失敗すると、ハードウェアもしくはソフトウェアの失敗により発生した重大な 矛盾の確認/修復は、ブート処理の最後にバックグラウンドで実行されます。 autoboot が設定されていない場合、例えばシングルユーザモードからマルチユー ザモードへ以降するとき、このスクリプトは何もしません。 rc.early スクリプトは、起動処理の非常に早い段階、すなわちファイルシステム チェックの直前に実行されます。 rc.early スクリプトは価値が低下していま す。このファイルの中のコマンドは、 rc.d/ スタイルスクリプトへ分割し、 rc システムに組み込むべきです。 /etc/rc.d/local スクリプトは複数の rc.d/ ディレクトリ中のスクリプトを実行 可能です。デフォルト位置は /usr/local/etc/rc.d/ と /usr/X11R6/etc/rc.d/ ですが、 local_startup rc.conf(5) 変数で上書き可能です。 /etc/rc.d/serial スクリプトは、シリアルデバイスの特殊な構成があればそれを 設定するために使用します。 /etc/rc.d/network* スクリプトは、ネットワークを起動するために使用します。 ネットワークの起動は複数パスで行われます。最初のパス /etc/rc.d/network1 は、ホスト名とドメイン名を設定し、ネットワークインタフェースを構成しま す。 /etc/rc.d/network2 スクリプトは、ルーティング開始し、ルーティングオ プションを設定します。 /etc/rc.d/network3 スクリプトは、追加のネットワー クオプションを設定します。最後に /etc/rc.d/network_ipv6 スクリプト は、IPv6 インタフェースとオプションを設定します。 rc.firewall スクリプトは、カーネルベースのファイアウォールサービスの規則 の設定に使用されます。 |
open
全入力を許可します。 /etc/rc.d/atm* スクリプトは、ATM ネットワークインタフェースを設定するため に使用されます。インタフェースは 3 つのパスで設定されます。第 1 のパスで は、インタフェースの初期設定をおこないます。第 2 のパスでは、インタフェー スの設定が終り、 PVC および永続的な ATMARP エントリを定義します。第 3 の パスでは、任意の ATM デーモンを起動します。 ネットワーク関連デーモンを含むほとんどのデーモンは、起動・停止・サービス の状態確認のために使用可能な自身のスクリプトを /etc/rc.d/ に持ちます。 例えば /etc/rc.d/apm 等のアーキテクチャ固有スクリプトは、デーモンの起動前 に、特に該当アーキテクチャ上であるのかを確認します。 伝統に従い、すべてのスタートアップファイルは /etc ディレクトリに置かれま す。 使用例 |
以下は最小の rc.d/ スタイルスクリプトです。ほとんどのスクリプトではこれに なんらかの追加が必要でしょう。 #!/bin/sh # # PROVIDE: foo # REQUIRE: bar_service_required_to_precede_foo # BEFORE: baz_service_requiring_foo_to_precede_it . /etc/rc.subr name="foo" rcvar=‘set_rcvar‘ command="/usr/local/bin/foo" load_rc_config $name run_rc_command "$1" スクリプトによっては追加機能を提供したいでしょう。追加コマンドを介するこ とで、この機能にアクセス可能です。スクリプトは、コマンドを必要なだけ列挙 し定義可能です。 #!/bin/sh # # PROVIDE: foo # REQUIRE: bar_service_required_to_precede_foo # BEFORE: baz_service_requiring_foo_to_precede_it . /etc/rc.subr name="foo" rcvar=‘set_rcvar‘ command="/usr/local/bin/foo" extra_commands="nop hello" hello_cmd="echo Hello World." nop_cmd="do_nop" do_nop() { |
echo "I do nothing." |
} load_rc_config $name ブート時にデーモンを起動し、シャットダウン時にこれを終了する、古いスタイ ルの /usr/local/etc/rc.d/ スクリプトの仮想的な例を示します。 #!/bin/sh - # # foobar パッケージの初期化/シャットダウンスクリプト case "$1" in start) |
/usr/local/sbin/foo -d && echo -n ’ foo’ |
||
;; |
stop) |
kill ‘cat /var/run/foo.pid‘ && echo -n ’ foo’ |
|
;; |
*) |
echo "unknown option: $1 - should be ’start’ or ’stop’" >&2 |
|
;; |
esac シャットダウン時には init(8) が全プロセスを終了させるので、明示的な kill(1) は不要ですが、これが含まれることが多いです。 |
関連ファイル
/etc/rc
/etc/rc.conf 関連項目 |
kill(1), rc.conf(5), init(8), rcorder(8), rc.subr(8), reboot(8), savecore(8) |
歴史
rc スクリプトは 4.0BSD で登場しました。 FreeBSD 10.0 November 4, 2002 FreeBSD 10.0 |