`/ dev / console`は何に使用されますか?


13

この回答のLinux:は、/ dev / ttyのと/ dev / tty0のは/ dev /コンソールとの違い

ドキュメントから :

/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/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?それは何のために使われますか?

ない/dev/consoleとして、Linuxカーネルに同じ役割を果たしている/dev/ttyプロセスのために?(/dev/ttyプロセスのプロセスセッションの制御端末であり、ptsで/dev/ttynある可能性があります。1〜63 n、またはそれ以上ですか?)

他の返信には次のように記載されています:

カーネルのドキュメントでは/dev/console、5:1の番号が付けられたキャラクターデバイスとして指定されています。このキャラクターデバイスを開くと、コンソールのリストの最後のttyである「メイン」コンソールが開きます。

「コンソールのリスト」とはconsole=ブートオプション内のすべてのものを意味しますか?

/dev/console5:1の番号の文字デバイスとして」とは/dev/console、物理的なテキスト端末のデバイスファイル、つまりシステムコンソールであることを意味しますか?(しかし、私が上で引用した最初の返信は、物理的なテキスト端末ではなく、仮想コンソール/dev/consoleと同じであると言って/dev/tty0います)

ありがとう。


:私は行方不明年前に行ったそれらのマニュアルページのためのいくつかの代替作成jdebp.eu./Proposals/linux-kvt-manual-pages.html
JdeBPを

回答:


18

/dev/console主にカーネルのコンソールをユーザー空間に公開するために存在します。Linuxカーネルのデバイスに関するドキュメントには、

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

/dev/console、メジャー5およびマイナー1のデバイスノードは、カーネルがシステム管理者と対話する主要な手段であると見なすものへのアクセスを提供します。これは、システムに接続された物理コンソール(仮想コンソールの抽象化が上にあるため、Nが1から63までのtty0任意のものを使用できます)、シリアルコンソール、ハイパーバイザーコンソール、さらには点字デバイスです。カーネル自体は使用しないことに注意してください。デバイスノードはカーネルではなくユーザースペース用です。ただし、存在して使用可能であることを確認し、標準入力、出力、およびエラーを指すように設定します。ttyN/dev/console/dev/consoleinit/dev/console

ここで説明されているように、/dev/consoleそれは別のデバイス(物理デバイスではなくカーネルにアクセスする手段など)であり、同等/dev/tty0または他のデバイスではないため、固定メジャーおよびマイナーを持つキャラクターデバイスです。これは、他の仮想コンソールまたは端末デバイスとわずかに異なる機能を提供するため、独自のデバイス(5:0)/dev/ttyある状況にやや似てます。

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

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


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
テルドン

6

「なに/dev/console?」前の回答で回答されています。おそらく、他の2つの質問に対する答えがわかっていれば、その答えはより明確になります。

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

そのようなデバイスファイルはありません。

Q2。「何に/dev/console使うの?」

Linuxでは、/dev/console起動中(およびシャットダウン中)にメッセージを表示するために使用されます。Stephen Kittの答えで指摘されているように、「シングルユーザーモード」にも使用されます。それを使用する意味がある他の多くはありません。

Unixの「古き良き時代」/dev/consoleは、専用の物理デバイスでした。しかし、これはLinuxには当てはまりません。

関連する証拠

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

この方法を理解してみましょう。/dev/tty{1..63}また/dev/pts/n、プロセスまたはカーネルに関連するのではなく、デバイス自体を表すデバイスファイルです(エミュレーションですが)。/dev/tty0reprsentsに1 /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

もっと知りたい場合は、module (M)略です。つまり、ダミーコンソールデバイスはロード可能なカーネルモジュールによって提供されません。これは、初期カーネルイメージ(別名「ビルトイン」)の一部です。

次に、のbind各サブディレクトリにあるファイルが/sys/class/vtconsole表示され、アクティブなvtconsoleデバイスがわかります。0アクティブなものに書き込むと、ダミーのものに切り替わるように見えます。(GUI VTは影響を受けていないようですが、テキストVTは動作を停止します)。書き込み1ダミー1、それを活性化させないために。どちらの方法でも、実際の方法に戻ります。コードを正しく読んだ場合の秘theはecho 1 > bind、モジュール(?!)としてビルドされたコンソールドライバーでのみ機能することです。

