EN JA
RC(8)
RC(8) FreeBSD System Manager's Manual 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 を使用したいのであれば、これは、まだサポートされています。この場合、 /etc/rc.conf をソースする (読み込む) べきで、それは、利用者のシステム特有の追加されたカスタムスタートアップコードを含んでいます。しかしながら、 rc.local を取り扱う最良の方法は、これを rc.d/ スタイルのスクリプトとして分割して、それらを /usr/local/etc/rc.d/ の下に置くことです。 rc.conf ファイルは、スタートアップスクリプト群から参照されるグローバルなシステム構成情報を持ち、 rc.conf.local は、ローカルなシステム構成情報を持ちます。更なる情報については、 rc.conf(5) を参照してください。

rc.d/ ディレクトリは、ブート時およびシャットダウン時に自動的に実行されるスクリプトを保持します。

rc の操作

  1. 自動ブート時には、 autoboot= yes を設定し、フラグ ( rc_fast= yes) を有効にすることで rc.d/ スクリプトが既に動作中のプロセスのチェックをしないようにします (これによりブート処理を高速化します)。この rc_fast= yes による高速化は、シングルユーザシェルから抜けた後で rc が起動されるときには、使用されません。
  2. システムがディスクレスでブートするかどうか判断し、そうだとしたら、 /etc/rc.initdiskless スクリプトを実行します。
  3. 使用する様々な rc.subr(8) シェル関数をロードするために /etc/rc.subr をソースし (読み込み) ます。
  4. 設定ファイルをロードします。
  5. jail でブートしているかを確認し、“ nojail” (jail を許可しない) または“ nojailvnet” (vnet で有効にされた jail のみを許可する) を rcorder(8) でスキップするために「キーワード」のリストに追加します。
  6. ファイル ${firstboot_sentinel} が存在しないなら、“ firstboot”を rcorder(8) でスキップするために「キーワード」のリストに追加します。
  7. nostart”「キーワード」 ( rcorder(8)-s フラグを参照) を持たない /etc/rc.d/ 中のファイルの順序で rcorder(8) を起動します。
  8. ( rc.subr(8) の) run_rc_script() を使用し、各スクリプトを順番に呼び出します。この関数は、 $1 を“ start”に設定し、サブシェルにてスクリプトをソースします。スクリプトに .sh サフィックスがある場合、スクリプトは、現在のシェルに直接ソースされます。 $early_late_divider の値であるスクリプトが実行されたとき、処理を停止します。
  9. (新しくマウントされたファイルシステムに置かれた場合に) ファイル ${firstboot_sentinel} が存在するかどうかを確かめ、適切にスキップするために「キーワード」のリストを調節するために、再びチェックします。
  10. 今回、 $local_startup ディレクトリのスクリプトを含むように rcorder(8) を再実行します。 $early_late_divider までのすべてを無視して、次に、上で説明されるようにスクリプトの実行を開始します。
  11. ファイル ${firstboot_sentinel} が存在するなら、それを削除します。 (スクリプトによって作成されたので) ファイル ${firstboot_sentinel}-reboot も存在するなら、それを削除し、リブートします。

rc.shutdown の操作

  1. /etc/rc.subr をソースし、様々な rc.subr(8) シェル関数を使えるようにロードします。
  2. 設定ファイルをロードします。
  3. rcorder(8) を起動し、 /etc/rc.d/$local_startup ディレクトリ中のファイルで“ shutdown”「キーワード」 ( rcorder(8)-k フラグを参照) を持つものを逆順に並び換え、結果をある変数に代入します。
  4. ( rc.subr(8) の) run_rc_script() を使用し、各スクリプトを順番に呼び出します。この関数は、 $1 を“ stop”に設定し、サブシェルにてスクリプトをソースします。スクリプトに .sh サフィックスがある場合、スクリプトは、現在のシェルに直接ソースされます。

rc.d/ の内容

rc.d/ は、 /etc/rc.d/ にあります。次のファイル命名規則が現在 rc.d/ で使用されています:
ALLUPPERCASE
“プレースホルダ”スクリプトであり、ある動作が他の動作の前に実行されることを保証します。起動での順番では、次のものがあります:
NETWORKING
一般的なネットワーク設定を含んで、基本的なネットワークサービスが実行されることを保証します。
SERVERS
基本的なサービスは、下記の DAEMON によって必要とされるので、 ( named のような) 早期に開始されるサービスのために基本的なサービスが存在することを保証します。
DAEMON
lpdntpd といったすべての汎用デーモンの前のチェックポイントです。
LOGIN
ユーザログインサービス ( inetdsshd) およびユーザとしてコマンドを実行しうるサービス ( cronsendmail) の前のチェックポイントです。
foo.sh
サブシェルではなく現在のシェルにソースされるスクリプトは、 .sh サフィックスを持ちます。この使用には、非常に注意してください。スクリプトが停止してしまうと、起動シーケンスも停止してしまいますので。
bar
サブシェル内でソースされるスクリプト。そのようなスクリプトが 0 以外の状態で終わるなら、ブートは、停止しませんが、 ( rc.subr(8) から) stop_boot() 関数を呼び出すことによって、必要なら、スクリプトは、ブートを停止することができます。

