回声你好 > /dev/console

回声你好 > /dev/console

[背景:我读完之后Linux:/dev/console、/dev/tty 和 /dev/tty0 之间的区别,我发明了一些测试来检查我的理解。结果,我了解到我对 /dev/console 的理解是不存在的:)。这里提出的一些观点可能也应该作为对上述问题的评论添加]

我运行的是 arch linux,启动时没有“console=”内核参数。 dmesg 的输出包含以下三行,在引导期间写入:

[    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。

“指向”的实际含义是什么?这和“链接到”一样吗?如果是的话,是硬链接还是软链接?


现在我在我的系统上启动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 是否指向其他“底层”原始设备?


现在我遇到了一个真正的问题:我无法查看 /dev/console 的输出。过去,X 将其图形界面放在终端 7 上,我可以通过选择 Alt-Ctl-F1 看到 /dev/console 的输出。但现在,GUI 本身位于 1 号终端上,我看不到如何“窥视”桌面下方以查看控制台字符表。我能想到的查看 /dev/console 的唯一两种方法是 1. 通过 Alt-Ctrl-Backspace 杀死 X;或 2. 使用 netconsole 查看远程计算机上的控制台输出。

问题 3:我是否正确认为当我终止 X 时,我将看到 X 运行时写入控制台的所有消息。是否有某种方法可以通过“查看”显示 GUI 的底层终端来查看控制台输出?或者我可以修改 startx 脚本,以便 GUI 显示在第二个虚拟终端而不是第一个虚拟终端上?是否有某种原因导致实施这一重大更改(将 GUI 移至现在覆盖控制台的第一个 VT)?它似乎有一个相当大的缺点,即几乎不可能看到控制台输出,所以我想了解它带来了什么好处。


现在事情对我来说真的变得很奇怪。我知道只有 root 可以写入 /dev/console。根据上面引用的 QA,我在桌面上的非 root 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

作为普通用户,当我尝试写入控制台时,我的权限被拒绝。我su到root,现在没有错误了。 (当然,我也没有得到回显的输出,我相信这是因为正如我上面所说,控制台输出“隐藏在”GUI 之下。)然后我退出 root,并通过 sudo 运行相同的命令。搞什么?

问题 5:以 root 身份运行命令和通过 sudo 运行命令有什么区别,一个应该允许,另一个应该禁止?


作为最后的练习,我按照说明设置了网络控制台设施这里。一切似乎都已连接,所有诊断/详细输出都表明控制台实际上正在被重定向。但是当我输入命令时

回声你好 > /dev/console

在本地机器上,没有错误。但也没有出现“你好”。是否是某种简单的缓冲问题导致对 /dev/console 的写入不会出现在管道的远程端?

抱歉啰嗦了,但看到现实与我的预期如此不一致,我感到很沮丧。当然,两个最大的问题是,1. 有一个 root 可以执行的命令,但在使用 sudo 运行时返回“权限被拒绝”; 2. 使用在 /dev/ttyS0 上显示 X 的新默认值似乎无法看到 /dev/console 输出。

感谢您对这五个问题的正确回答!

答案1

~去哪儿了echo hello >/dev/console

这将转到:

  1. /dev/tty0(活动虚拟终端:最后一个切换到的/dev/tty1/dev/tty2等,可能隐藏在 GUI 后面)。
  2. console=ttyXXX由最后一个内核引导命令行参数指定的串行或虚拟终端。
  3. 另一个 tty/dev/console后来被重定向为ioctl(fd, TIOCCONS).该重定向只会影响用户态输出/dev/console(内核消息将不是被重定向)。另外,为了让它更有趣,绝对没有办法确定它被重定向到哪里;-)

无论如何,回显内容/dev/console不会导致它成为内核消息并出现在 dmesg 中(以及通过netconsole或其他工具重定向内核消息的任何地方)。

[ /dev/console] 默认指向/dev/tty0.

“指向”的实际含义是什么?这和“链接到”一样吗?如果是的话,是硬链接还是软链接?

不,/dev/console是一个单独的字符设备(就像/dev/tty=>控制终端或/dev/tty0=>活动虚拟终端)。所有的魔法都发生在内核中。要获取实际的终端/dev/console点(而不是上面第 3 点重定向到的终端点),您可以使用 ioctl TIOCGDEV不像/dev/tty,可以可靠地与 一起使用/dev/console,因为/dev/console不能引用伪 tty。

有没有某种方法可以通过“查看”显示 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
...

相关内容