`/dev/console`はどこで使用されますか?

`/dev/console`はどこで使用されますか?

~からこの回答到着Linux:/dev/console、/dev/tty、および/dev/tty0の違い

~から 文書:

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

昔は/dev/consolesysadminコンソールがありました。 TTYは、サーバーに接続されたユーザーのシリアルデバイスです。 Now /dev/console/dev/tty0現在の表示を表し、通常は同じです。 console=ttyS0grub.conf。その後、あなたは/dev/tty0モニター/dev/consoleです/dev/ttyS0

合格」システムコンソール「は、仮想コンソールのデバイス/dev/consoleファイルと同様に、テキスト物理端末のデバイスファイルのように見えます。/dev/tty{1..63}

「および現在のディスプレイを表し、一般的に同じです」とすると、仮想コンソールのデバイスファイルである可能/dev/console性があります。 (は現在アクティブな仮想コンソールであり、そのいずれかである可能性があります)と似ています。/dev/tty0/dev/console/dev/console/dev/tty0/dev/tty{1..63}/dev/tty0/dev/tty{1..63}

何ですか/dev/console?それは何のために使用されますか?

Linuxカーネルとプロセスは/dev/console同じ目的を果たしますか?/dev/tty/dev/ttyプロセスプロセスセッションの制御端末はptsであり、1から63までですか?/dev/ttynn

別の返信話す:

カーネル文書には/dev/console文字デバイス番号が5:1で指定されています。この文字デバイスを開くと、コンソールリストの最後のttyである「デフォルト」コンソールが開きます。

console=「コンソールリスト」はすべてを意味しますか?起動オプション

/dev/console5:1番号の文字デバイス」とは、/dev/console物理テキスト端末(システムコンソールなど)用のデバイスファイルという意味ですか? (しかし、上記で引用した最初の答えは/dev/console同じかもしれないと言いました。/dev/tty0これは実際のテキスト端末ではなく仮想コンソールです。)

ありがとうございます。

答え1

/dev/console存在の主な目的は、カーネルのコンソールをユーザー空間に公開することです。Linuxカーネルデバイスドキュメント今言う

コンソールデバイスは、/dev/consoleシステムメッセージを送信し、シングルユーザーモードでログインを許可する必要があるデバイスです。 Linux 2.1.71以降、これは/dev/consoleカーネルによって管理されています。以前のバージョンでは、システム構成によっては、特定の仮想/dev/tty0コンソール(デバイスではない/dev/tty1)またはシリアルポートホストへのシンボリックリンクでなければなりません。tty*cu*

/dev/console、メジャー5とマイナー1を持つデバイスノードで、カーネルがシステム管理者と対話する基本的な方法と見なすすべてのものにアクセスできます。これはシステムに接続されている物理コンソールです(仮想コンソールの抽象化が一番上にあるため、それは利用可能tty0またはttyNどこでも窒素1〜63)、シリアルコンソール、ハイパーバイザーコンソール、点字デバイスなどがあります。カーネル自体は、カーネルでは/dev/consoleなくユーザー空間に:deviceノードを使用しません。しかし、ノードが/dev/console存在し、利用可能であることを確認し、init標準入力、出力、およびエラーポイントを/dev/console

ここで説明されているように、/dev/console文字デバイスには固定メジャーとマイナーがあり、別のデバイス(物理デバイスではなくカーネルにアクセスする方法)なので、他のデバイスと同じか/dev/tty0他のデバイスと同じではありません。これは次のように似ています。状況/dev/ttyこれは、他の仮想コンソールや端末デバイスとはわずかに異なる機能を提供するため、独自のデバイス(5:0)です。

「コンソールリスト」は、実際に起動パラメータconsole=で定義されたコンソールのリストです(または存在しない場合はデフォルトのコンソール)。このように定義されたコンソールを見ることでこれを行うことができます/proc/consoles/dev/consoleアクセスを提供します最後に:

カーネルコマンドラインで複数のconsole =オプションを指定できます。出力はすべての項目に表示されます。を開くと、最後のデバイスが使用されます/dev/console

答え2

「何ですか/dev/console?」以前の回答。おそらく、この答えは他の2つの質問に対する答えを知ることでより明確になります。

Q1. 「物理的な端末自体を表すデバイスファイルは何ですか?」

対応するデバイスファイルがありません。

Q2. 「/dev/console役に立つとは?」

