/etc/rc.localの目的と一般的な使用法


73

ヘッダーは次のようになります。

#!/bin/sh -e
#
# rc.local - executed at the end of each multiuser runlevel
#
# Make sure that the script will "exit 0" on success or any other
# value on error.

このファイルの理由は何ですか(あまり含まれていません)、通常はどのコマンドを入れますか?「マルチユーザーランレベル」とは何ですか?(私rcは「コマンドを実行する」と思いますか?)


2
これがファイルの「公式」目的かどうかはわかりませんが、起動時に何をすべきかのためにファイルを使用でき、パスワードを提供することなくスーパーユーザーアクセスを必要とすることがわかりました。それには通常、色、キーボード、およびその他のそのようなものが含まれます。ここでいくつかの例をチェックしてください
エマニュエルベルク

回答:


66

ランレベルは、それが起動または再起動またはシャットダウン、またはシングルユーザーモードで、または正常に実行中であるか否かを示す、システムの状態です。従来のinitプログラムは、対応するランレベルに切り替えることでこれらのアクションを処理します。Linuxでは、ランレベルは慣例によります:

  • Sブート中、
  • シャットダウン中は0、
  • 6再起動中、
  • シングルユーザーモードで1
  • 通常の操作では2〜5。

ランレベル2から5は、システム管理者のみを対象とするランレベル1とは異なり、複数のユーザーがログインできるため、マルチユーザーランレベルと呼ばれます。

ランレベルが変更されると、initはrcスクリプトを実行します(従来のinitを備えたシステム上— UpstartSystemdなどの代替手段があります)。これらのrcスクリプトは通常、システムサービスを開始および停止し、ディストリビューションによって提供されます。

このスクリプト/etc/rc.localは、システム管理者が使用するためのものです。従来は、通常のシステムサービスがすべて開始された後、マルチユーザーランレベルへの切り替えプロセスの最後に実行されていました。これを使用して、たとえばにインストールされているサーバーなどのカスタムサービスを開始できます/usr/local。ほとんどのインストールは必要ありません/etc/rc.local、それが必要な少数の場合のために提供されています。


2
今日、現在のFreeBSDでは、rc.localがかなり早く実行される可能性があることがわかりました。通常のシステムサービスがすべて開始された後ではありません。ヘッドレスマシンへのsshdアクセスが利用可能になるときにビープ音rc.localが必要でしたが、この理由には適していませんでした。元の質問はDebianに関するものであるため、このコメントはおそらくOPには無関係です。
MvG

1
@MvG情報をありがとう。rc.local従来は最後に実行されていましたが、依存関係ベースのシステムに切り替えたときに、FreeBSDがそれをやめたことがわかります。場合でも、あなたを気にしrc.localた後に呼び出された/etc/rc.d/sshd、それは完璧に動作しないでしょう。rc.local後すぐに呼び出されるsshdプロセスが開始された、それは前に呼び出すことができsshd(ネットワークに耳を傾け始めていたが、我々はで10分の1秒を話しているはずですほとんどの典型的なセットアップで)。
ジル

私はそれを使用してlxcコンテナのネットワークを設定し、それらを自動起動しようとしています。しかし、それは後に停止しiptables-apply /root/iptablesます。私は何が間違っているかを考えています(次の再起動を待っています)。しかし、何か提案があれば、私はすべて耳にします。
x-yuri

1
@ x-yuriこれには、ここに投稿した情報よりも多くの情報が必要です。「止まる」には「それ」が何なのかさえ分かりません。あなたがしたことを説明する新しい質問をします。
ジル

14

rc 「実行制御」を示し、

multiuserランレベルは、ネットワークが利用可能であり、したがって、サーバへの接続は、ハードワイヤードコンソール接続の代わりにこれらのサービスを使用して作製することができたレベルとして定義されるであろう。

サーバーは、通常、ネットワーク接続をサポートするサービスプロセッサ(さまざまな名前)によって管理され、実際にハードワイヤードコンソールを持っているかのように動作します。

rc.localファイルに関しては、これは、開始するすべての「ローカル」(サイト固有)オブジェクト(デーモンおよび/または1回起動スクリプト)を指定できるようにするために便利です。このパラダイムを使用するか、実際に「/etc/init.d」に開始/停止スクリプトを適切に追加することを選択できます。


1
わかりましたが、なぜファイルがそこにあり、通常はいつ使用し、どのように使用しますか(たとえば、どのコマンドを入れるのが理にかなっていますか)?
エマニュエルベルク

4

私は主に2つのことに使用します:

  1. 再起動のたびに日付とカーネルバージョンを記録します。詰め物をすることなくシステムに簡単に追加できるシンプルなワンライナー...そして、実行するよりも起動履歴が破損する可能性がはるかに少ないuptimedです。

  2. 数年前までdebianにあった古い/etc/rc.boot/ディレクトリを復活させる。私はまだinit.dスクリプト(たとえば、dmesgをrootにメールするQ&Dスクリプト、およびhdaparmを使用してアイドルスピンダウンとblockdevを無効にしてread-そして、他のすべての起動時スクリプトの後に実行されることを嬉しく思います。

例えば

echo "$(date +%s),$(date),$(uname -a)"  >> /var/log/reboot.log

[ -d /etc/rc.boot ] && run-parts /etc/rc.boot

また、http://169.254.169.254/VMがIP、ホスト名、sshキー、その他のインスタンス固有の情報を取得できるように、openstack(から)からec2スタイルのメタデータを取得するために、centosおよびdebianディストリビューション用に今年初めに/etc/rc.localスクリプトを作成しました。その後、cloud-initはこれらのディストリビューションに移植されたため、スクリプトは廃止されました。


3

Debianrc.local上のファイルは、主に非初期化スタイルシステムとの互換性のためです。使用しないでください。

代わりに、/etc/init.d/Skeletonランレベルの変更中に発生させたいことをすべて、新しいinitスクリプトにコピーしてから、それを使用inservして有効にすることをお勧めします。


更新:以下のコメントによると、この回答は推奨されなくなりました。ただし、この回答はスケルトンが廃止される数年前に投稿され、そのスケルトン 2019年1月現在でも Debian不安定版に存在しています。


unix.stackexchange.com/a/480897/5132 /etc/init.d/skeletonは方法ではありません。
JdeBP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.