/ etc / inittab
On 2月 12, 2021 by admin次の/etc/inittab
ファイル(systemv)を使用しています:
# /etc/inittab: init(8) configuration. # $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $ # The default runlevel. id:5:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin # /etc/init.d executes the S and K scripts upon change # of runlevel. # # Runlevel 0 is halt. # Runlevel 1 is single-user. # Runlevels 2-5 are multi-user. # Runlevel 6 is reboot. l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin S0:12345:respawn:/sbin/getty -L 115200 ttyS0
実際にどのように機能するかを理解するために、1〜3の回答があれば、2つの状況を区別していただければ幸いです。
- シリアルポートを使用してシステムに接続しています。
- 「通常の」デスクトップPCを使用しています。
質問:
-
別のgetty行を追加する場合、Linuxを起動すると、2つの別々の端末が表示されますか?
-
複数のgetty行を開くと、どのように割り当てましたか? gettyは私の
si::sysinit:/etc/init.d/rcS
コマンドを実行し、どのgettyが他のスクリプトのコマンドを実行しますか?(システムの実行レベルに従ってスクリプトを実行するもの)in言い換えると、
/etc/inittab
ファイルで-異なるgettyに異なるコマンドを割り当てることはできますか?(つまり、これらのgettyによって開く端末を意味します) -
/etc/init.d/rc5フォルダー内の最後のスクリプトが実行されます次のコマンド:
su nobody -c /bin/sh
出力は次のとおりです:
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell sh-4.3$ whoami nobody
確認しました私は誰でもないのに、なぜ最初の2行を書き込むのですか?また、プロンプトがsh-4.3 $であり、nobody @ …ではない理由
-
シリアル接続を使用しています。/etc/inittabファイルと最後のスクリプトを変更できますか?これは、次の目的でinitによって実行されます。
- 低特権ユーザーとしてログインする前にプログラムを実行します(initプロセスは終了を待機します)
- プログラムが終了すると、通常のシステムへのログインプロンプト
- 特権の低いユーザーを作成し、initプロセス中にこのプログラムを実行させるための最良の方法は何ですか(nobodyユーザーを使用したくない場合)
回答
質問1:
はい、さらに追加してgetty
回線を使用すると、より多くの端末を並列に取得できます。一度に1つの端末デバイスに関連付けることができるgetty
は1つだけなので、シリアルポートごとに1つのgetty
のみが可能です。通常のデスクトップPCでは、Linuxカーネルは、 Control + Alt + FX キーの組み合わせを使用してアクセスでき、に対応する多数の仮想コンソールを定義します。 /dev/ttyX
デバイス(X =数値)。正確な設定はディストリビューションによって異なる場合がありますが、通常、主流のディストリビューションでは、最初の6つほどの/dev/ttyX
デバイスにgetty
が構成されています。システムは正常に実行されています。 openvt
およびdeallocvt
コマンドを使用して、仮想コンソールを追加または削除し、プロセスを開始できます(これは任意のプロセスであり、必ずしもividである必要はありません)。
/dev/tty0
は特別です。現在選択されている仮想コンソールを指しますが、これは特別なものです。= “b0aa2f1c2b”>
s)/dev/console
も同様の特別なデバイスであり、プライマリカーネルレベルのシステムコンソールとして定義されているTTYデバイスを指します。デスクトップシステムでは、デフォルトでは事実上/dev/tty0
のエイリアスですが、console=
ブートオプションを使用すると、シリアルに切り替えることができます。港。例:一部の組み込みアーキテクチャでは、デフォルトでシリアルポートになる場合があります。xconsole
のようなユーティリティは、
/dev/console
の追加出力としても機能します。
コンピューターが専用のコンピューター室にある大きなマルチキャビネットのものだった頃、/dev/console
にメッセージを送信することは、勤務中のシステムオペレーターに連絡する方法でした。コンピュータの物理的に近くにあります。これは、たとえばテープまたはディスクパックを交換してください。最近のシステムでは、特に/dev/console
に送信されるメッセージは、通常、ブート/シャットダウンメッセージ、またはネットワークやストレージへのアクセスに影響を与える可能性のある障害状態に関する緊急アラームの最後の手段チャネルです。カーネルクラッシュを伴う:「物理ハードウェアの担当者はこれを確認する必要があり、通常のログファイルは何らかの理由で使用できません。」
質問2:
ここで誤解があります。sysinit
行と他の/etc/inittab
行ははすべて処理します。inittab
から実行される各コマンドには、特に指定がない限り、/dev/console
。
getty
行は、実際に使用するTTYデバイスを指定し、getty
プロセスはそのTTYデバイスを自分自身に割り当てるコードが組み込まれていますユーザーがシェルを実行し、それらのストリームを別の方法でリダイレクトすることを選択しない限り、すべての子プロセス。それとTTYデバイスの設定の初期化は、getty
の目的の最大の部分です。/etc/issue
とログインプロンプトを表示し、ユーザー名、TERM環境変数の設定、およびTTYログインプロセスの次のステップの開始(通常は/bin/login
ですが、カスタマイズ可能)は、事実上、ほんのわずかな部分です。
TTYデバイスの場合、inittab
行の最初の列の2文字のIDフィールドは、/dev/tty
プレフィックスなので、/dev/ttyS0
はS0
のinittab行IDを取得します。必ずしもTTYに関連付けられているとは限りません(または必要に応じて緊急のものを/ dev / consoleに出力するだけです)。IDはTTYデバイスの回線IDと競合しないものであれば何でもかまいません。
(戻るシリアル接続端末がなかった日rm、回線の反対側の端末に適切なTTYデバイスの設定を取得し、その端末をログイン用の既知の状態にリセットすることは、多くの競合する端末タイプの標準があったため、簡単な作業ではありませんでした。)
スクリプトを実行するようにinittab
行を構成すると、たとえば、特定の/dev/ttyX
仮想コンソールかどうかを確認できます。デバイスが存在します。そうでない場合は、openvt -c X <command>
を使用して仮想コンソールを作成し、その上でコマンドを開始できます。仮想コンソールデバイスがすでに存在する場合は、標準の入力、出力、およびエラーをリダイレクトして、必要なコマンドを開始できます。たとえば、次のようなinittab行を指定できます。
6:345:respawn:/usr/local/sbin/myscript
次に、/usr/local/sbin/myscript
のように指定します(免責事項:テストされていません。現在、SysVinitを備えたシステムがありません。これを改善できる場合は、自由に編集してください):
#!/bin/sh if [ -c /dev/tty6 ]; then exec <some command> </dev/tty6 >/dev/tty6 2>&1 else exec openvt -c 6 -w <some command> fi
inittab行のdivid = “cd7ced2b0a”> は、何らかの理由でプロセスが停止した場合に、プロセスが自動的に再起動されるようにします。345
は、このプロセスを実行する必要があるSysVinitランレベルのリストです。すべての通常のランレベルで実行する必要がある場合は、12345
と入力します。
注:これはinittab行がsysinit
行の後に配置されている場合にのみ意図したとおりに機能するため、udev
の初期化が完了したと見なすことができます。 initプロセスの早い段階でこれを実行したい場合は、最初にドライバーが既にロードされているデバイスの実際のデバイスノードを作成する必要がある場合があります。 udev
が実行されると、デバイスドライバーが初期化されるときにデバイスノードが自動的に作成されます。
シリアルポートを使用している場合は、openvt
コマンドは適用されません。
そうです、確かに異なるコマンドを異なるTTYデバイスにアタッチできます。コマンドにgetty
のような機能が組み込まれている場合に役立ちますが、スクリプトを使用して行うこともできます。
(単純なtail -f
よりも複雑なものを設定して、他の方法では使用されていない仮想コンソールでログを永続的に表示する場合は、man setsid
そしてそれがあなたの計画に適用できるかどうかを確認してください。)
質問3:
TTYセッションの初期化にはまだまだありますsu
でシェルを開始するだけではなく特定の非rootユーザーの場合。
エラーメッセージ
sh: cannot set terminal process group (1618): Inappropriate ioctl for device sh: no job control in this shell
は、シェルが特定のTTYデバイスではなく/dev/console
デバイスに関連付けられていることが原因である可能性があります。/dev/console
は現在のシステムコンソールのエイリアスであるため、TTY制御ioctl関数の完全なセットを使用することはできません。
PS1
環境変数にさらに役立つ値を割り当てるログインスクリプトがない場合、/bin/sh
は単純にsh-<version>$
にすることができます。
質問4:
はい、できます。 「最後のスクリプト」をinittab
のwait
タイプの行として指定し、前に配置する必要があります。シリアル回線に対応するgetty
回線。
環境に関する詳細がわからないと、どちらがそのような目的のために特権の低いユーザーを作成するための最良の方法。
コメント
回答
-
はい、は一意の識別子が与えられ、設定された端末回線が利用可能です:
S1:12345:respawn:/sbin/getty -L 115200 ttyS1
ttyS1
。 -
inittab
の行は連続していないか、ログインに関連していません。各行は、特定のランレベルのセットで実行されるアクションを示しています。したがって、si::sysinit:/etc/init.d/rcS
は、システムの初期化を処理するときにinit
を/etc/init.d/rcS
で実行するように指定しています。これは、ログインが可能になる前に発生します。 (詳細については、inittab(5)
のマンページを参照してください。異なるコマンドを異なる
を使用する場合は、たとえばlogin
gettyの呼び出し自体を構成します。起動する/ div>プログラム(ほとんどのgetty
実装の-l
オプション):
S0:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t0-login ttyS0 S1:12345:respawn:/sbin/getty -L 115200 -l /bin/my-t1-login ttyS1
/etc/init.d/rc 5
はログインが可能になる前に実行され、実行されるプログラムは端末に接続されていません(「適切に」、 getty
が行うことです–ターミナルを開き、起動するプログラムを接続します)。したがって、su nobody -c /bin/sh
が呼び出されると、シェルは期待する端末設定を見つけられず、結果としてジョブ制御を無効にします。 sh-4.3$
プロンプトは、/bin/sh
として実行した場合のBash4.3のデフォルトプロンプトです。
ユーザーがログインを開始したときにのみプログラムが実行されることになっている場合は、getty
で使用されるログインシーケンスにプログラムをフックできます。しかし、そのようなプログラムはrootとして実行されます。正確に何を求めているかに応じて、/etc/inittab
のカスタマイズ、またはsudo
を使用するよりも、initscriptを使用する方がよいでしょう。シェルの起動スクリプト。
コメント
- 再生していただきありがとうございます。 2項についてメールの説明をお願いできますか?異なるゲッティごとにログインコマンドを編集するにはどうすればよいですか?
- 完了しました。更新を確認してください。
- ありがとうございます。私が正しく理解したかどうかを確認するだけです。デフォルトでは、gettyプロセスは/ bin / loginコマンドを実行して、システムログインを担当するプロセスを実行します。これで、gettyは異なるコマンドを実行し、’が選択するすべてのコマンドを実行し、以前のようにシステムログインプロセスを呼び出さなくなります…私は正しいですか?
- はい、そうです。重要なのは、
getty
でTTYを開くことです。通常の動作では、ログイン名を待ってから、TTYに接続されたlogin
を実行します。login
はパスワードを待ち、パスワードを確認して、同じくTTYに接続されているシェルを起動します。login
パーツを交換する場合は、交換プログラムがlogin
のように動作することを確認する必要があります。 - たとえば、ログインフェーズをスキップしたい場合、ユーザー名やパスワードを入力せずにrootユーザーでシステムを開くことができます。 S0:12345:respawn:/ sbin / getty -L 115200 -l- / bin / sh ttyS0を使用するか、S0:12345:respawn:/ sbin / getty -L 115200 -l [my_script_path] ttyS0および内部を使用できます。スクリプトi ‘は-/ bin / shコマンドなどを実行しますか?
回答
ほんの一瞬(長い!)回答が掲載されました。私は最初のものが非常によく説明していると言わなければなりません。現時点では、ポイント3についてコメントしたいと思います。タイミングの問題ではなく、「コンソールダミー」だけでなく、「実際の仮想」ttyを制御するプロセスの問題です。
「ジョブ制御を使用して」シェルを開始する前に、セットアップする必要があります。つまり、ttyNを開く必要があります。 「generic」コマンドはgetty
です。 それから tty-取得したものから、後だけでなく、シェルを開始できます。
これは、xinitと一緒に「起動」するのではなく、最初にウィンドウマネージャーを起動し、次にxorgを起動しようとするようなものです。私は思う。 「セッションリーダー」。
xx:12:...:program
のため、逆に:
aa:1:...:pr_1 bb:1:...:pr_2
… N:M関係が得られます(悪用すると混乱も生じます-それぞれが多くの異なるプログラムを持つ多くのRL)。あなたはそれで遠くまで行くことができます、しかしこれまでに異なった種類のRC-「標準」が引き継いでいます。 「Runcoms」。これらを使用すると、inittabは単純に見えますが、すべての複雑さはこれらのスクリプトにあります。
しかし、inittabは単純で正しいように見えます。最後のコメントと、「z6」エントリのみです…
たぶん、あなたの「su nobody」は、前/周りに「getty … ttyN」が必要なだけです。 login
の代わりにsu
であり、リスポーンはありません。少なくとも「不適切」以外のエラーメッセージを表示する必要があります。
結論(2番目の回答を読んだ後):複雑なinit.d
システムは必要ありません。生のinittabは十分な柔軟性があります。コンセプトと詳細は正しいです。
3つのランレベルを設定できます。1つはttyN、もう1つはttySN、もう1つは両方を開始するRLです。これはブートローダーで追加できるブートパラメーターです。Runlevelこの場合の「5」はデフォルトのみです。初期化するカーネル、root =、およびランレベルを選択します。
「respawn」アクションは、sysvinitが実際に必要だった/必要なものです。 。それ以上のことは行われず、スクリプトで実装することはほとんど不可能でした。しかし、「最後の」シェルレベルを終了(またはクラッシュ)する場合は、セーフティネットが必要です。
sysvinit can 「スポーンが速すぎます-5分間無視します…」というエラーで誤った構成を検出することもできます。
getty
はプロセスです。あなたが話しているのは TTYデバイスです。カーネルはあなたとinitスクリプトのために最初のものを開きました。/dev/console
は、”カーネルによって開かれて使用された最初のTTYデバイスのエイリアスです”。ユーザーアカウントにTTYデバイスへの読み取り+書き込みアクセスのアクセス許可がある場合は、それを使い始めることができます(getty
は必要ありません)が、を設定することをお勧めします。 TERM変数が正しく:TERM=linux top </dev/tty8 >/dev/tty8 2>&1 &
またはTERM=vt100 top </dev/ttyS1 >/dev/ttyS1 2>&1 &
は、8番目の仮想コンソールでtop
コマンドを開始しますまたは2番目のシリアルポート。getty
プロセスがすでに存在するTTYデバイスでプロセスを実行しようとすると、混乱します。 input &出力。2つのプロセスが入力を求めて戦い、それらの出力が混同されます。getty
プロセスは、/etc/init.d/rc 5
の後にのみ開始され、それによって開始されたスクリプトはすべて終了されます。