Linux:/ dev / console、/ dev / ttyおよび/ dev / tty0の違い


回答:


93

ドキュメントから:

/dev/tty        Current TTY device
/dev/console    System console
/dev/tty0       Current virtual console

古き良き時代に/dev/consoleは、システム管理者コンソールがありました。TTYは、サーバーに接続されたユーザーのシリアルデバイスです。現在/dev/console/dev/tty0現在の表示を表し、通常は同じです。あなたは追加することによって、例えば、それを上書きすることができますconsole=ttyS0grub.conf。その後、あなた/dev/tty0はモニターで/dev/consoleあり/dev/ttyS0ます。

違い表示する運動/dev/ttyとを/dev/tty0

Ctrl+ Alt+を押して、2番目のコンソールに切り替えますF2。としてログインしrootます。を入力しsleep 5; echo tty0 > /dev/tty0ます。プレスEnterとは、押すことで第三コンソールに切り替えAlt+をF3Alt+ を押して、2番目のコンソールに切り替えますF2。型sleep 5; echo tty > /dev/tty、プレスEnter第三コンソールへとスイッチ。

これttyは、プロセスが開始されるコンソールでtty0あり、常に最新のコンソールであることがわかります。


6
いいエクササイズ!Ubuntuはルートをロックするため、Ubuntuでこれを再現する1つの方法は次の$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
とおりです。– SFun28

10
@ SFun28、私は常に使用しsudo -i、出来上がり-ルートシェル。
アンドレラズロ14年

4
ルート特権を必要とするファイルに書き込むためのイディオムの1つは、エコースタッフです。sudo tee / dev / tty0> / dev / null;
ピーターコーデス14

くそ ixunix.stackexchange.com/a/229598/80483を書いたとき、Ī̲はこの答えを知りませんでした!
Incnis Mrsi

@ SFun28:動作する場合sudo anycommandsudo -iルートに移動することも動作します。rootになれないLinux / BSD / Unixのようなものはありません。(その後、Linux / BSD / Unixではなくなります。)
Evi1M4chine

60
  • /dev/console起動時にパラメータとして設定できるデバイスの仮想セットです。シリアルデバイスまたは仮想コンソールにリダイレクトされ、デフォルトではを指して/dev/tty0いる場合があります。複数のconsole=オプションがカーネルに渡されると、コンソール出力は複数のデバイスに送られます。

  • /dev/tty0 現在の仮想コンソールです

  • /dev/tty[1-x]あなたとに切り替える仮想コンソールの一つであるcontrol- alt- F1のように。

  • /dev/ttyコンソールを開くプロセスに関連付けられているコンソール(物理デバイス、仮想デバイス、または擬似デバイスがある場合)の一種のエイリアスです。他のデバイスとは異なり、それに書き込むためにルート権限は必要ありません。また、起動されたcronプロセスや類似のバッチプロセスは/dev/tty、いずれにも関連付けられていないため、使用できません。これらのプロセスには、出力?TTY列がありps -efます。


このステートメントからクエリを実行すると、「/ dev / ttyはクエリを実行するプロセスで使用されるコンソールです」とはどういう意味ですか?
ロン・ビンス

1
@RonVinceは/dev/tty、それを開くプロセスに応じて、別のデバイス(ある場合)になる可能性があることを意味します。回答が更新されました。
jlliagre

ありがとう。プロセスは、それらに関連付けられたデバイスファイルに直接/からではなく、実際に/ dev / ttyに/から読み書きすることを知っていますか?
ロン・ヴィンス

@RonVinceあなたが何を求めているのかわからない 言い換えていただけますか?
jlliagre

1
@RonVince Opening / dev / tty(not /dev/tty[1,..,n])は、プロセスがユーザーの端末に何かを書き込むためのUnix(およびLinux)標準です。移植性がなく、より複雑で信頼性の低い他のデバイスに直接書き込む。プロセスは、プロセス端末が接続されている実際のデバイスが何であるかを知る必要はなく、カーネルはそれをすでに知っています。
jlliagre

20

