/etc/inittabについて

/etc/inittabについて

/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つのケースを区別できる場合は感謝します。

  1. シリアルポートを使用してシステムに接続します。
  2. 私は「一般的な」デスクトップコンピュータを持っています。

質問:

  1. 別のgetty行を追加すると、Linuxが起動すると2つの別々の端末が表示されますか?

  2. 複数行のgettyを開く場合、どのgettyが私の si::sysinit:/etc/init.d/rcSコマンドを実行するのか、どのgettyが他のスクリプトのコマンドを実行するのかをどのように指定しますか? (システムの実行レベルに応じてスクリプトを実行します)

    つまり、/etc/inittabファイルから - 別のgettysに別のコマンドを割り当てることができますか? (私の言葉はgettyが開くターミナルを意味します)

  3. /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行はなぜ書くのでしょうか?そしてなぜプロンプトはnone @の代わりにsh-4.3 $です...

  4. シリアル接続を使用しています。 /etc/inittabファイルとinitが実行される最後のスクリプトを次のように変更できますか?

    1. 低特権のユーザーとしてログインする前にプログラムを実行してください(initプロセスは終了するのを待ちます)。
    2. プログラムが終了すると、私のシステムは一般的なログインプロンプトを受け取ります。
    3. 権限の低いユーザーを作成し、initプロセス中にプログラムを実行させる最善の方法は何ですか(無人ユーザーを使用したくない場合)

ベストアンサー1

質問1:

はい、より多くのワイヤを追加すると、gettyより多くの並列端子を得ることができます。一度にgetty1つのエンドデバイスしか接続できないため、gettyシリアルポートごとに1つしか接続できません。一般的なデスクトップPCでは、LinuxカーネルはControl++キーの組み合わせを使用してアクセスでき、デバイス(X =数値)に対応する複数の仮想コンソールを定義します。正確な設定はディストリビューションによって異なる場合がありますが、通常、主流のディストリビューションでは、システムが正常に実行されると、最初の6つのデバイスがシステムに対して構成されます。コマンドを使用して仮想コンソールを追加または削除し、そのコンソールからプロセスを開始できます(必ずしもプロセスである必要はありませんが、すべてのプロセスである可能性があります)。AltFX/dev/ttyX/dev/ttyXgettyopenvtdeallocvtgetty

/dev/tty0むしろ特別です。現在選択されている仮想コンソールを表します。/dev/consoleデフォルトのカーネルレベルのシステムコンソールで定義されているすべてのTTYデバイスを指す同様の特殊デバイス。デスクトップシステムでは、実際にはデフォルトではエイリアスですが、起動オプションを/dev/tty0使用してconsole=シリアルポートに切り替えることができます。たとえば、一部の組み込みアーキテクチャでは、デフォルトではシリアルポートにすることができます。このようなユーティリティxconsole/dev/console

コンピュータが専用のコンピュータルームにある大型マルチキャビネットデバイスの場合、メッセージを送信することは/dev/consoleコンピュータの近くに勤務するシステムオペレータに連絡する方法です。これは、テープやディスクパックの変更などの要求に役立ちます。最新のシステムで具体的に送信されるメッセージは、/dev/consoleブート/終了メッセージであるか、ネットワークまたはストレージアクセスに影響を与えるか、カーネルの競合に関連するエラー状態に対して緊急警告を発行する最後の手段です。 「システムの物理ハードウェア要件を担当する人 これを表示するには、何らかの理由で一般的なログファイルを使用できません。」


質問2:

ここで誤解があるようです。このsysinit生産ラインと他の生産ラインは/etc/inittabプロセスとまったく関係がありません。特に明記しない限り、gettyで実行される各コマンドには標準入力、出力、およびエラーストリームが接続されています。inittab/dev/console

このgetty行は実際に使用するTTYデバイスを指定し、プロセスにはユーザーがシェルを実行し、gettyそうでなければそのストリームをリダイレクトすることを選択しない限り、そのTTYデバイスをそれ自体とすべての子プロセスに割り当てるコードが組み込まれています。 TTYデバイスの設定を初期化することは、gettyその目的の最大の部分です。ログインプロンプトの表示、ユーザー名の承認、TERM環境変数の設定、およびTTYログインプロセスの次の/etc/issue(一般的ですがカスタマイズ可能)ステップの開始はわずかです。/bin/login何が効果的か。

inittabTTYデバイスの場合、行の最初の列にある2つの文字IDフィールドがプレフィックスの後の問題TTYデバイス名と一致し/dev/ttyなければ/dev/ttyS0inittab行IDS0などを取得できるという規則があります。 TTYにまったく関連する必要のないコンテンツ(または必要に応じて緊急コンテンツを/ dev / consoleに出力)の場合、IDはTTYデバイスの回線IDと競合しないすべてのものにすることができます。

(直列接続された端末が標準であった頃は、回線の反対側の端末の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

respawnこのinittab行は、何らかの理由でプロセスが終了したときに自動的に再開されることを保証します。345このプロセスを実行する必要があるSysVinit実行レベルのリスト。すべての通常のランレベルで実行するには、を入力します12345

sysinitinittab行がこの行の後ろに配置されている場合にのみ期待どおりに機能するため、初期化がudev完了したと想定できます。初期化プロセスの最初にこれを行うには、まずドライバがロードされているデバイスの物理デバイスノードを作成する必要があります。起動するとudev、デバイスドライバの初期化時に自動的にデバイスノードが作成されます。

シリアルポートを使用している場合、このopenvtコマンドは適用されません。

はい。さまざまなTTYデバイスにさまざまなコマンドを接続できます。コマンドにsなどの機能が組み込まれている場合は役立ちますが、スクリプトを介してgetty実行することもできます。

tail -f(未使用の仮想コンソールで特定のログを永久に表示するための単純な設定よりも複雑なものがある場合は、この内容を読み、計画に適用されることを確認man setsidする必要があります。)


質問3:

ルートではなく、特定のユーザーのTTYセッションを初期化するのは単にsu

誤った情報

sh: cannot set terminal process group (1618): Inappropriate ioctl for device
sh: no job control in this shell

/dev/console特定のTTYデバイスではなく、デバイスに関連付けられているシェルが原因で発生する可能性があります。これは現在システムコンソールのエイリアスにすぎないため、/dev/console利用可能な完全なTTY制御ioctl機能セットはありません。

PS1環境変数により有用な値を割り当てるログインスクリプトがない場合、デフォルトのプロンプトは/bin/sh簡単ですsh-<version>$


質問4:

そうそうできます。 「最後のスクリプト」をwait-type行として指定inittabし、次の場所に配置する必要があります。今後gettyシリアル回線に対応する回線です。

あなたの環境の詳細を知らないと、どの環境なのかを言うのは難しいです。最高この目的のために低特権のユーザーを作成する方法です。

おすすめ記事