/dev/console
主にカーネルのコンソールをユーザー空間に公開するために存在します。デバイスに関する Linux カーネルのドキュメントには、
コンソール デバイス、/dev/console
は、システム メッセージの送信先デバイスであり、シングル ユーザー モードでのログインを許可する必要があります。 Linux 2.1.71 以降、/dev/console
カーネルによって管理されます。以前のバージョンでは、/dev/tty0
へのシンボリック リンクにする必要があります。 /dev/tty1
などの特定の仮想コンソール 、またはシリアル ポート プライマリ (tty*
、 cu*
ではありません ) デバイス、システムの構成によって異なります。
/dev/console
は、メジャー 5 とマイナー 1 を持つデバイス ノードであり、カーネルがシステム管理者と対話するための主要な手段であると見なすすべてのものへのアクセスを提供します。これは、システムに接続された物理コンソールにすることができます (仮想コンソールの抽象化が上にあるため、tty0
を使用できます) または任意の ttyN
ここで N は 1 から 63 の間です)、シリアル コンソール、ハイパーバイザー コンソール、または点字デバイスですらあります。カーネル自体は /dev/console
を使用しないことに注意してください :デバイス ノードはユーザー空間用であり、カーネル用ではありません。ただし、/dev/console
をチェックします。 存在し、使用可能で、init
を設定します 標準入力、出力、エラーが /dev/console
を指している .
ここで説明されているように、/dev/console
/dev/tty0
とは別のデバイス (物理デバイスではなく、カーネルにアクセスする手段など) であるため、メジャーとマイナーが固定されたキャラクタ デバイスです。 または他のデバイス。これは /dev/tty
の場合と似ています。 これは、他の仮想コンソールまたは端末デバイスとはわずかに異なる機能を提供するため、独自のデバイス (5:0) です。
「コンソールのリスト」は、実際には console=
によって定義されたコンソールのリストです。 起動パラメータ (または、何もない場合はデフォルトのコンソール)。 /proc/consoles
を見ると、このように定義されたコンソールを確認できます。 . /dev/console
実際にこれらの最後のものへのアクセスを提供します:
カーネルコマンドラインで複数の console=オプションを指定できます。出力はそれらすべてに表示されます。 /dev/console
を開くと、最後のデバイスが使用されます .
「/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
/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
がないようです .最初にダミーのコンソールを使用し、次に 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
に見えます /dev/console デバイスに関連付けられた属性の場合、基になる TTY デバイスを検出します。これにより、systemd
が許可されます getty
を自動的に生成する ログインを許可します。シリアル コンソール、ユーザーが console=ttyS0
で起動してカーネル コンソールをセットアップした場合 .これは便利です。このコンソールを 2 つの異なる場所で構成する必要がなくなります。繰り返しますが、man systemd-getty-generator
を参照してください。 .ただし、systemd
/dev/console
は実際には開きません
システムのブートストラップ中に、sysfs がまだマウントされていない場合もあります。しかし、できるだけ早くエラーと進行状況のメッセージを表示できるようにしたいでしょう!そのため、ポイント 1) に回り込みます。カーネルは、/dev/console
に接続された stdin/stdout/stderr で PID 1 を開始します .このシンプルなメカニズムが最初から設定されているのはとても良いことです。
Linux コンテナー内の /dev/console
のファイル キャラクターデバイス番号 5:1
ではなく、別のものとして作成される可能性があります .代わりに、PTS デバイス ファイルとして作成される場合があります。次に、この /dev/console
からログインするのが理にかなっています ファイル。 systemd
コンテナ内では、そのようなデバイスへのログインが許可されます。 man systemd-getty-generator
を参照 .
このメカニズムは、systemd-nspawn
でコンテナーを実行するときに使用されます。 指図。 ( systemd-nspawn
を実行したときだけだと思います man ページを検索してもわかりませんが)。
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
で読み取ることができます。 .カーネル自体によって生成されたメッセージと同様に、これらのメッセージは、現在のカーネル構成によってはコンソールに表示される場合があります。