Linuxでは、/dev/console開始(および終了)中にメッセージを表示するために使用されます。 Stephen Kittの答えが示すように、「シングルユーザーモード」でも使用されます。それを使用するために他の意味はありません。

Unixの「良い昔」/dev/consoleは専用の物理デバイスでした。しかし、Linuxではそうではありません。

関連証拠

1. 「物理的な端末自体を表すデバイスファイルは何ですか?」

このように理解してみましょう。デバイス自体を表すデバイスファイル(エミュレーションですが)であり、プロセスやカーネルとは関係ありません/dev/tty{1..63}。そのうちの1つが現在何か(おそらくカーネル)で使用されていることを示します。/dev/pts/n/dev/tty0/dev/tty{1..63}またはシェルプロセス? )。/dev/tty現在のプロセスセッションで使用されている制御端末を表します。/dev/console現在カーネルが使用している端末を示しますか?

カーネルやプロセスとは別に、物理端末自体を表すデバイスファイルは何ですか?

デフォルトのデバイス/dev/tty{1..63}はですstruct con_driver。可能なすべてのドライバを表示するには、次の点を確認してください。https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console

これらの基本デバイスのデバイスファイルはありません!


これを管理できる最小限のユーザースペースインターフェースしかありません。

$ head /sys/class/vtconsole/*/name
==> /sys/class/vtconsole/vtcon0/name <==
(S) dummy device

==> /sys/class/vtconsole/vtcon1/name <==
(M) frame buffer device

本当にもっと知りたいなら、この(M)モジュール。つまり、仮想コンソールデバイスはロード可能なカーネルモジュールによって提供されません。これは初期カーネルイメージ(別名「組み込み」)の一部です。

第二に、bind各サブディレクトリのファイルは、/sys/class/vtconsoleどのvtconsoleデバイスが有効になっているかを知らせるようです。0アクティブに書くと仮想に切り替わるようです。 (GUI VTは影響を受けていないようですが、テキストVTは機能しなくなります。1)どちらの方法も実際の方法に戻すことができます。コードを正しく読んだ場合は、echo 1 > bindモジュール(?!)で構築されたコンソールドライバでのみ機能します。

~のためフレームバッファ具体的には、さまざまなフレームバッファデバイス(...)バインディングに関する追加情報/dev/fb0と、特定の仮想コンソールバインディングに関する追加情報があります。https://kernel.org/doc/Documentation/fb/fbcon.txt。これにはカーネルオプションfbcon:map=またはというコマンドが含まれますcon2fbmap

もちろん、詳細はカーネルバージョン、アーキテクチャ、ファームウェア、デバイス、ドライバなどによって異なる場合があります。私は上記のインターフェイスを実際に使ったことがありません。カーネルはi915//inteldrmfb呼び出したいすべてを許可し、ロード時にそれを置き換えますvgacon

私のEFIシステムはそのようなことをしたことがないようですvgacon。そのため、まず仮想コンソールを使用し、2番目に1.2秒後にfbconinに切り替えますefifb。しかし、これまでは何が機能しているのか気にする必要はありません。

$ dmesg | grep -C2 [Cc]onsole
[    0.230822] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=4
[    0.233164] NR_IRQS: 65792, nr_irqs: 728, preallocated irqs: 16
[    0.233346] Console: colour dummy device 80x25
[    0.233571] console [tty0] enabled
[    0.233585] ACPI: Core revision 20180810
[    0.233838] clocksource: hpet: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 133484882848 ns
--
[    1.228393] efifb: scrolling: redraw
[    1.228396] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
[    1.230393] Console: switching to colour frame buffer device 170x48
[    1.232090] fb0: EFI VGA frame buffer device
[    1.232110] intel_idle: MWAIT substates: 0x11142120
--
[    3.595838] checking generic (e0000000 408000) vs hw (e0000000 10000000)
[    3.595839] fb: switching to inteldrmfb from EFI VGA
[    3.596577] Console: switching to colour dummy device 80x25
[    3.596681] [drm] Replacing VGA console driver
[    3.597159] [drm] ACPI BIOS requests an excessive sleep of 20000 ms, using 1500 ms instead
[    3.599830] [drm] Supports vblank timestamp caching Rev 2 (21.10.2013).
--
[    3.657050] e1000e 0000:00:19.0 eth0: MAC: 11, PHY: 12, PBA No: FFFFFF-0FF
[    3.657869] e1000e 0000:00:19.0 eno1: renamed from eth0
[    4.711453] Console: switching to colour frame buffer device 170x48
[    4.734356] i915 0000:00:02.0: fb0: inteldrmfb frame buffer device
[    4.778813] Loading iSCSI transport class v2.0-870.

2. 「何が/dev/console役に立ちますか?」

/dev/console を TTY デバイスとして使用できます。たとえば、ここに書き込むと特定の基本デバイスに書き込まれ、一意の文字デバイス番号も持っています。

通常、/dev/console は /dev/tty0 にバインドされますが、時には他のデバイスにバインドされることもあります。

したがって、この場合、/dev/consoleに書き込むと/dev/tty0に書き込まれます。逆に、/dev/tty0 への書き込みは、現在アクティブな /dev/ttyN デバイスへの書き込みと同じです。

しかし、これは興味深い質問を提起します。アクセスは、tty0現在アクティブな仮想コンソールに基づいて他の仮想コンソールにアクセスします。人々はLinuxtty0でも実際に何を使用していますかconsole

  1. console技術的に/で読み書きできますtty0。たとえば、gettyログインを許可するにはaを実行しますtty0。しかし、これは速いハッキングとしてのみ便利です。これは、Linuxで複数の仮想コンソールを利用できないことを意味するためです。

  2. systemdsysfsデフォルトのTTYデバイスを検出するには、/ dev / consoleデバイスに関連する属性を見つけます。これにより、ユーザーがbootを介してカーネルコンソールを設定すると、シリアルコンソールがsystemd自動的に作成され、gettyログインが許可されますconsole=ttyS0。これは便利です。このコンソールを2つの異なる場所に設定する必要はありません。もう一度参照してくださいman systemd-getty-generator。しかし、実際にはこれについての余地はsystemdありません。/dev/console

  3. システムの起動中にsysfsがインストールされていない可能性があります。しかし、あなたはできるだけ早くエラーと進捗メッセージを表示できるようにしたいです!だから我々はポイント1)に戻ります。カーネルはPID 1で始まり、stdin/stdout/stderrを/dev/console

  4. Linuxコンテナ内では、ファイルは/dev/console文字デバイス番号の代わりに別のものとして生成できます5:1。代わりにPTSデバイスファイルとして生成できます。その後、このファイルを介して/dev/consoleログインするのが妥当です。systemdこれらのデバイスへのログインはコンテナ内で許可されていますman systemd-getty-generator

    このメカニズムは、このコマンドを使用してコンテナを実行するときに使用されますsystemd-nspawn。 (systemd-nspawnマンページを検索してみるとわかりませんが、TTYで実行している場合にのみ該当すると思います。)

    systemd-nspawn/dev/consoleホストからPTSデバイスのバインドマウントとしてコンテナを作成します。これは、PTS デバイスが/dev/pts/コンテナ内に表示されないことを意味します。

    PTS デバイスはdevpts特定のインストールに対してローカルです。 PTS デバイスは、デバイス番号でデバイスを識別する一般的なルールの例外です。 PTS機器は、機器番号と取り付け方法の組み合わせで識別されますdevpts

  5. ユーザーの現在の仮想コンソールにconsole緊急メッセージを書き込むことができます。tty0これは、コンソールに印刷された緊急カーネルメッセージと同様の緊急ユーザースペースエラーメッセージに役立ちます(参考資料を参照man dmesg)。ただし、少なくともシステムの起動が完了するまで、これを行うのは一般的ではありません。

    rsyslogにこのページの例、カーネルメッセージをに印刷します/dev/console。カーネルはすでにデフォルトでこれを行うので、Linuxでは意味がありません。私が再び見つけることができない例の1つは、カーネルではなくメッセージにこれを使用するのは良い考えではないということです。これは、コンソールにあまりにも多くのsyslogメッセージがあふれて、あまりにも多くの邪魔になるからです。

    systemd-journaldには、すべてのログをコンソールに渡すオプションもあります。原則として、これは仮想環境でのデバッグに役立ちます。しかし、デバッグ目的で、我々は一般的に/dev/kmsg。これにより、カーネルログバッファに保存して使用できますdmesg。カーネル自体によって生成されたメッセージと同様に、このメッセージは現在のカーネル構成に従ってコンソールに表示されることがあります。

関連情報