.\" Copyright (c) 1980, 1991, 1993 .\" The Regents of the University of California. All rights reserved. .\" .\" Portions of this manual page are Copyrighted by .\" The NetBSD Foundation. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. All advertising materials mentioning features or use of this software .\" must display the following acknowledgement: .\" This product includes software developed by the University of .\" California, Berkeley and its contributors. .\" 4. Neither the name of the University nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" .\" @(#)rc.8 8.2 (Berkeley) 12/11/93 .\" %FreeBSD: src/share/man/man8/rc.8,v 1.25.2.1 2004/10/10 09:50:52 mtm Exp % .\" .\" $FreeBSD$ .\" .Dd November 4, 2002 .Dt RC 8 .Os .Sh 名称 .Nm rc .Nd 自動リブート処理とデーモン起動のためのコマンドスクリプト .Sh 書式 .Nm .Nm rc.conf .Nm rc.conf.local .Nm rc.d/ .Nm rc.firewall .Nm rc.local .Nm rc.shutdown .Nm rc.subr .Sh 解説 .Nm ユーティリティは、 自動ブート処理を制御するコマンドスクリプトで、 .Xr init 8 に呼ばれます。 .Nm rc.local は特定サイトに特化したコマンドを記述するスクリプトです。 今日では、典型的には .Pa /usr/local/etc/rc.d/ の機構が .Nm rc.local の代りに使用されます。 しかしながら、 .Nm rc.local を使用したいのであればこれはまだサポートされています。 この場合、 .Nm rc.local が .Pa /etc/rc.conf を読み取るようにしてから、 あなたのシステム特有の更なるカスタムスタートアップコードを .Nm rc.local に追加してください。 .Nm rc.local を扱う最良の方法は、これを .Nm rc.d/ スタイルのスクリプトとして分割して、これらを .Pa /usr/local/etc/rc.d/ に置くことです。 .Nm rc.conf ファイルはスタートアップスクリプト群から 参照されるグローバルなシステム構成情報を持ち、 .Nm rc.conf.local はローカルなシステム構成情報を持ちます。 更なる情報については .Xr rc.conf 5 を参照してください。 .Pp .Nm rc.d/ ディレクトリは、ブート時およびシャットダウン時に 自動的に実行されるスクリプトを保持します。 .Ss Nm No の動作 .Bl -enum .It .Pa /etc/rc.subr をソースし、様々な .Xr rc.subr 8 シェル関数を使えるようにロードします。 .It 自動ブート時には、 .Va autoboot Ns = Ns Li yes を設定し、フラグ .Pq Va rc_fast Ns = Ns Li yes を有効にすることで .Nm rc.d/ スクリプトが既に動作中のプロセスのチェックをしないようにします (これによりブート処理を高速化します)。 この .Va rc_fast Ns = Ns Li yes による高速化は、シングルユーザシェルから抜けた後で .Nm が起動されるときには使用されません。 .It .Xr rcorder 8 を起動し、 .Pa /etc/rc.d/ 中のファイルで .Dq Li nostart キーワード .Xr ( rcorder 8 の .Fl s フラグを参照) を持たないものを並び換え、結果をある変数に代入します。 .It .Xr ( rc.subr 8 の) .Fn run_rc_script を使用し、各スクリプトを順番に呼び出します。 この関数は .Va $1 を .Dq Li start に設定し、サブシェルにてスクリプトをソースします。 スクリプトに .Pa .sh サフィックスがある場合、スクリプトは現在のシェルに直接ソースされます。 .El .Ss Nm rc.shutdown の動作 .Bl -enum .It .Pa /etc/rc.subr をソースし、様々な .Xr rc.subr 8 シェル関数を使えるようにロードします。 .It .Xr rcorder 8 を起動し、 .Pa /etc/rc.d/ 中のファイルで .Dq Li shutdown キーワード .Xr ( rcorder 8 の .Fl k フラグを参照) を持つものを逆順に並び換え、結果をある変数に代入します。 .It .Xr ( rc.subr 8 の) .Fn run_rc_script を使用し、各スクリプトを順番に呼び出します。 この関数は .Va $1 を .Dq Li stop に設定し、サブシェルにてスクリプトをソースします。 スクリプトに .Pa .sh サフィックスがある場合、スクリプトは現在のシェルに直接ソースされます。 .El .Ss Nm rc.d/ の内容 .Nm rc.d/ は .Pa /etc/rc.d/ にあります。 次のファイル命名規則が現在 .Nm rc.d/ で使用されています: .Bl -tag -width ".Pa ALLUPPERCASE" -offset indent .It Pa ALLUPPERCASE .Dq プレースホルダ スクリプトであり、ある動作が他の動作の前に実行されることを保証します。 起動での順番では次のものがあります: .Bl -tag -width ".Pa NETWORKING" .It Pa NETWORKING 基本的なネットワークサービスが起動することを保証します。 一般的なネットワーク設定 .Pq Pa network1 , network2 , network3 が含まれます。 .It Pa SERVERS 基本的なサービス .Pa ( NETWORKING , ppp-user , syslogd , isdnd 等) が起動することを保証します。 これらは、早期に開始する .Pa ( named などの) サービスのために存在します。 これらは後述の .Pa DAEMON に要求されています。 .It Pa DAEMON .Pa lpd や .Pa ntpd といったすべての汎用デーモンの前のチェックポイントです。 .It Pa LOGIN ユーザログインサービス .Pa ( inetd や .Pa sshd ) およびユーザとしてコマンドを実行しうるサービス .Pa ( cron や .Pa sendmail ) の前のチェックポイントです。 .El .It Pa foo.sh サブシェルではなく現在のシェルにソースされるスクリプトは .Pa .sh サフィックスを持ちます。 この使用には非常に注意してください。 スクリプトが停止してしまうと、起動シーケンスも停止してしまいますので。 .It Pa bar サブシェル内でソースされるスクリプト。 これらのスクリプトは必要ならば次のシェルコマンドで、ブートを停止できます: .Bd -literal -offset indent if [ "$autoboot" = yes ]; then kill -TERM $$ fi exit 1 .Ed .Pp これを使用することはかなり控えてください! .El .Pp 各スクリプトは .Xr rcorder 8 キーワード、特に適切な .Dq Li PROVIDE エントリと必要に応じた .Dq Li REQUIRE および .Dq Li BEFORE のキーワードを含むべきです。 .Pp 各スクリプトは少なくとも下記の引数を扱えることを期待されます。 これらは、 .Fn run_rc_command 関数を使用する場合には自動的にサポートされます: .Bl -tag -width ".Cm restart" -offset indent .It Cm start サービスを開始します。 サービスが開始するよう .Xr rc.conf 5 で指定されるか確認すべきです。 また、サービスが既に実行中かどうか確認し、 その場合にはサービス開始を拒否すべきです。 システムが直接マルチユーザモードを起動する場合、ブート処理を高速するために、 標準の .Fx スクリプトは、後者の確認を行いません。 .Cm forcestart が指定された場合、 .Xr rc.conf 5 のチェックは無視し、強制的に開始します。 .It Cm stop .Xr rc.conf 5 でサービス開始が指定されている場合、サービスを停止します。 サービスが実際に動作していることを確認し、 そうでない場合には文句を言うべきです。 .Cm forcestop が指定された場合、 .Xr rc.conf 5 のチェックは無視し、停止を試みます。 .It Cm restart .Cm stop を実行し、 .Cm start を実行します。 .It Cm status スクリプトが (1 度限りの動作ではなく) プロセスを起動する場合、 プロセスの状態を表示します。 そうでない場合、この引数をサポートする必要はありません。 デフォルトは、(実行中のものがあれば) プログラムのプロセス ID を表示します。 .It Cm poll スクリプトが (1 度限りの動作ではなく) プロセスを起動する場合、 コマンドの終了を待ちます。 そうでない場合、この引数をサポートする必要はありません。 .It Cm rcvar サービスの起動にどの .Xr rc.conf 5 変数が使用されたかを表示します (もしあれば)。 .El .Pp スクリプトが追加コマンドを実装する必要がある場合、 .Va extra_commands 変数にそれらを列挙し、 コマンド名からなる変数にその動作を定義可能です .Sx ( 使用例 節を参照してください)。 .Pp .Pa /usr/local/etc/rc.d/ ディレクトリ内の古いスクリプトには、次の重要事項が適用されます: .Pp .Bl -bullet .It スクリプトは、 .Xr basename 1 がシェルグロブパターン .Pa *.sh にマッチし、実行可能である場合のみ、実行されます。 このディレクトリ中の他のファイルやディレクトリは、黙って無視されます。 .It ブート時にスクリプトを実行するとき、文字列 .Dq Li start が、最初かつ唯一の引数として渡されます。 シャットダウン時には、文字列 .Dq Li stop が、最初かつ唯一の引数として渡されます。 すべての .Nm rc.d/ スクリプトは、これら引数を適切に扱えるものであると期待されます。 指定時に動作不要の場合 (ブート時にもシャットダウン時にも)、 スクリプトは成功裏に終了し、エラーメッセージを出力してはなりません。 .It 各ディレクトリ内のスクリプトは、辞書順に処理されます。 特定の順序が必要な場合には、 既存のファイル名の前に番号を付けると良いかもしれません。 例えば、 .Pa 100.foo は .Pa 200.bar の前に実行されますが、番号を前に付けないと逆の順番になります。 .It 典型的な各スクリプトの出力は、1 個の空白文字の後に、 起動または終了されたソフトウェアパッケージ名が続き、 最後には改行文字は .Em 付きません ( .Sx 使用例 の節を見てください)。 .El .Sh 興味深いスクリプト 自動リブート処理の進行中、 .Nm は .Cm autoboot を引数として起動されます。 .Pa /etc/rc.d/ から起動されるスクリプトのひとつが .Pa /etc/rc.d/fsck です。 このスクリプトは .Xr fsck 8 を .Fl p および .Fl F オプション付きで実行し、 前回のシステムシャットダウンによる些細なディスク不整合を全て .Dq 修繕 し、 ハードウェアあるいはソフトウェアの障害から生じた 重大なディスク不整合を調べます。 これが失敗すると、 ハードウェアもしくはソフトウェアの失敗により発生した重大な矛盾の確認/修復は、 ブート処理の最後にバックグラウンドで実行されます。 .Cm autoboot が設定されていない場合、 例えばシングルユーザモードからマルチユーザモードへ以降するとき、 このスクリプトは何もしません。 .Pp .Nm rc.early スクリプトは、起動処理の非常に早い段階、 すなわちファイルシステムチェックの直前に実行されます。 .Nm rc.early スクリプトは価値が低下しています。 このファイルの中のコマンドは、 .Nm rc.d/ スタイルスクリプトへ分割し、 .Nm システムに組み込むべきです。 .Pp .Pa /etc/rc.d/local スクリプトは複数の .Nm rc.d/ ディレクトリ中のスクリプトを実行可能です。 デフォルト位置は .Pa /usr/local/etc/rc.d/ と .Pa /usr/X11R6/etc/rc.d/ ですが、 .Va local_startup .Xr rc.conf 5 変数で上書き可能です。 .Pp .Pa /etc/rc.d/serial スクリプトは、 シリアルデバイスの特殊な構成があればそれを設定するために使用します。 .Pp .Pa /etc/rc.d/network* スクリプトは、ネットワークを起動するために使用します。 ネットワークの起動は複数パスで行われます。 最初のパス .Pa /etc/rc.d/network1 は、ホスト名とドメイン名を設定し、 ネットワークインタフェースを構成します。 .Pa /etc/rc.d/network2 スクリプトは、ルーティング開始し、ルーティングオプションを設定します。 .Pa /etc/rc.d/network3 スクリプトは、追加のネットワークオプションを設定します。 最後に .Pa /etc/rc.d/network_ipv6 スクリプトは、IPv6 インタフェースとオプションを設定します。 .Pp .Nm rc.firewall スクリプトは、 カーネルベースのファイアウォールサービスの規則の設定に使用されます。 .Pp .Bl -tag -width ".Ar filename" -compact -offset indent .It Cm open 全入力を許可します。 .It Cm client このマシンのみを保護しようとします。 .It Cm simple 全ネットワークを保護しようとします。 .It Cm closed lo0 以外の全 IP サービスを無効にします。 .It Cm UNKNOWN ファイアウォール規則のロードを無効にします。 .It Cm filename 指定したファイル名の規則をロードします (フルパス指定が必要)。 .El .Pp .Pa /etc/rc.d/atm* スクリプトは、ATM ネットワークインタフェースを設定するために使用されます。 インタフェースは 3 つのパスで設定されます。 第 1 のパスでは、インタフェースの初期設定をおこないます。 第 2 のパスでは、インタフェースの設定が終り、 PVC および永続的な ATMARP エントリを定義します。 第 3 のパスでは、任意の ATM デーモンを起動します。 .Pp ネットワーク関連デーモンを含むほとんどのデーモンは、 起動・停止・サービスの状態確認のために使用可能な自身のスクリプトを .Pa /etc/rc.d/ に持ちます。 .Pp 例えば .Pa /etc/rc.d/apm 等のアーキテクチャ固有スクリプトは、デーモンの起動前に、 特に該当アーキテクチャ上であるのかを確認します。 .Pp 伝統に従い、すべてのスタートアップファイルは .Pa /etc ディレクトリに置かれます。 .Sh 使用例 以下は最小の .Nm rc.d/ スタイルスクリプトです。 ほとんどのスクリプトではこれになんらかの追加が必要でしょう。 .Bd -literal -offset indent #!/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" load_rc_config $name run_rc_command "$1" .Ed .Pp スクリプトによっては追加機能を提供したいでしょう。 追加コマンドを介することで、この機能にアクセス可能です。 スクリプトは、コマンドを必要なだけ列挙し定義可能です。 .Bd -literal -offset indent #!/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" .Ed .Pp ブート時にデーモンを起動し、シャットダウン時にこれを終了する、 古いスタイルの .Pa /usr/local/etc/rc.d/ スクリプトの仮想的な例を示します。 .Bd -literal -offset indent #!/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 .Ed .Pp シャットダウン時には .Xr init 8 が全プロセスを終了させるので、明示的な .Xr kill 1 は不要ですが、これが含まれることが多いです。 .Sh 関連ファイル .Bl -tag -compact .It Pa /etc/rc .It Pa /etc/rc.conf .It Pa /etc/rc.conf.local .It Pa /etc/rc.d/ .It Pa /etc/rc.firewall .It Pa /etc/rc.local .It Pa /etc/rc.shutdown .It Pa /etc/rc.subr .It Pa /var/run/dmesg.boot .Nm プロセスの開始直後に .Xr dmesg 1 が結果を書き込みます。 カーネル内の dmesg バッファがもはやこの情報を保持していない場合に有用です。 .El .Sh 関連項目 .Xr kill 1 , .Xr rc.conf 5 , .Xr init 8 , .Xr rcorder 8 , .Xr rc.subr 8 , .Xr reboot 8 , .Xr savecore 8 .Sh 歴史 .Nm スクリプトは .Bx 4.0 で登場しました。