GNU/Linux >> Linux の 問題 >  >> Linux

init は正確に何をしますか?

システム 5 init ストーリーのごく一部のみを説明します。

Linux の世界に影響を与える一種の近視眼があります。人々は、「システム 5 init」というものを使用していると考えています。 」、そしてそれは伝統的なものであり、始めるのに最適な場所でもあります.実際にはどちらも当てはまりません.

そもそも伝統とは、そういう人が言うようなものではありません。システム 5 init およびシステム 5 rc AT&T UNIX システム 5 にさかのぼります。これは、Linux-Mandrake の最初のバージョンの後の現在 (たとえば) とほぼ同じくらい、最初の UNIX の後でした。

第 1 版 UNIX には init しかありませんでした . rc がありませんでした .第 1 版アセンブリ言語 init (そのコードは Warren Toomey らによって復元され、利用可能になっています。) 直接生成および再生成された 12 getty 組み込みテーブルから 3 つのハードワイヤード ファイルシステムをマウントし、mel という名前のユーザーのホーム ディレクトリから直接プログラムを実行しました。 . getty テーブルもプログラム イメージに直接含まれていました。

いわゆる「従来の」Linux init システムが登場したのは、UNIX System 5 からさらに 10 年後のことです。 1992 年、Miquel van Smoorenburg は Linux init を (再) 書きました。 +rc 、およびそれらに関連するツールは、現在「System 5 init」と呼ばれています。 "、実際には UNIX システム 5 のソフトウェアではありませんが (そして init だけではありません) )。

システム 5 init /rc 始めるのに最適な場所ではありません.systemdの知識を追加したとしても、知っておくべきことの半分をカバーしていません.過去 20 年間だけでも、init システム設計 (Linux および BSD 用) の分野で多くの作業が行われてきました。あらゆる種類のエンジニアリング上の決定が議論され、行われ、設計され、実装され、実践されてきました。商用 Unice も多くのことを行いました。

研究および学習する既存のシステム

以外の主要な init システムの一部の不完全なリストを次に示します。 それらの 2 つと、それらの (いくつかの) 顕著な点の 1 つまたは 2 つ:

  • Joachim Nilsson の finit は、より人間が読める構成ファイルを使用する方向に進みました。
  • Felix von Leitner のミニットは、ファイルシステムがデータベースである構成システム、小さなメモリ フットプリント、init 間の依存関係の開始/停止を目指しました。 開始します。
  • Gerrit Pape の runit は、4 つのシェル スクリプトを生成すると以前に説明したものに行きました。
  • InitNG は、依存関係、名前付きターゲット、複数の構成ファイル、および子プロセスの設定全体をロードするより柔軟な構成構文を持つことを目的としています。
  • upstart は完全な再設計を行い、システムをサービスや相互依存性としてではなく、それらによってトリガーされるイベントやジョブとしてモデル化しました。
  • nosh の設計には、すべてのサービス管理 (getty を含む) を押し出すことが含まれます。 スポーンとゾンビのリープ) を別のサービス マネージャーに統合し、ただ オペレーティング システム固有の「API」デバイス/シンボリック リンク/ディレクトリおよびシステム イベントの処理
  • sinit は非常に単純な init です。 /bin/rc.init を実行します プログラムの起動、ファイルシステムのマウントなどを担当します。このためには、minirc などを使用できます。

また、10 年ほど前に、daemontools ユーザーなどの間で svscan の使用について議論がありました。 プロセス #1 として、プロセス 1 として Paul Jarc の svscan、プロセス 1 として Gerrit Pape のアイデア、Laurent Bercot の svscan などのプロジェクトにつながりました。

これにより、第 1 のプログラムが実行するプロセスにたどり着きます。

プロセス 1 のプログラムが行うこと

プロセス #1 が実行する「想定」の概念は、その性質上主観的なものです。意味のある目標 設計基準は、プロセス #1 が最低限しなければならないものです 行う。カーネルにはいくつかの要件があります。そして、それがしなければならないさまざまな種類のオペレーティングシステム固有のことが常にいくつかあります。プロセス #1 が伝統的に持っているプロセスについて言えば、 完了した場合、私たちはその最低レベルに達しておらず、実際にそうであったことはありません.

さまざまなオペレーティング システム カーネルやその他のプログラムがプロセス #1 に要求する、単純に逃れられないものがいくつかあります。

人々はあなたに fork() と言うでしょう 物事を処理し、孤立したプロセスの親として機能することは、プロセス #1 の主要な機能です。皮肉なことに、これは真実ではありません。孤立したプロセスを処理することは (https://unix.stackexchange.com/a/177361/5132 で説明されているように、最近の Linux カーネルでは) プロセス #1 を他のプロセスに大きく分解できるシステムの一部です。専任のサービス マネージャー .これらはすべてサービス マネージャーであり、プロセス #1 で実行されます:

  • IBM AIX srcmstr プログラム、システム リソース コントローラー
  • Gerrit Pape の runsvdir runit から
  • ダニエル J. バーンスタインの svscan daemontools から、Adam Sampson の svscan freedt より、Bruce Guenter の svscan daemontools-encore および Laurent Bercot の s6-svscan から S6から
  • ウェイン・マーシャルの perpd から
  • Solaris 10 のサービス管理機能
  • service-manager から

同様に、https://superuser.com/a/888936/38062 で説明されているように、全体の /dev/initctl アイデアはプロセス 1 の近くにある必要はありません。皮肉なことに、プロセス #1 の外に移動できることを示しているのは、高度に集中化された systemd です。