具体的には、フレームバッファーコンソールについては/dev/fb0https: //kernel.org/doc/Documentation/fb/fbcon.txtに、異なるフレームバッファーデバイス(...)を特定の仮想コンソールにバインドすることに関する詳細情報があります。これには、カーネルオプションfbcon:map=またはと呼ばれるコマンドが含まれcon2fbmapます。

もちろん、詳細はカーネルのバージョン、アーキテクチャ、ファームウェア、デバイス、ドライバーなどによって異なります。上記のインターフェイスを実際に使用する必要はありませんでした。カーネルはちょうどすることができますi915/ inteldrmfb/あなたはそれ荷重が、例えば交換するとき、それは引き継ぐ呼びたいものは何でもvgacon

私のEFIマシンには決してないようvgaconです。したがって、まずダミーコンソールを使用し、次に1.2秒後にに切り替えてfbcon、の上で実行し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は、現在アクティブになっているものに応じて、異なる仮想コンソールにアクセスします。人々は実際に何を使用tty0し、同様consoleにLinuxでは何を使用していますか?

  1. 技術的には、console/ から読み書きすることができます。tty0たとえば、を実行しgettyてログインできるようにしtty0ます。しかし、これは簡単なハックとしてのみ有用です。それは、Linuxの複数の仮想コンソールを利用できないことを意味するためです。

  2. systemdsysfs基礎となるTTYデバイスを検出するために、/ dev / consoleデバイスに関連付けられた属性を探します。これが可能にsystemd自動的に産卵Aにgetty、ユーザーがでブートしてカーネルコンソールを設定する例えば、A、シリアルコンソール、上のログインを許可しますconsole=ttyS0。これは便利です。このコンソールを2つの異なる場所で構成する必要がなくなります。繰り返しますが、を参照してくださいman systemd-getty-generator。ただし、systemd実際に/dev/consoleはこのために開きません。

  3. システムのブートストラップ中に、sysfsがまだマウントされていない場合もあります。ただし、できるだけ早くエラーメッセージと進行メッセージを表示できるようにする必要があります。したがって、ポイント1)に移動します。カーネルは、に接続されたstdin / stdout / stderrでPID 1を開始し/dev/consoleます。この単純なメカニズムを最初から設定しておくと非常に便利です。

  4. Linuxコンテナー内では、ファイル/dev/consoleは、キャラクターデバイス番号ではなく、異なるものとして作成される場合があります5:1。代わりに、PTSデバイスファイルとして作成される場合があります。次に、この/dev/consoleファイルを介してログインするのが理にかなっています。 systemdコンテナ内では、そのようなデバイスにログインできます。を参照してくださいman systemd-getty-generator

    このメカニズムは、systemd-nspawnコマンドでコンテナを実行するときに使用されます。(私はあなたが実行したときだけだと思うsystemd-nspawn私はmanページを検索から言うことができないものの、TTY上)。

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

    PTSデバイスは、特定のdevptsマウントに対してローカルです。PTSデバイスは、デバイスがデバイス番号で識別されるという通常の規則の例外です。PTSデバイスは、デバイス番号とdevptsマウントの組み合わせによって識別されます。

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

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

    systemd-journaldにも同様に、すべてのログをコンソールに転送するオプションがあります。原則として、これは仮想環境でのデバッグに役立ちます。ただし、デバッグのために、通常は/dev/kmsg代わりに転送します。これにより、カーネルログバッファーに保存されるため、で読み取ることができますdmesg。カーネル自体によって生成されるメッセージと同様に、これらのメッセージは現在のカーネル構成に応じてコンソールにエコーされる場合があります。


ポイント2を補完するものとして、以前xconsoleは何が起こっていたかを追跡するために実行することが一般的でした(Linux上だけでなく);-)。(そして、フレームバッファに直接書き込まれたメッセージ、を避けるために例えばのSPARCstationsに。)
スティーブン・キット

@StephenKitt私が初めてSUSE Linuxを使用したとき、xconsoleを起動したか、デスクトップのメインメニューなどから起動できるように起動したと思います-正確には覚えていませんが、見ました:-)。
sourcejedi

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

@Tim "/ dev / tty0は、/ dev / tty {1..63}にあるもの(現在カーネルまたはシェルプロセス?)が現在使用しているものを表します"-カーネル。
sourcejedi

カーネルやプロセスに関係なく、物理端末自体を表すデバイスファイルは何ですか?
ティム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.