過去数日間、TTYデバイスドライバがLinuxシステムでどのように機能するかを理解しようとしましたが、まだアイデアを理解できませんでした。
SSHを介してサーバーに接続するために端末を開くと、端末でTTYのように動作し、着信コマンドを処理する疑似ttyを使用する可能性が高いことがわかります。
疑似型のttyを使用しているので、コンソールにコマンドを送信するためにまだ後ろからttyテクノロジを使用していますか?
一般人の観点から使用される端末に関係なく、TTYは常にコンソールにコマンドを送信するために使用されますか?それがすべてを終末に導く主な原動力であるか。
私は、入力と出力を処理するttyキャラクタデバイスとマスター/スレーブデバイスに信号を送信する多くのことを理解しています。私も過去にttyが使用されていることを知っています。最近、端末を開くときに使用するオペレーティングシステム/プログラムに関してまだ使用していますか?
私の知識はどこにでもあります。 Linuxに関する私の知識は非常に限られています。今日のLinuxディストリビューションでは、TTYがどのように機能するかについて一般の人の説明を聞きたいです。
答え1
どのttyを使用していますか?
tty
- 標準入力に接続された端末のファイル名を出力
-man tty
たとえば、
$ tty
/dev/pts/0
何タイプそれはttyですか?どのデバイスドライバ何で実装されますか?
デバイスドライバの概念は、オペレーティングシステムによって異なります。具体的にはLinuxについて質問しましたが、質問に答えようとしたところ、まだ特別なケースがたくさん見つかりました。だから、具体的なケースを探してみると、より早く答えを得ることができます。
/dev/pts/0
pts/0
最初の疑似端末デバイスまたは「pty」です。 pts
擬似端子スレーブを表します。
これ奴隷擬似端末は、エミュレートされたttyデバイスのように動作します。ターミナルエミュレータはgnome-terminal
コントロールを操作するのが好きです。所有者擬似端末の終わりです。たとえば、ウィンドウ内でEnterキーを押すと、gnome-terminal
デフォルトのデバイスに「改行」文字が書き込まれます。これにより、スレーブデバイスから「改行」文字が受信されます。
ptyの終わりは完全に対称ではありません。 Control-C文字をマスターデバイスに書き込み、SIGINT信号を送信してスレーブデバイスを使用するプロセスを中止できます。その逆は真実ではありません。端末内部のプログラムがどの文字を書いても、割り込み信号は送信されませんgnome-terminal
。マスターデバイスは実際のttyとは異なる動作をします。
/dev/ttyS0
ttyS0
最初ですシリアルポートコンピュータのデバイス。誰でも老けたら物理端末、接続できるポートの種類。ここに狡猾な比喩はありません!それでも歴史的なUnixのTTYデバイスと同じように動作します。注意深く見ると、シリアルポートを備えたコンピュータを購入できます。 [1]
上記のControl-Cの例は、シリアル端末にも適用されます。端末でCtrl-Cを押すと、シリアルポートがこの文字を受信し、シリアルデバイスを使用するプロセスがSIGINTを受信して中断される可能性があります。これはttyとして使用されるすべてのデバイスの共通要素です。
かなり大きなコレクションがあります一般的なTTY動作これは、Linuxが実装するさまざまな種類のTTYデバイスにも同様に適用する必要があります。 2つのエンドデバイスが大量のコードを複製すると、メンテナンスが非常に困難になり、貴重なRAMが無駄になります。
Linuxを含む一部のUnix / Unixシリーズシステムでは、同様の動作が「ワイヤルール」で実装されているとします。この動作は、擬似端末スレーブと同じ「ラインルール」を使用してシリアルポートで実装されます。 Linuxはこの動作を実装する行規則を呼び出しますTTY
。しかし、正確な用語にあまりこだわらないでください。要点は、これが共有コードの大きな塊であるということです。
/*
* Copyright (C) 1991, 1992 Linus Torvalds
*/
/*
* 'tty_io.c' gives an orthogonal feeling to tty's, be they consoles
* or rs-channels. It also implements echoing, cooked mode etc.
-https://elixir.bootlin.com/linux/v4.17/source/drivers/tty/tty_io.c[3000行]
* n_tty.c --- implements the N_TTY line discipline.
*
* This code used to be in tty_io.c, but things are getting hairy
* enough that it made sense to split things off. (The N_TTY
* processing has changed so much that it's hardly recognizable,
* anyway...)
*
* Note that the open routine for N_TTY is guaranteed never to return
* an error. This is because Linux will fall back to setting a line
* to N_TTY if it can not switch to any other line discipline.
*
* Written by Theodore Ts'o, Copyright 1994.
-https://elixir.bootlin.com/linux/v4.17/source/drivers/tty/n_tty.c[2500ジュール]
[1] 言い換えれば、シリアルポートの実際の使用は、もはや物理端末を含まないことが多い。使用例は、グラフィックハードウェアなしで単純なデバイスからコンソールにアクセスすることです。シリアルポートとターミナルエミュレーションプログラムを使用してデバイスをPCに接続できます。これを行う方法についての指示を見つけることができますここ。
PCのシリアルポートを開くプログラムは、いいえControl-C ->割り込み信号などのttyデバイスの動作の影響を受けたいです。プログラムは、ptyスレーブではなくptyマスターのように動作することを期待しています。これらのプログラムは同等のコマンドを使用して一般的なtty動作を効果的に無効にしますstty raw -echo
。
を見ると、ttyS0
PCに外部シリアルポートはありませんが、フル機能のシリアルハードウェアがあることがわかります。一部のデスクトップボードには、個別に購入してリボンケーブルを使用して接続できるシリアルポートピンが含まれています。一部のビジネスノートブックは、シリアルポートを備えたドッキングステーションをサポートしています。
一部のドライバは同じように動作しますが、名前の異なるシリアルポートを提供できます。 ttyUSB0
USBデバイス用のLinuxで一般的に使用され、内蔵シリアルポートを持たないPCにシリアルポートを提供します。
/dev/tty1
tty1
PC初の仮想端末です。最初のttyは、起動時にメッセージを表示するテキストコンソールです。グラフィックを使用して起動する場合は、plymouth
Escキーを押すとVTがテキストモードに戻り、起動メッセージを表示できます。
ほとんどのLinux PCでは、少なくとも6つまたは7つのttyを切り替えることができます。グラフィカルインターフェイスを使用している場合は、特定のttyで実行されます。別のttyに切り替えると、テキストベースのログインプロンプトが表示されることがあります。
この番号付けが他のタイプのttyと一致しないことがわかります:-). tty0
現在アクティブなVTを参照するために予約されており、tty1
最初のVTとして予約されています。
純粋なテキストベースのインストールでVTを切り替えるには、たとえばalt + f2を使用してVT2に切り替えます。グラフィカルインターフェイスはこれらのキーの組み合わせを完全に無視します。たとえば、alt + f4は通常ウィンドウを閉じるために予約されています。その代わり、グラフィカルインタフェースでは、ctrl+alt+f2 が VT2 などに切り替わるルールを開発しました。このキーの組み合わせは、テキストコンソールから切り替えるときにも機能します。
どのデバイスドライバが使用されているかを確認する方法
$ ls -l /dev/ttyS0
crw-rw----. 1 root dialout 4, 64 Jun 9 13:17 /dev/ttyS0
^ c = character device ^ 4, 64 is the major, minor
number of the device
$ ls -l /sys/dev/char/4:64
lrwxrwxrwx. 1 root root 0 Jun 9 14:17 /sys/dev/char/4:64 ->
../../devices/platform/serial8250/tty/ttyS0
これはシンボリックリンクファイルです。/sys
デバイスの標準パスが何であるかを示します/sys/devices/platform/serial8250/tty/ttyS0
。このクラスのデバイスであり、tty
サブデバイスです/sys/devices/platform/serial8250/
。親デバイスのドライバ名を見つけることができます。
$ ls -l /sys/devices/platform/serial8250/driver
lrwxrwxrwx. 1 root root 0 Jun 9 13:17 /sys/devices/platform/serial8250/driver ->
../../../bus/platform/drivers/serial8250
シリアルドライバはロード可能なカーネルモジュールに属すると報告しないようです。ドライバが私のプライマリカーネルに組み込まれているからです。
$ ls -l /sys/bus/platform/drivers/serial8250/module
ls: cannot access '/sys/bus/platform/drivers/serial8250/module': No such file or directory
$ grep 8250 /boot/config-`uname -r`
CONFIG_SERIAL_8250=y
...
$ ls -l /dev/tty1
crw--w----. 1 gdm tty 4, 1 Jun 9 13:18 /dev/tty1
$ ls -l /sys/dev/char/4:1
lrwxrwxrwx. 1 root root 0 Jun 9 15:57 /sys/dev/char/4:1 ->
../../devices/virtual/tty/tty1
仮想端末装置は仮想なので、ハードウェア装置の子装置として登録されない。ハードウェアデバイスにどのドライバがバインドされているか尋ねることはできません。 :-).
$ ls -l /dev/pts/0
crw--w----. 1 alan tty 136, 0 Jun 9 15:52 /dev/pts/0
$ ls -l /sys/dev/char/136:0
ls: cannot access '/sys/dev/char/136:0': No such file or directory
Linuxデバイスは通常ここにリストされています/sys
。非仮想デバイスの場合は、そのデバイスドライバを見つけることができます。しかし、ptysは仮想なので、ハードウェアデバイスのサブデバイスではありません。つまり、どのドライバがハードウェアデバイスにバインドされているかを尋ねることはできません。
/sys
ただし、ptyスレーブがそもそもそこにリストされていないため、これを一般的な方法で確認することはできません。これはLinuxで非常に特別なケースです。最新のLinuxシステムでは、ptyを提供するptyデバイスノードdevpts
にファイルシステムタイプがインストールされています。最近では、コンテナで別のLinuxオペレーティングシステムを実行するなど、/dev/pts/
複数の独立したインストールが可能です。devpts
systemd-nspawn。デバイスは通常数字で識別され、メジャー番号とマイナー番号に分けられます。しかし、同じデバイス番号完全に独立したptyデバイスdevpts
、開くファイルシステムによって異なります。この特別なケース2016年にはいくつかの問題が発生しました。。
答え2
ssh
TTYはすべての場合に割り当てられません。次のコマンドで呼び出すとなし:
ssh user@host tty
not a tty
stdin
通常、コマンドには、およびstdout
のみが必要なので、これは問題ありませんstderr
。
tty割り当ては-t
またはで実行できます-tt
。