逆に init の必須事項 SIGINT の処理などは、頭のおかしいデザインで人々が忘れがちなことです。 、 SIGPWRSIGWINCH などをカーネルから送信し、プロセス #1 への特定の信号が特定のことを意味することを「認識」しているプログラムから送信されるさまざまなシステム状態変更要求を実行します。 (例:https://unix.stackexchange.com/a/196471/5132 で説明されているように、BSD ツールセットは SIGUSR1 を「知っている」 には特定の意味があります。)

「API」ファイルシステムのマウントやファイルシステムキャッシュのフラッシュなど、逃れることができない、または実行しないと非常に苦しむ1回限りの初期化およびファイナライズタスクもあります。

「API」ファイルシステムを扱う基本は、init の操作とほとんど変わりません。 rom 1st Edition UNIX:1 つはプログラムに組み込まれた情報のリストを持ち、もう 1 つは単に mount() です。 s リスト内のすべてのエントリ。このメカニズムは、BSD (sic!) init と同じくらい多様なシステムで見られます。 、鼻から system-manager 、systemdへ。

「単純なシェル用にシステムをセットアップする」

ご覧のとおり、init=/bin/sh 「API」ファイルシステムがマウントされず、exit と入力すると、キャッシュ フラッシュなしで不格好にクラッシュします

プロセス 1 のプログラムで実際に何をするしかないかを確認し、指定された設計目標に向けて適切な方向性を設定するには、Gerrit Pape の runit である Felix von の操作におけるオーバーラップを調べるのが最善の方法です。ライトナーのミニット、および system-manager nosh パッケージのプログラム。前の 2 つは、ミニマリストになるための 2 つの試みを示していますが、避けられないものを処理しています。

後者は system-manager どの「API」ファイルシステムがマウントされているか、どの初期化タスクが実行されているか、どのシグナルが処理されているかを正確に詳述するプログラム。 仕様のシステムで システム マネージャーは、他の 3 つのもの (サービス マネージャー、付随するロガー、状態変更を実行するプログラム) を生成し、プロセス #1 で避けられないことだけを行います。


Debian の System V init (他のバリアントやバリエーションがあります) は、次のことを行います:

  • ランレベルに入ると、/etc/rcX.d/S* でスクリプトを呼び出します X の英数字順 ランレベルです。これらのスクリプトは、ランレベルをセットアップする必要があります。通常のセットアップでは、デーモンを開始し、その実行レベルのセットアップ タスクを実行します。これは、ランレベルに入るときに 1 回だけ行うことです。
  • 実行レベルでは、/etc/inittab にリストされているデーモンを開始します。 その実行レベル中にアクティブである必要があるため。これらのデーモンが実行を停止すると、再起動します。 init で管理したい任意のデーモンを使用できますが、 、少なくともいくつかの getty が必要です ですので、ログインできます。 getty ログインが完了すると終了し、init 再起動して、新しいログイン プロンプトを表示します。
    • デーモンがあまりにも短い時間に何度も再起動すると、デーモンはしばらく再起動を試みなくなります。
    • 実行レベルに入ったときにキックオフ スクリプトによって何かが開始されたからといって、init にはなりません。 自動的に実行し続けようとします。 /etc/inittab で別途指定する必要があります .
  • ランレベルを終了するとき、/etc/rcX.d/K* でスクリプトを呼び出します 英数字順、X ランレベルです。シャットダウンまたは再起動を実装する方法は、これらのイベントのランレベルを定義し、最後に実行されたタスクを halt にすることです または reboot コマンド
  • 電源イベントや Ctrl-Alt-Del などの特定のイベントに応答して、実行可能ファイルを呼び出します。
  • ソケットをリッスンし、特定のメッセージを受信するとランレベルを変更します。

したがって、 init を使用できます 必要に応じて初歩的なサービス マネージャーとしても使用できますが、最近の主なタスクは getty を維持することです が利用できるので、ユーザーはログインしてランレベルの移行を開始できます。

<ブロック引用>

単純なシェル用にシステムをセットアップするために、init はどのようなタスクを実行するのだろうか?

あなたが望むものなら、なんでも。 Debian では、各 /etc/rcX.d で ディレクトリは /etc/init.d のスクリプトへのシンボリックリンクです これらのスクリプトを完全にカスタマイズまたは削除できます。順序は、各スクリプトの前に 00 を付けることで確立されます 、 01 など

-b を指定することもできます init へのオプション (つまり、カーネルコマンドライン経由) init だけが必要な場合 シェルを生成します。シェルを終了すると、init 死亡し、init 死ぬと、カーネルはパニックになります。


init がしなければならない最低限のことは、少なくとも 1 つの他のプログラムを実行し、決して終了しないことです。 init が終了すると、システムがクラッシュします。別のプログラムを 1 つ実行することさえ厳密には必要ではないと思いますが、それを実行しないと、システムが実行することが期待されるすべてのことを init が担当する必要があり、さもないとあまり役に立ちません。


Linux
  1. POSIXとは何ですか? Linux / UNIXユーザーにとってなぜ重要なのですか?

  2. シェルを使用してinitシステムを検出しますか?

  3. 何をしますか?

  1. .bashrcの「rc」は何の略ですか?

  2. Exec 3とは何ですか?

  3. malloc(0) は何を返しますか?

  1. brk() システムコールは何をしますか?

  2. 「cd -」は何の略ですか?

  3. 「bash -c」は何をしますか?