Linux上のテキストターミナル

14.1 ゲッティ(/ etc / inittabで使用)

ゲッティの紹介

コンピュータの起動時(または実行レベルの切り替え時)にシリアルポート(およびその端末に接続された端末)でログインプロセスを実行させるには、gettyコマンドを/ etc / inittabファイルに入れる必要があります。 コマンドラインからgettyを実行すると問題が発生する可能性があります(gettyをコマンドラインから実行すると、プログラムが停止して理由が分かります)。 ゲッティは、TTY(ターミナル)を運営しています。 各端末には独自のgettyコマンドが必要です。 すべての/ etc / inittabファイルには、コンソール用の少なくとも1つのgettyコマンドもあります。 これを見つけて、実際の端末のgettyコマンドをその隣に置きます。 このファイルにはコメントアウトされているテキストターミナル用のgetty行のサンプルが含まれているため、コメントアウトを解除して(#を削除して)いくつかの引数を変更するだけで済みます。

許可される引数は、使用するgettyによって異なります。
直接接続された端末に最適な2つのgettysは次のとおりです。

ダイヤルインモデムに最適な2つのgettys(直接接続された端末を避ける)は次のとおりです。

実際のテキスト端末を使用しない場合に使用する単純なgettys。 ほとんどのLinuxユーザーは、モニターで次のいずれかを使用します。

Linuxディストリビューションには、テキスト端末用のps_gettyまたはagettyが付属しています。 一部のディストリビューションはどちらも供給しません 残念なことに、彼らはしばしば "getty"と呼んでいるので、/ etc / inittabの後に置く引数が異なるので、どれを持っているかを判断する必要があります。 Debianはagettyを使います(util-linuxパッケージ内)。 RedHatとFedoraはps_gettyを使用していました。ps_getty

あなたが持っているgettyを決定する最後の手段として、実行可能コード(通常は/ sbin)をチェックアウトすることができます。 ps_gettyには、このコードに/ etc / gettydefsが埋め込まれています。 それを検索するには、/ sbinに移動して次のように入力します。
文字列getty | grep getty
gettyが実際にagettyの場合、上記の結果は何もありません。 しかし、あなたはagettyの入力を持っている場合:
ゲッティフ
オプション[-hiLmw]が表示されます。

あなたがgettyを持っていないなら、他のディストリビューションをチェックし、 エイリアンプログラムはRPMとDebianパッケージの間で変換します。 ソースコードはGetty Softwareからダウンロードできます。

モデム制御回線を使用していない場合(たとえば、最低3つの導体(送信、受信、および共通信号グランドのみを使用する場合)は、「ローカル」フラグを使用してgettyに認識させる必要があります。 これの形式は、使用するgettyによって異なります。

ゲッティはログイン後に終了します(また再開することもできます)

あなたがログインした後、gettyプロセスがもはや実行されていないことがわかります( "top"、 "ps -ax"、または "ptree"を使用して)。 それがどうなったのか? あなたのシェルがkillされた場合、なぜgettyが再び再起動するのですか? 理由は次のとおりです。

ユーザー名を入力すると、gettyがその名前を取得し、ユーザー名を示すログインプログラムを呼び出します。 gettyプロセスはログインプロセスに置き換えられます。 ログインプロセスはあなたのパスワードを尋ね、それをチェックし、あなたのパスワードファイルで指定されたプロセスを開始します。 このプロセスは、しばしばbashシェルです。 もしそうなら、bashが起動し、ログインプロセスを置き換えます。 あるプロセスが別のプロセスを置き換え、bashシェルプロセスがもともとgettyプロセスとして起動したことに注意してください。 これの意味を以下に説明する。

今、/ etc / inittabファイルで、gettyはkillされた場合にrespawn(再起動)されます。 それはgettyを呼び出す行でそう言います。 しかし、bashシェル(またはログインプロセス)がkillされた場合、gettyは再起動します(再起動します)。 どうして? さて、ログインプロセスとbashの両方がgettyとinheritの置き換えです

* テキストターミナルの使い方

信号接続はそれらの先行者によって確立される。 実際に詳細を確認すると、置換プロセスは元のプロセスと同じプロセスIDになります。 したがって、bashは同じプロセスID番号を持つ偽装のgettyのようなものです。 bashが殺された場合、gettyは(たとえgettyがもう動かないにしても)殺されたようなものです。 これにより、gettyの再作成が行われます。

ログアウトすると、そのシリアルポート上のすべてのプロセスがbashシェルを含めて強制終了されます。 これは、モデムによるDCD電圧の低下によって、ハングアップ信号がシリアルポートに送信された場合にも有効になります(有効になっている場合)。 DCDのログアウトまたはドロップにより、gettyの再作成が行われます。 "top"または "kill"コマンドでkキーを押すなどして、手動でbash(またはlogin)を強制終了することによって、gettyを強制的に再生成させることができます。 シグナル9(無視できない)でそれを殺す必要があるでしょう。

コマンド行からgettyを実行すると、プログラムが停止する

通常は、 / etc / inittabの中からコマンド行ではなくgettyを実行する必要があります。そうしないと、端末上で実行中のプログラムが予期せず中断(停止)することがあります。 理由は次のとおりです(理由が重要でない場合は、次のセクションに進んでください)。 他の端末のコマンドラインからttyS1と言うgettyを起動すると、tty1と言います。実際の端末がttyS1であっても、tty1は "制御端末"となります。 したがって、制御端末が間違っています。 しかし、inittabファイルの中で起動していれば、ttyS1が制御端末(正しい)になります。

制御端末が間違っていても、(gettyの引数としてttyS1を与えたので)ttyS1のログインはうまく動作します。 制御端末がtty11のままであっても、標準入力と出力はttyS1に設定されます。 ttyS1で実行される他のプログラムは、この標準入力/出力(ttyS1に接続されています)を継承してもよく、すべて正常です。 しかし、プログラムによっては、間違っている制御端末(tty1)からの読み込みを間違えることがあります。 ここで、tty1は、これらのプログラムがtty1によってバックグラウンドで実行されていると考えるかもしれません。したがって、tty1(ttyS1であったはずです)から読み取ろうとすると、読み取ろうとしたプロセスが停止します。 (バックグラウンドプロセスは制御端末から読み取ることができません)。 画面に「 [1] + Stopped 」のようなメッセージが表示されることがあります。 間違った端末を使ってあなたと通信しようとしているプロセスとやりとりすることができないので、この時点であなたは立ち往生しています。 もちろん、これから逃れるためには、別の端末に行ってプロセスなどを終了させることができます。

agetty(gettyという名前でもよい)

/ etc / inittabの行例:

S1:23:respawn:/ sbin / getty -L 19200 ttyS1 vt102

S1はttyS1からのものです。 23は、実行レベル2または3に入ったときにgettyが実行されることを意味します.respawnは、getty(またはbashなどのプロセスを置き換えたプロセス)が強制終了されると、gettyが自動的に再起動(再起動)します。 / sbin / gettyはgettyコマンドです。 -Lはローカル(モデム制御信号を無視する)を意味します。 -h(この例では示されていません)では、ハードウェアフロー制御が可能です(stty crtsctsと同じ)。 19200はボーレートです。 ttyS1は/ dev / ttyS1(MS-DOSではCOM2)を意味します。 vt102は端末のタイプで、このgettyは環境変数TERMをこの値に設定します。 設定ファイルはありません。 gettyを編集した後、コマンドラインで「init q」と入力すると、ログインプロンプトが表示されます。

パリティ問題のAgetty自動検出

agettyプログラムは、端末内のパリティセット(パリティなしを含む)を自動検出しようとします。 8ビットデータバイトと1ビットパリティをサポートしていません。 8ビットデータバイト(+パリティ)を参照してください。 sttyを使用してパリティを設定すると、 agettyは自動的にパリティビットをデータビットのようにしたいので、これを自動的に解除します。 これは、パリティを自動検出できるように、ログイン名を入力するときに最後のビット(おそらくパリティビット)を取得する必要があるためです。 したがって、パリティを使用する場合は、テキスト端末内でのみ有効にして、 agettyが自動的に検出してコンピュータに設定させます。 端末が受信パリティをサポートしている場合は、何か入力するまでログインプロンプトが文字化けして表示され、gettyが

パリティ。 文字化けしたプロンプトは、訪問者などがログインしようとするのを阻止します。 それはちょうどあなたが望むものかもしれません。

パリティの自動検出に問題があることがあります。 これは、ログイン名を最初に入力すると、 agettyログインプログラムを開始してログインを開始するためです。残念なことに、 ログインプログラムはパリティを検出できないため、 gettyプログラムがパリティを判別できなかった場合、それもどちらか。 最初のログイン試行が失敗した場合、 loginはあなたに再度試行させます(すべてが間違って設定されます)。 最終的に、ログインに失敗した後(またはタイムアウト後)にagettyが再び起動し、ログインシーケンスが再び開始されます。 gettyが再び実行されると、2回目の試行でパリティを検出できるため、すべてが正常に機能する可能性があります。

パリティが間違っていると、 ログインプログラムはあなたが入力したものを正しく読み込むことができず、 ログインできなくなります。端末がパリティを受信した場合、文字化けした画面が引き続き表示されます。 gettyがパリティを検出できない場合、/ etc / issueファイルは通常、プロンプトの直前の画面にダンプされるため、画面に文字化けが発生する可能性があります。

最初の文字が入力されたことで、なぜagettyがパリティを検出できないのですか? 例を示します。パリティビット0(上位ビット)と奇数の1ビットを持つ8ビットバイトを検出するとします。 どのようなパリティですか? 奇数の1ビットは、それが奇数パリティであることを意味します。 しかし、パリティを持たない8ビット文字であってもかまいません。 これまでに決定する方法はありません。 しかしこれまでのところ、我々は偶数パリティの可能性を排除した。 従って、パリティの検出は、除去のプロセスによって進行する。

入力された次のバイトが最初のバイトに似ていて、偶数パリティの可能性もなくなった場合、パリティを決めることはまだ不可能です。 この状況は無限に続くことがあります。まれに、ログイン名を変更するまでログインが失敗します。 もしagettyが1のパリティビットを見つけると、これはパリティビットであり、8ビットキャラクタの上位ビットではないと仮定する。 したがって、ユーザー名にメタ文字(上位ビットセット)を使用しない(つまり、名前がASCIIである)ことを前提としています。

1つは、さまざまな方法で "ログインループ"に入るかもしれません。 ログイン名に1文字または2文字だけを入力してから、returnキーを押すとします。 これらの文字がパリティ検出に十分でない場合、パリティが検出される前にログインが実行されます。 この問題は、agettyが最初に起動したときに端末が接続されていない、または接続されていない場合に発生することがあります。

この「ログインループ」に陥った場合、gettyログインプロンプトが表示されるまで、戻りキーを数回押してください。 もう1つの方法は、タイムアウトのために1分ほど待つことです。 その後、gettyプログラムによってgettyログインプロンプトが画面に表示され、再度ログインしようとする可能性があります。

8ビットデータバイト(プラスパリティ)

残念ながら、agettyはこのパリティを検出できません。 1999年後半には、パリティの自動検出を無効にするオプションがないため、誤ったパリティが検出されます。 その結果、ログインプロセスが文字化けし、パリティが正しく設定されなくなります。 したがって、パリティ付きの8ビットデータバイトを使用しようとするのは実現可能ではないようです。

getty(getty_psの一部)

(これはほとんどがGreg Hankinsの古いSerial-HOWTOからのものです)
このgettyの場合は、設定ファイルにエントリを入れ、 / etc / inittabにエントリを追加する必要があります。 / etc / gettydefsという設定ファイルに入れた端末用のエントリの例をいくつか示します。

#38400 bpsダムターミナルエントリDT38400#B38400 CS8 CLOCAL#B38400 SANE -ISTRIP CLOCAL#@ S @Lログイン:#DT2004#19200 bpsダムターミナルエントリDT19200#B19200 CS8 CLOCAL#B19200 SANE -ISTRIP CLOCAL#@S @L login: #DT19200#9600 bpsダム端末エントリDT9600#B9600 CS8 CLOCAL#B9600 SANE -ISTRIP CLOCAL#@S @Lログイン:#DT9600

DT38400、DT19200などはラベルであり、 / etc / inittabで使用するラベルと同じでなければならないことに注意してください。

必要に応じて、ログインバナーで興味深いものを印刷することができます。 私の例では、システム名とシリアルラインが印刷されています。 あなたは他のものを加えることができます:[blockquote

陰影=はい] @B現在の(@Bが見える時に評価される)bpsレート。 @D現在の日付(MM / DD / YY)。 @L gettyが接続されているシリアル回線。 @Sシステム名。 @T現在の時刻(HH:MM:SS(24時間))。 @U現在サインオンしているユーザーの数。 これは、/ etc / utmpファイル内で、ut_name以外のフィールドを持つエントリ数のカウントです。 @Vデフォルト値ファイルで与えられたVERSIONの値。 単一の '@'文字を表示するには、 '\ @'または '@@'を使用します。

/ etc / gettydefsの編集が完了したら 、以下のようにして構文が正しいことを確認できます:

linux#getty -c / etc / gettydefs

あなたの端末が接続されているシリアルポート( /etc/default/{uu}getty.ttyS Nまたは/etc/conf.{uu}getty.ttyS N )用の他のgettyまたはuugetty設定ファイルがないことを確認してください。これはおそらく端末上でのgettyの実行を妨げるためです。 競合するファイルがあれば削除してください。

/ etc / inittabファイルを編集して、シリアルポート上でgettyを実行します(port、speed、およびデフォルトの端末タイプのような、あなたの環境に適した情報に置き換えてください):

S1:23:respawn:/ sbin / getty ttyS1 DT9600 vt100 その中に linux#init q

この時点で、端末にログインプロンプトが表示されます。 あなたは、端末の注意を得るためにリターンを打つ必要があるかもしれません。

mgetty

「m」はモデムを表します。 このプログラムは主にモデム用であり、2000年半ばには、ハードウェアフロー制御を使用しない限り、テキストターミナル用に再コンパイルする必要があります(通常はハンドメイドケーブルが必要です)。 直接接続された端末のドキュメントについては、マニュアルの "Direct"セクションを参照してください: mgetty.texi。

/etc/mgetty/mgetty.configの最後の行を見て、端末用に設定する例を見てください。 あなたが "toggle-dtr no"と言っていない限り、存在しないモデムをリセットしようとすると、あなたはモデムを持っていてPCのDTRピンを落とす(否定する)と思うでしょう。 他のgettysとは対照的に、mgettyは誰かがその端末のキーを押すまで、端末に接続しません。 これが起きるまで、端末はpsまたはpsになります。 / var / log / mgetty /のログには、無視する可能性のあるモデムにのみ適用可能な警告メッセージが表示される場合があります。

/ etc / inittabに入れた単純な行の例を次に示します

s1:23:respawn:/ sbin / mgetty -r ttyS1