/ dev / console

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/serial-console.rst

Linuxでは、console= ブートオプションを使用してカーネルコンソールを設定できます。呼び出しをprintk()行うカーネルコードは、たとえばデバイスがロードされたときやエラーが発生したときにメッセージを書き込むことがあります。これらのメッセージは、カーネルによってバッファリングされます。(も参照dmesg)。コンソールデバイスが見つかって起動すると、以前にバッファリングされたすべてのメッセージを受信します。

console=複数回渡して複数のコンソールを構成できます。メッセージはすべてのコンソールに書き込まれます。どうやら、各「タイプ」のコンソールを1つだけ選択できます。console=ttyS0との両方を使用することはできませんconsole=ttyS1

カーネルのドキュメントでは/dev/console、番号付きの文字デバイスとして指定しています(5,1)。このキャラクターデバイスを開くと、コンソールのリストの最後のttyである「メイン」コンソールが開きます。init「PID 1」と呼ばれる最初の非カーネルプロセスは、/dev/console標準出力、標準エラー、および標準入力に接続されて開始されます。

いずれのコンソールもttyでない場合、開く/dev/consoleとエラーENODEV(「No such device」)が返されます。カーネルは印刷するメッセージを記録し、init関係なく開始します。ttyデバイスではないカーネルコンソールの例については、をご覧くださいnetconsole。または、お気に入りのコンソールラインプリンターをご覧ください。

また、を読むことでttyコンソールのリストを見ることができます/sys/class/tty/console/activesystemdのドキュメントでは、最初に表示されるデバイスがメインコンソールであることが指摘されています。リストは、実際にはカーネルコマンドラインの逆順です。現在のカーネルのドキュメントは、間違って示した最後のデバイスは、メインまたは「アクティブ」のコンソールであると述べています。何らかの理由で、このファイルを変更のためにポーリングすることが可能です(コンソールデバイスが削除された場合?)。

内側systemd-nspawn容器、標準/dev/consoleファイルは疑似端末デバイス(PTY)で置換されています。これらは、仮想端末デバイスとして最もよく説明されます。これらは動的に作成され、GNOMEターミナルなどのグラフィカルターミナルエミュレータの実装や、などのリモートアクセスにも使用されますssh

/ dev / tty0

LinuxのTTYのデバイスは、ノード tty1を通じてtty63仮想端末です。また、VTまたは仮想コンソールとも呼ばれます。物理的なコンソールデバイスドライバーの上にある複数のコンソールをシミュレートします。一度に表示および制御される仮想コンソールは1つだけです。アクティブなターミナルは、たとえばchvt、またはCtrl + Alt + F1を使用して、多くのファンクションキーを使用して切り替えることができます。

を使用して、現在のVTを読み書きすることもでき/dev/tty0ます。 tty0明示的に選択しなかった場合など、通常のカーネルコンソールです。「システムはまずVGAカード(VTが実行されているもの)を探し、次にシリアルポートを探します」。コンソールを特定のVTに設定することもできconsole=tty1ます。

「システムにVGAカードがない場合、最初のシリアルポートが自動的にコンソールになります。」のような「シリアルコンソール」ttyS0は、おそらく最も一般的な代替手段tty0です。シリアルコンソールの上でVTシステムを使用することはできません。

/ dev / tty

/dev/ttyPOSIXで指定された3つの標準デバイスファイルの/dev/ 1つ(POSIXで指定された3つのディレクトリ名の1つ)。これを開くことは、現在のプロセスの制御端末を開くことと同じです。制御端末は、少なくともLinuxでは、プロセスが最初に端末を開いたときに設定さます。たとえば、ではinit、を参照し/dev/consoleます。

制御端末からのデタッチは、システムロギングデーモンなど、バックグラウンドプロセスを開始するために従来必要だった手順の1つです。バックグラウンドプロセスになるステップは恐ろしく複雑ですが、具体的には、制御端末から切り離されるステップはsetsidシステムコールです。より最近のシステムでは、init system(例:systemd)は最初に制御端末なしでサービスを開始します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.