web-dev-qa-db-ja.com

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

Linuxシステムで、/dev/console/dev/tty/dev/tty0の違いは何ですか?

それぞれの用途は何ですか、またどのように比較しますか?

142
Axel Fontaine

ドキュメント から:

/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の違いを示す演習:

を押して2番目のコンソールに切り替えます Ctrl+Alt+F2rootとしてログインします。 sleep 5; echo tty0 > /dev/tty0と入力します。押す Enter を押して3番目のコンソールに切り替えます Alt+F3。を押して、2番目のコンソールに戻ります。 Alt+F2sleep 5; echo tty > /dev/ttyと入力して、 Enter 3番目のコンソールに切り替えます。

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

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

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

  • /dev/tty[1-x]は、切り替え先の仮想コンソールの1つです control-alt-F1 等々。

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

59
jlliagre

/ 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 、または私のお気に入りのコンソール ラインプリンター を参照してください。

_/sys/class/tty/console/active_を読み取ることにより、ttyコンソールのリストを表示することもできます。 systemd documentation は、表示されているfirstデバイスがメインコンソールであることを示しています。リストは、実際にはカーネルコマンドラインの逆の順序になっています。 現在のカーネルのドキュメント は、表示される最後のデバイスがメインまたは「アクティブな」コンソールであると誤って述べています。何らかの理由で、このファイルに変更がないかポーリングすることができます(コンソールデバイスが削除された場合)。

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

/ dev/tty0

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

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

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

/ dev/tty

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

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

22
sourcejedi