Linuxシステムで、/dev/console
、/dev/tty
と/dev/tty0
の違いは何ですか?
それぞれの用途は何ですか、またどのように比較しますか?
ドキュメント から:
/dev/tty Current TTY device
/dev/console System console
/dev/tty0 Current virtual console
昔、/dev/console
はシステム管理者コンソールでした。 TTYは、サーバーに接続されたユーザーのシリアルデバイスです。現在、/dev/console
と/dev/tty0
は現在の表示を表し、通常は同じです。たとえば、console=ttyS0
をgrub.conf
に追加することでオーバーライドできます。その後、/dev/tty0
はモニターになり、/dev/console
は/dev/ttyS0
になります。
/dev/tty
と/dev/tty0
の違いを示す演習:
を押して2番目のコンソールに切り替えます Ctrl+Alt+F2。 root
としてログインします。 sleep 5; echo tty0 > /dev/tty0
と入力します。押す Enter を押して3番目のコンソールに切り替えます Alt+F3。を押して、2番目のコンソールに戻ります。 Alt+F2。 sleep 5; echo tty > /dev/tty
と入力して、 Enter 3番目のコンソールに切り替えます。
tty
はプロセスが開始するコンソールであり、tty0
は常に最新のコンソールであることがわかります。
/dev/console
は、起動時にパラメータとして設定できる仮想デバイスセットです。シリアルデバイスまたは仮想コンソールにリダイレクトされ、デフォルトでは/dev/tty0
を指します。複数のconsole=
オプションがカーネルに渡されると、コンソール出力は複数のデバイスに送られます。
/dev/tty0
は現在の仮想コンソールです
/dev/tty[1-x]
は、切り替え先の仮想コンソールの1つです control-alt-F1 等々。
/dev/tty
は、コンソールを開くプロセスに関連付けられているコンソール(物理デバイス、仮想デバイス、または疑似デバイスがある場合)のエイリアスの一種です。他のデバイスとは異なり、それに書き込むためにroot権限は必要ありません。また、cron
によって起動されたプロセスや同様のバッチプロセスは、関連付けられていないため、使用可能な/dev/tty
がないことに注意してください。これらのプロセスには、?
出力のTTY
列にps -ef
があります。
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
などのリモートアクセスにも使用されます。
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
_は、POSIXで指定された3つの標準デバイスファイルの1つ (_/dev/
_は、POSIXで指定された3つのディレクトリ名の1つです)。これを開くことは、現在のプロセスの制御端末を開くことと同じです。制御端末は、プロセスが最初に端末を開いたときに設定されます 少なくともLinuxでは 。たとえば、init
では、_/dev/console
_を参照します。
制御端末からの切り離しは、たとえば システムロギングデーモン のように、従来バックグラウンドプロセスを開始するために必要な手順の1つです。バックグラウンドプロセスになる手順は恐ろしく複雑ですが、具体的には、制御端末から切り離す手順は setsid システムコールです。より最近のシステムでは、initシステム(例: systemdは、最初に制御端末なしでサービスを開始します。