~からこの回答到着Linux:/dev/console、/dev/tty、および/dev/tty0の違い
~から 文書:
/dev/tty Current TTY device /dev/console System console /dev/tty0 Current virtual console
昔は
/dev/console
sysadminコンソールがありました。 TTYは、サーバーに接続されたユーザーのシリアルデバイスです。 Now/dev/console
と/dev/tty0
現在の表示を表し、通常は同じです。console=ttyS0
にgrub.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/ttyn
)n
別の返信話す:
カーネル文書には
/dev/console
文字デバイス番号が5:1で指定されています。この文字デバイスを開くと、コンソールリストの最後のttyである「デフォルト」コンソールが開きます。
console=
「コンソールリスト」はすべてを意味しますか?起動オプション?
「/dev/console
5: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秒後にfbcon
inに切り替えます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
?
console
技術的に/で読み書きできますtty0
。たとえば、getty
ログインを許可するにはaを実行しますtty0
。しかし、これは速いハッキングとしてのみ便利です。これは、Linuxで複数の仮想コンソールを利用できないことを意味するためです。systemd
sysfs
デフォルトのTTYデバイスを検出するには、/ dev / consoleデバイスに関連する属性を見つけます。これにより、ユーザーがbootを介してカーネルコンソールを設定すると、シリアルコンソールがsystemd
自動的に作成され、getty
ログインが許可されますconsole=ttyS0
。これは便利です。このコンソールを2つの異なる場所に設定する必要はありません。もう一度参照してくださいman systemd-getty-generator
。しかし、実際にはこれについての余地はsystemd
ありません。/dev/console
システムの起動中にsysfsがインストールされていない可能性があります。しかし、あなたはできるだけ早くエラーと進捗メッセージを表示できるようにしたいです!だから我々はポイント1)に戻ります。カーネルはPID 1で始まり、stdin/stdout/stderrを
/dev/console
。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
。ユーザーの現在の仮想コンソールに
console
緊急メッセージを書き込むことができます。tty0
これは、コンソールに印刷された緊急カーネルメッセージと同様の緊急ユーザースペースエラーメッセージに役立ちます(参考資料を参照man dmesg
)。ただし、少なくともシステムの起動が完了するまで、これを行うのは一般的ではありません。rsyslogにこのページの例、カーネルメッセージをに印刷します
/dev/console
。カーネルはすでにデフォルトでこれを行うので、Linuxでは意味がありません。私が再び見つけることができない例の1つは、カーネルではなくメッセージにこれを使用するのは良い考えではないということです。これは、コンソールにあまりにも多くのsyslogメッセージがあふれて、あまりにも多くの邪魔になるからです。systemd-journaldには、すべてのログをコンソールに渡すオプションもあります。原則として、これは仮想環境でのデバッグに役立ちます。しかし、デバッグ目的で、我々は一般的に
/dev/kmsg
。これにより、カーネルログバッファに保存して使用できますdmesg
。カーネル自体によって生成されたメッセージと同様に、このメッセージは現在のカーネル構成に従ってコンソールに表示されることがあります。