从这个对Linux 的回答: /dev/console 、 /dev/tty 和 /dev/tty0 之间的区别
从 文档中:
/dev/tty Current TTY device /dev/console System console /dev/tty0 Current virtual console
在过去的美好时光
/dev/console
是系统管理员控制台。TTY 是用户连接到服务器的串行设备。现在/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
?它是干什么用的?
/dev/console
Linux内核的作用与/dev/tty
进程的作用相同吗?(/dev/tty
是进程的进程会话的控制终端,可以是一个pts,/dev/ttyn
在哪里n
是1到63,或者更多?)
另一个回复提到:
内核文档
/dev/console
将字符设备指定为编号为 5:1 的字符设备。打开这个字符设备会打开“主”控制台,它是控制台列表中的最后一个 tty。
“控制台列表”是否意味着引导选项console=
中的所有 ' ?
“/dev/console
作为编号为 5:1 的字符设备”是否意味着这/dev/console
是物理文本终端(即系统控制台)的设备文件?(但同样,我上面引用的第一个回复说/dev/console
可以与/dev/tty0
不是物理文本终端,而是虚拟控制台相同)
谢谢。
/dev/console
存在主要是为了将内核的控制台暴露给用户空间。Linux 内核的设备文档现在说/dev/console
,具有major 5和minor 1的设备节点,提供对内核认为是其与系统管理员交互的主要方式的任何访问;这可以是连接到系统的物理控制台(顶部有虚拟控制台抽象,因此它可以使用Ntty0
介于 1 和 63 之间的任何ttyN
位置),或者串行控制台,或者管理程序控制台,甚至是盲文设备。请注意,内核本身不使用: devices 节点用于用户空间,而不是用于内核;但是,它会检查是否存在且可用,并设置其标准输入、输出和错误指向./dev/console
/dev/console
init
/dev/console
如此处所述,
/dev/console
它是具有固定主要和次要的字符设备,因为它是一个单独的设备(如访问内核的一种方式;不是物理设备),不等同于/dev/tty0
或任何其他设备。这有点类似于它自己的设备 (5:0)的情况,因为它提供的功能与其他虚拟控制台或终端设备略有不同。/dev/tty
“控制台列表”确实是由
console=
引导参数定义的控制台列表(或默认控制台,如果没有的话)。您可以通过查看以这种方式定义的控制台/proc/consoles
。/dev/console
确实提供了对其中最后一个的访问:“是什么
/dev/console
?” 在上一个答案中回答。当您知道其他两个问题的答案时,也许该答案会更清楚。Q1。“代表物理终端本身的设备文件是什么?”
没有这样的设备文件。
Q2。“有什么
/dev/console
用?”在 Linux 上,
/dev/console
用于在启动(和关闭)期间显示消息。正如斯蒂芬基特的回答所指出的,它也用于“单用户模式”。使用它没有什么意义。Unix 的“过去的美好时光”
/dev/console
是一种专用的物理设备。但在 Linux 中并非如此。相关证据
1.“代表物理终端本身的设备文件是什么?”
的底层设备
/dev/tty{1..63}
是struct con_driver
。要查看所有可能的驱动程序,请查看https://elixir.bootlin.com/linux/v4.19/ident/do_take_over_console这些底层设备没有设备文件!
只有一个最小的用户空间界面来管理它们。
如果您真的想了解更多信息,模块
(M)
代表。即虚拟控制台设备不是由可加载内核模块提供的;它是初始内核映像(又名“内置”)的一部分。其次,
bind
每个子目录中的文件/sys/class/vtconsole
似乎会告诉您哪个 vtconsole 设备处于活动状态。如果我写给0
活动的,它似乎会切换到虚拟的。(GUI VT 似乎不受影响,但文本 VT 停止工作)。为假人写作1
不会激活它。任何一种方法都可以切换回真实的方法。如果我正确阅读了代码,诀窍是echo 1 > bind
它只适用于作为模块构建的控制台驱动程序(?!)。特别是对于帧缓冲控制台,在https://kernel.org/doc/Documentation/fb/fbcon.txt
/dev/fb0
中有一些关于将不同的帧缓冲设备( ...)绑定到特定虚拟控制台的更多信息。这涉及一个内核选项或一个名为.fbcon:map=
con2fbmap
当然,细节会随着内核版本、架构、固件、设备、驱动程序等的不同而有所不同。我从来没有真正使用过上面的任何接口。内核只是让
i915
//inteldrmfb
你想调用的任何东西在它加载时接管,替换例如vgacon
.看起来我的 EFI 机器从来没有
vgacon
. 所以首先它使用一个虚拟控制台,然后在 1.2 秒后切换到fbcon
,在efifb
. 但到目前为止,我不必关心细节是什么。它只是工作。2.“是干什么
/dev/console
用的?”您可以将 /dev/console 用作 TTY 设备。例如,写入它会写入特定的底层设备,该设备也有自己的字符设备号。
通常 /dev/console 绑定到 /dev/tty0,但有时它可能绑定到不同的设备。
所以在这种情况下,写入 /dev/console 将写入 /dev/tty0。反过来,写入 /dev/tty0 等同于写入当前处于活动状态的 /dev/ttyN 设备。
但这提出了一个有趣的问题。访问
tty0
将访问不同的虚拟控制台,具体取决于当前处于活动状态的控制台。人们实际使用tty0
什么,以及类似地console
在 Linux 上使用什么?console
从技术上讲,您可以从/读取和写入tty0
,例如运行 agetty
以允许登录tty0
。但这仅作为快速破解有用。因为这意味着您无法利用 Linux 的多个虚拟控制台。systemd
查找sysfs
与 /dev/console 设备关联的属性,以检测底层 TTY 设备。当用户通过启动设置内核控制台时,这允许systemd
自动生成并允许登录例如串行控制台。这很方便;它避免了在两个不同的地方配置这个控制台的需要。再次,请参阅。但是,实际上并没有为此打开。getty
console=ttyS0
man systemd-getty-generator
systemd
/dev/console
在系统引导期间,您甚至可能还没有安装 sysfs。但是您希望能够尽快显示错误和进度消息!所以我们绕到点1)。内核启动 PID 1,stdin/stdout/stderr 连接到
/dev/console
. 从一开始就设置这个简单的机制非常好。在 Linux 容器中,文件 at
/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 上毫无意义,因为默认情况下内核已经这样做了。一个我再也找不到的例子说,将它用于非内核消息不是一个好主意,因为系统日志消息太多,你会淹没你的控制台,它会阻碍太多。systemd-journald 同样具有将所有日志转发到控制台的选项。原则上,这可能对在虚拟环境中进行调试很有用。虽然,为了调试,我们通常
/dev/kmsg
转而使用。这会将它们保存在内核日志缓冲区中,以便您可以使用dmesg
. 与内核本身生成的消息一样,这些消息可能会根据当前的内核配置回显到控制台。