[背景:我读完之后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
?
这将转到:
/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
.“指向”的实际含义是什么?这和“链接到”一样吗?如果是的话,是硬链接还是软链接?
不,/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
...