[背景:読んだ後Linux:/dev/console、/dev/tty、および/dev/tty0の違い、私は私の理解を確認するためにいくつかのテストを考案しました。その結果、私は/dev/consoleの私の理解がないことに気づきました:)。ここで提起されたポイントのいくつかは、おそらく上記の質問に対するコメントとして追加されるべきです。
私はアーチLinuxを実行しており、起動時に "console ="カーネルパラメータはありません。 dmesg の出力には、起動時に作成された次の 3 行が含まれます。
[ 0.183964] printk: console [tty0] enabled
...
[ 4.908815] fbcon: Deferring console take-over
...
[ 5.217652] fbcon: Taking over console
質問1:上記のQAの主張にリンクしました。
/dev/console は、デフォルトで /dev/tty0 を指す仮想デバイスのセットです。
"point to"は実際にはどういう意味ですか? 「リンクする」という意味ですか?それでは、ハードリンクなのか、ソフトリンクなのか?
今私のシステムでXを起動します。私はopenboxを使用しており、通常どおり最初の仮想コンソールにデスクトップが表示されます。 (つまり、Alt-Ctl-F2を押すと新しいログイン端末が作成され、Alt-Ctl-F1を押すとgui-desktopiに戻ります。)デスクトップで開かれた最初のxtermに次のように入力すると、次のようになります。
crw------- 1 root root 5, 1 Nov 30 01:07 /dev/console
crw-rw-rw- 1 root tty 5, 0 Nov 29 23:23 /dev/tty
crw--w---- 1 root tty 4, 0 Nov 30 01:07 /dev/tty0
crw-rw---- 1 root uucp 4, 64 Nov 29 23:15 /dev/ttyS0
[root@scott-dell7577 ~]# tty
/dev/pts/0
したがって、この場合 /dev/console は何も指さないようです。
質問2:「fbconがコンソールを占有していたため」/dev/consoleはもはや/dev/tty0を指していませんか? /dev/consoleが別の「デフォルト」rawデバイスを指していますか?
今、本当の問題がありました。 /dev/console の出力を表示できません。過去にはXのグラフィカルインタフェースがターミナル7にあり、Alt-Ctl-F1を選択すると/dev/consoleの出力を見ることができました。ただし、GUI自体はターミナル1にあり、コンソールの文字テーブルを表示するためにデスクトップの下を「見る」方法がわかりません。 /dev/consoleを見るために私が考えることができる唯一の2つの方法は、1. Alt-Ctrl-Backspaceを介してXを終了するか、2. netconsoleを使用してリモートシステムからコンソール出力を表示することです。
質問3:Xを終了すると、Xの実行中にコンソールに記録されたすべてのメッセージが表示されると思いますか? GUIを表示する基本端末を「見つけて」コンソール出力を表示する方法はありますか?それとも、GUIが最初の仮想端末ではなく2番目の仮想端末に表示されるようにstartxスクリプトを変更できますか?この画期的な変更が実装された理由はありますか(現在のコンソールを扱う最初のVTにGUIを移動)。コンソール出力がほとんど見られないという点でかなり大きな欠点があるようですが、どのような利点をもたらすか知りたいです。
今、状況は本当に奇妙になりました。ルートだけが/dev/consoleに書き込むことができることを知っています。上記のQAに従って、デスクトップのルートではなくxtermに次のように入力しました。最後のコマンドへの応答を説明してもよろしいですか?
[scott@scott-dell7577 ~]$ echo hello >/dev/console
bash: /dev/console: Permission denied
[scott@scott-dell7577 ~]$ su
Password:
[root@scott-dell7577 scott]# echo hello >/dev/console
[root@scott-dell7577 scott]# exit
exit
[scott@scott-dell7577 ~]$ sudo echo hello > /dev/console
bash: /dev/console: Permission denied
一般ユーザーとしてコンソールに書き込もうとすると、権限が拒否されました。 rootに訴えていましたが、今はエラーはありません。 (もちろん、出力もエコーされません。これは上記のようにコンソール出力がGUIの下に「隠されている」ためだと思います。)その後、ルートを終了してsudoを介して同じコマンドを実行しました。何してるの?
Q5:rootでコマンドを実行することとsudoを介してコマンドを実行することの違いは何ですか? 1つは許可し、もう1つは許可しないでください。
最後の練習として、指示に従ってネットワークコンソール施設を設定しました。ここ。すべてが接続されているように見え、すべての診断/詳細出力は、コンソールが実際にリダイレクトされていることを示します。しかし、コマンドを入力すると
エコこんにちは> / dev / console
ローカルコンピュータにエラーはありません。しかし、「こんにちは」もありませんでした。 /dev/consoleへの書き込みがパイプのリモートエンドに表示されないようにする単純なバッファリングの問題はありますか?
言葉が長くなって申し訳ありませんが、現実は私の期待にそんなに一致していませんでした。もちろん、最大の問題の2つには、1. rootが実行できるコマンドがありますが、sudoで実行すると「Permission Denied」を返します。 2. /dev に X を表示する新しいデフォルト値を使用することはできません。 /ttyS0 /dev/console に出力します。
5つの質問に対する正解を教えてくれてありがとう!
答え1
〜どこに行きましたか
echo hello >/dev/console
?
次に移動します。
/dev/tty0
(アクティブな仮想端末:最後に切り替えられた端末など/dev/tty1
は/dev/tty2
GUIの後ろに隠れることがあります。)console=ttyXXX
最後のカーネル起動コマンドライン引数で指定されたシリアルまたは仮想端末。- 他のttyは
/dev/console
後でにリダイレクトされますioctl(fd, TIOCCONS)
。このリダイレクトはユーザーモード出力にのみ影響します/dev/console
(カーネルメッセージはいいえリダイレクトされます)。また、より興味深くするためにリダイレクトされる場所を確認する方法はまったくありません;-)
それにもかかわらず、コンテンツをエコーしても/dev/console
カーネルメッセージになり、dmesgに表示されるわけではありません(そしてnetconsole
カーネルメッセージが他のツールを介してリダイレクトされるところ)。
[
/dev/console
]はデフォルト値を指します/dev/tty0
。"point to"は実際にはどういう意味ですか? 「リンクする」という意味ですか?それでは、ハードリンクなのか、ソフトリンクなのか?
いいえ、/dev/console
別の文字デバイスです(例:/dev/tty
=>制御端末または/dev/tty0
=>アクティブ仮想端末)。すべての魔法はカーネルで発生します。実際のエンドポイント/dev/console
(上記の3番でリダイレクトされたエンドポイントの代わりに)を取得するには、ioctlを使用できますTIOCGDEV
。同じではない/dev/tty
はpseudo-ttyを参照できない/dev/console
ため、一緒に安定して使用できます。/dev/console
GUIを表示する基本端末を「表示」コンソール出力を表示する方法はありますか?
持つ/dev/vcs*
ただし、GUIの背後で新しいデータがスクロールされるのではなく、最後の行が上書きされ続けると、vtsは正しく更新されません。
# perl -0777 -CO -e '
$c = unpack 'xC', <>; close ARGV;
$t = join "", map chr $_, unpack "L*", <>;
s/(.{$c})/$1\n/g, s/ +$//mg, s/\n+$/\n/ for $t;
print $t
' /dev/vcs{a,u}
...
content of the active vt
...