GNU/Linux >> Linux の 問題 >  >> Linux

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

/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 で読み取ることができます。 .カーネル自体によって生成されたメッセージと同様に、これらのメッセージは、現在のカーネル構成によってはコンソールに表示される場合があります。


  • Linux
    1. / dev/randomを使用してLinuxでランダムパスワードを生成する方法

    2. Linux:/ dev / console、/ dev / tty、/ dev / tty0の違いは?

    3. / dev / stdin、/ dev / stdout、および/ dev / stderrはどの程度移植可能ですか?

    1. Linux – `/ dev/ptmx`と`/dev / pts / ptmx`がデバイスファイルではないのはなぜですか?

    2. / dev/randomと/dev/ urandomをいつ使用するか?

    3. Linux – / dev / urandomで「u」という文字は何を意味しますか?

    1. /dev/dm-Z デバイスから /dev/sdX および /dev/mapper/mpathY デバイスをマップする方法

    2. Linux の /dev/zero および /dev/null ファイルとは

    3. /dev/random または /dev/urandom を base64 でエンコードする方法は?