各スクリプトは、 rcorder(8) キーワード、特に適切な“ PROVIDE”エントリと必要に応じた“ REQUIRE”および“ BEFORE”のキーワードを含むべきです。

各スクリプトは、少なくとも下記の引数を扱えることを期待されます。これらは、 run_rc_command() 関数を使用する場合には、自動的にサポートされます:

start
サービスを開始します。サービスが開始するよう rc.conf(5) で指定されるか確認すべきです。また、サービスが既に実行中かどうか確認し、その場合には、サービス開始を拒否すべきです。システムが直接マルチユーザモードを起動する場合、ブート処理を高速するために、標準の FreeBSD スクリプトは、後者の確認を行いません。 forcestart が指定された場合、 rc.conf(5) のチェックは、無視し、強制的に開始します。
stop
rc.conf(5) でサービス開始が指定されている場合、サービスを停止します。サービスが実際に動作していることを確認し、そうでない場合には、文句を言うべきです。 forcestop が指定された場合、 rc.conf(5) のチェックは、無視し、停止を試みます。
restart
stop を実行し、 start を実行します。
status
スクリプトが (1 度限りの動作ではなく) プロセスを起動する場合、プロセスの状態を表示します。そうでない場合、この引数をサポートする必要はありません。デフォルトは、(実行中のものがあれば) プログラムのプロセス ID を表示します。
poll
スクリプトが (1 度限りの動作ではなく) プロセスを起動する場合、コマンドの終了を待ちます。そうでない場合、この引数をサポートする必要はありません。
enabled
サービスが有効にされるなら、0 を返し、それがそうでないなら、1 を返します。このコマンドは、何も印刷 (表示) しません。
rcvar
サービスの起動にどの rc.conf(5) 変数が使用されたかを表示します (もしあれば)。

スクリプトが追加コマンドを実装する必要がある場合、 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 が設定されていない場合、例えばシングルユーザモードからマルチユーザモードへ以降するとき、このスクリプトは、何もしません。

/etc/rc.d/local スクリプトは、複数の rc.d/ ディレクトリ中のスクリプトを実行可能です。デフォルト位置は、 /usr/local/etc/rc.d/ を含んでいますが、これらは、 local_startup rc.conf(5) 変数で上書きすることができます。

/etc/rc.d/serial スクリプトは、シリアルデバイスの特殊な構成があればそれを設定するために使用します。

rc.firewall スクリプトは、カーネルベースのファイアウォールサービスの規則の設定に使用されます。

open
全入力を許可します。
client
このマシンのみを保護しようとします。
simple
全ネットワークを保護しようとします。
closed
lo0 以外の全 IP サービスを無効にします。
UNKNOWN
ファイアウォール規則のロードを無効にします。
filename
指定したファイル名の規則をロードします (フルパス指定が必要)。

/etc/rc.d/atm* スクリプトは、ATM ネットワークインタフェースを設定するために使用されます。インタフェースは、3 つのパスで設定されます。第 1 のパスでは、インタフェースの初期設定をおこないます。第 2 のパスでは、インタフェースの設定が終り、 PVC および永続的な ATMARP エントリを定義します。第 3 のパスでは、任意の ATM デーモンを起動します。

ネットワーク関連デーモンを含むほとんどのデーモンは、起動・停止・サービスの状態確認のために使用可能な自身のスクリプトを /etc/rc.d/ に持ちます。

例えば /etc/rc.d/apm 等のアーキテクチャ固有スクリプトは、デーモンの起動前に、特に該当アーキテクチャ上であるのかを確認します。

伝統に従い、すべてのスタートアップファイルは、 /etc ディレクトリに置かれます。

関連ファイル

/etc/rc
/etc/rc.conf
/etc/rc.conf.local
/etc/rc.d/
/etc/rc.firewall
/etc/rc.local
/etc/rc.shutdown
/etc/rc.subr
/var/run/dmesg.boot
rc プロセスの開始直後に dmesg(8) が結果を書き込みます。カーネル内の dmesg(8) バッファがもはやこの情報を保持していない場合に有用です。

使用例

以下は、最小の rc.d/ スタイルスクリプトです。ほとんどのスクリプトでは、これになんらかの追加が必要でしょう。

#!/bin/sh 
# 
 
# PROVIDE: foo 
# REQUIRE: bar_service_required_to_precede_foo 
 
. /etc/rc.subr 
 
name="foo" 
rcvar=foo_enable 
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=foo_enable 
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 
run_rc_command "$1"

シャットダウン時には、 init(8) が全プロセスを終了させるので、明示的な kill(1) は、不要ですが、これが含まれることが多いです。

歴史

rc ユーティリティは、 4.0BSD で登場しました。
October 19, 2013 FreeBSD