Linuxディストリビューションを作成していますが、initプログラムが必要です。 Cでコーディングもかなり上手く、Linuxについても多く知っていて(多くはないが4年間アーチLinuxで開発をしてきたので)Cで基本初期化スクリプトを直接作成してみようかと思いました。私はシステムを単純なシェルに設定するためにinitが何をするのか疑問に思います。 (「initが何をしますか?」と尋ねるとき、私はinitが何であるか、何をしているのかを知っています。
コードも必要なく、基本コマンドも必要ないかもしれませんが、する実行順序は必須です。
答え1
システム5は、init
物語の小さな部分だけを教えてくれます。
Linuxの世界には一種の近視があります。人々はinit
伝統的であり始めるのに最適な「システム5」というものを使うと思います。そうではありません。
まず第一に、伝統は実際にこれらの人々が言うのとは異なります。システム5init
とシステム5はrc
AT&T UNIXシステム5にさかのぼります。これは、Linux-Mandrakeの最初のバージョン以降である今(例えば)私たちが今(例えば)最初のUNIX以降であるのとほぼ同じです。
UNIXの最初のバージョンには対応しinit
ていませんrc
。初版アセンブリ言語init
(誰のコードすでにWarren Toomey et al.が復元して提供しました。)は12のプロセスを直接作成および再生成しgetty
、組み込みテーブルから3つのハードワイヤファイルシステムをマウントし、ユーザー名を持つユーザーのホームディレクトリから直接プログラムを実行しますmel
。このgetty
テーブルはプログラムイメージにも直接配置されます。
UNIXシステム5 いわゆる「伝統的な」Linux初期化システムが登場するまで、もう10年が経ちました。 1992年、Miquel van SmoorenburgはLinux init
+rc
と関連ツールを(再び)作成しました。このツールinit
は実際にUNIX System 5のソフトウェアではありませんでしたが、現在の人々は「System 5」と呼ばれていますinit
。
System 5 init
/はrc
最高の出発点ではありません。 systemdの知識を増やしても、必要なものの半分にも達しません。過去20年間(LinuxおよびBSD用)、initシステム設計領域で多くの作業が行われてきました。様々なエンジニアリング決定が議論、定式化、設計、実装、実行されます。 Commercial Unicesも多くのことを行います。
研究・研究に利用可能な既存システム
これはいくつかの主要な初期化システムの不完全なリストです。外のこれらの両方とそのうちの1つと2つの(いくつかの)ポイントは次のとおりです。
- ヨアキム・ニールセン有限価値より理解しやすい設定ファイルを使用する方法を選択しました。
- フェリックス・フォン・ライトナーミニデータベース構成システムであるファイルシステム、小さなメモリースペース、および
init
開始された項目間の開始/停止依存関係を選択します。 - ゲレットペプの走るさっき説明したところに行きました4つのシェルスクリプトを作成しました。方法。
- 初期化NG依存関係、名前付きターゲット、複数の構成ファイル、およびより柔軟な構成構文を持ち、サブプロセス用のより多くの設定をロードするように設計されています。
- 突然現れる我々は、サービスと相互依存性のために発生するイベントやタスクではなく、システムをモデル化するために完全な再設計を行いました。
- デザインおやつすべてのサービス管理(
getty
作成とゾンビの収穫までを含む)を別々のサービス管理者に任せることを含みます。ただオペレーティングシステム固有の「API」デバイス/シンボルリンク/ディレクトリおよびシステムイベントを処理します。 - サイン非常に簡単な初期化です。実行する作業は
/bin/rc.init
、プログラムの起動、ファイルシステムのマウントなどです。これには、次のようなものを使用できます超小型コンピュータ。
また、約10年前に、daemontoolsユーザーと他のユーザーの間でプロセス#1として使用することについての議論がありました。svscan
その結果、次の結果が出ました。プロセス1研究としてのポール・ジャークのsvscan、ゲレットペプの考えとLaurent Bercotのsvscanプロセス1。
これはプロセス#1プログラムの役割を紹介します。
プロセス#1プログラムは何をしますか?
プロセス#1が「しなければならない」作業の概念は本質的に主観的です。意味のある目的デザイン標準プロセスとは何ですか#1少なくともしなければならないする。カーネルはこれに対するいくつかの要件を提示します。そして、常にオペレーティングシステムごとに実行する必要があるさまざまなタスクがあります。プロセス#1が何であるかについて伝統的にもしそうなら、私たちはその最小値に達せず、実際に到達したこともありません。
さまざまなオペレーティングシステムカーネルや他のプログラムによってプロセス#1には避けられないいくつかの要件があります。
fork()
人々は物事を処理し、孤児プロセスの親プロセスとして機能することがプロセス#1の主な機能であると言うでしょう。皮肉なことに、これは事実ではありません。孤児プロセスを処理することは(説明されているように、最近のLinuxカーネルの場合)https://unix.stackexchange.com/a/177361/5132)プロセス#1から専用プロセスなどの他のプロセスに大幅に分解できるシステムの一部サービスマネージャ。これらはすべてプロセス#1の外部で実行されるサービスマネージャです。
- IBM AIX
srcmstr
プログラムシステムリソースコントローラ - ゲレットペプの
runsvdir
ルーネットから - ダニエルJ.バーンスタイン
svscan
daemontoolsでは、Adamsvscan
Sampson艦隊、ブルースガンターsvscan
daemontools-encoreとLaurent Bercotが提供s6-svscan
s6から - ウェインマーシャル
perpd
犯罪者から - Solaris 10のサービス管理ツール
service-manager
nosh から
もう一度説明しましょうhttps://superuser.com/a/888936/38062、全体の/dev/initctl
アイデアがプロセス#1に近づく必要はありません。皮肉なことに、プロセス#1から抜け出すことができることを証明したのは、高度に集中化されたシステムでした。
init
代わりに、人々が一時的な設計で一般的に忘れてしまう必須事項は、カーネルの意味SIGINT
などでSIGPWR
SIGWINCH
https://unix.stackexchange.com/a/196471/5132、BSDツールセット「知っている」という特定のSIGUSR1
意味を持ちます。 )
インストールなど、避けられない、または実行しないと、大きな損失を引き起こす可能性があるワンタイム初期化および仕上げ作業もあります。「API」ファイルシステムまたは、ファイルシステムキャッシュをフラッシュします。
「API」ファイルシステムを扱う基本は、init
ROMの最初のUNIXバージョンの動作とほとんど変わりません。つまり、プログラムにはハードワイヤード情報のリストがあり、mount()
リスト内のすべての項目を保存するだけです。init
このメカニズムは、BSD(sic!)からnosh、systemdまでのシステムにありますsystem-manager
。
「システムを単純なシェルに設定する」
ご覧のとおり、init=/bin/sh
「API」ファイルシステムはタイプexit
(https://unix.stackexchange.com/a/195978/5132)、通常、システムを最小限に使用可能にする操作を手動で実行することは(スーパー)ユーザーに委ねられます。
指定されたデザイン目標のための良い基礎を得るためにプロセス#1プログラムで人々が実際に何をすべきかについての良いアイデアを得るための最良の方法は、Gerrit Papeのrunit(Felix von)でアクションLeitnerのminitとsystem-manager
noshパッケージです。プログラムが重複しています。最初の2つは、ミニマリズムに対する2つの試みを示していますが、まだ避けられない問題に対処しています。
後者は、system-manager
どの「API」ファイルシステムがマウントされるのか、どの初期化タスクが実行されるのか、システムがどの信号が処理されるのかを詳細に説明する多くの手動入力をプログラムに含めるため、便利です。デザインによってシステム管理者は、他の3つのタスク(サービスマネージャ、コンパニオンロガー、状態変更を実行するプログラム)のみを生成し、プロセス#1で避けられないタスクのみを実行します。
答え2
DebianのSystem V init(他のバリアントとバリアントがあります)は次のことを行います。
- ランレベルを入力すると、
/etc/rcX.d/S*
英数字順にスクリプトが呼び出されます。ここでX
ランレベルはです。このスクリプトは実行レベルを設定する必要があります。一般的な設定は、デーモンを起動し、そのランレベルに対して設定タスクを実行することです。これは実行レベルに入ると一回限りです。 - ランレベルにある間、その
/etc/inittab
ランレベル中にアクティブになるべきデーモンを起動します。これらのデーモンが実行を停止すると、再起動されます。管理したいデーモンがあるかもしれませんが、ログインするにはinit
少なくともいくつかのデーモンが必要です。ログインが完了したら、終了して再起動して新しいログインプロンプトを表示します。getty
getty
init
- デーモンが短すぎる時間に過度に再起動すると、一時的に再起動しようとする試みは停止します。
- 起動スクリプトがランレベルに入ったときに何かを起動したとしても、
init
自動的に実行し続けることはありません。あなたはにする必要があります/etc/inittab
。
- ランレベルを終了すると、
/etc/rcX.d/K*
英数字順にスクリプトを呼び出します。ここでX
ランレベルはです。シャットダウンまたは再開を実装する1つの方法は、これらのイベントの実行レベルを定義し、最後に実行されたジョブをコマンドにするhalt
ことreboot
です。 - 電源イベントやCtrl-Alt-Delなどの特定のイベントに応答して実行可能ファイルを呼び出します。
- ソケットを聞いてメッセージを受信すると、ランレベルを変更します。
init
したがって、必要に応じてこれをデフォルトのサービス管理者として使用できますが、今や主な作業は、getty
ユーザーがログインしてランレベルの切り替えを開始できるように、それを有効にすることです。
私はシステムを単純なシェルに設定するためにinitが何をするのか疑問に思います。
欲しいものは何でも。 Debianには、すべてのディレクトリに完全にカスタマイズまたは削除できるスクリプトへの/etc/rcX.d
シンボリックリンクがあります。順序は各スクリプトの前に背中/etc/init.d
を付けて設定されます。00
01
シェルを作成したい場合は、-b
オプションを指定することもできますinit
(カーネルコマンドラインなど)。init
シェルを終了するとシェルが終了しinit
、init
シェルが終了するとカーネルがパニック状態になります。
答え3
initが実行する必要がある最小限の作業は、少なくとも1つの他のプログラムを実行して決して終了しないことです。 initが終了すると、システムがクラッシュします。他のプログラムを実行することも必ずしも必要ではありませんが、そうでない場合、initはシステムが実行すると予想されるすべてのタスクを担当する必要があります。そうでなければあまり役に立ちません。
答え4
モジュラー「1つのことだけをうまく実行する」原則に従う場合は、プログラムがinit
プロセスを開始する必要があります。
プロセスの開始
成功したカーネルの解凍後に実行する必要があり、システムの操作に必要なすべての初期プロセス(/ etc / fstabのドライブマウント、ネットワークインターフェイスの起動など)を初期化することを担当します。
開始プロセスと終了プロセスは本質的に反対であるため、initプログラムは通常、シャットダウンコマンドが受信されたときにプロセスが停止することを保証します。
プロセスの停止
これは、そのプロセスのマニュアルページに従ってプロセスを停止する必要があることを意味します(つまり、露骨に終了するkill -9
方法ではなく、プロセスを終了する必要があります)。ドライブのマウントを解除し、最後に最終電源オフコマンドを実行する必要があります。 。
引用する
他の人がこれを行った方法に関する良い参考資料は、次の点を確認することです。Slackwareの/etc/rc.dスクリプト、次のように既に存在する単純な初期化システムも含まれます。 ニネット(大臣の後任)。これにはプロセスの監督(プロセスが終了すると再開されることを意味します)があります。特に、著者のサンプルスクリプトを使用すると、さらにそうです。