「なに/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/tty0
reprsentsに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/fb0
、https: //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では何を使用していますか?
技術的には、console
/ から読み書きすることができます。tty0
たとえば、を実行しgetty
てログインできるようにしtty0
ます。しかし、これは簡単なハックとしてのみ有用です。それは、Linuxの複数の仮想コンソールを利用できないことを意味するためです。
systemd
sysfs
基礎となるTTYデバイスを検出するために、/ dev / consoleデバイスに関連付けられた属性を探します。これが可能にsystemd
自動的に産卵Aにgetty
、ユーザーがでブートしてカーネルコンソールを設定する例えば、A、シリアルコンソール、上のログインを許可しますconsole=ttyS0
。これは便利です。このコンソールを2つの異なる場所で構成する必要がなくなります。繰り返しますが、を参照してくださいman systemd-getty-generator
。ただし、systemd
実際に/dev/console
はこのために開きません。
システムのブートストラップ中に、sysfsがまだマウントされていない場合もあります。ただし、できるだけ早くエラーメッセージと進行メッセージを表示できるようにする必要があります。したがって、ポイント1)に移動します。カーネルは、に接続されたstdin / stdout / stderrでPID 1を開始し/dev/console
ます。この単純なメカニズムを最初から設定しておくと非常に便利です。
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
マウントの組み合わせによって識別されます。
緊急メッセージをconsole
/ tty0
に書き込んで、ユーザーの現在の仮想コンソールに書き込むことができます。これは、コンソールに出力される緊急カーネルメッセージに似た、緊急のユーザー空間エラーメッセージに役立ちます(を参照man dmesg
)。ただし、少なくともシステムの起動が完了したら、これを行うことは一般的ではありません。
rsyslogのこのページには、カーネルメッセージを出力する1つの例があります/dev/console
。カーネルはデフォルトで既にそうしているので、これはLinuxでは無意味です。私が再び見つけられない1つの例は、あまりにも多くのsyslogメッセージがあり、コンソールをあふれさせ、それが邪魔になるため、これを非カーネルメッセージに使用することは良い考えではないと言います。
systemd-journaldにも同様に、すべてのログをコンソールに転送するオプションがあります。原則として、これは仮想環境でのデバッグに役立ちます。ただし、デバッグのために、通常は/dev/kmsg
代わりに転送します。これにより、カーネルログバッファーに保存されるため、で読み取ることができますdmesg
。カーネル自体によって生成されるメッセージと同様に、これらのメッセージは現在のカーネル構成に応じてコンソールにエコーされる場合があります。