/ dev / console是做什么用的?


13

这个答案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=ttyS0grub.conf。在那之后你/dev/tty0是一个显示器,/dev/console/dev/ttyS0

通过“ 系统控制台 ”,/dev/console看起来像是文本物理终端的设备文件,就像/dev/tty{1..63}虚拟控制台的设备文件一样。

在我看来,“ /dev/console/dev/tty0表示当前显示的内容通常是相同的” /dev/console也可以是虚拟控制台的设备文件。/dev/console似乎/dev/tty0比like /dev/tty{1..63}/dev/tty0是当前处于活动状态的虚拟控制台,可以是任何一个/dev/tty{1..63})。

什么/dev/console啊 这有什么用途?

/dev/console玩了Linux内核相同作用/dev/tty的过程?(/dev/tty是进程的进程会话的控制终端,可以是pts,/dev/ttyn其中n1到63,或者更大?)

另一个答复提到:

内核文档/dev/console将字符设备指定为5:1。打开此字符设备将打开“主”控制台,该控制台是控制台列表中的最后一个tty。

难道“控制台列表”是指所有console=的在启动选项

/dev/console作为5:1的字符设备”,是否表示/dev/console物理文本终端(即系统控制台)的设备文件?(但同样,我在上面引用的第一条回答/dev/console可能与/dev/tty0不是物理文本终端,而是虚拟控制台的相同)

谢谢。


我为几年前丢失的那些手册页创建了一些替代品:jdebp.eu./Proposals/linux-kvt-manual-pages.html
JdeBP '18

Answers:


18

/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:设备节点用于用户空间,而不是内核;但是,它会检查是否/dev/console存在并可用,并设置init其标准输入,输出和指向的错误/dev/console

如此处所述,这/dev/console是具有固定主辅字符的字符设备,因为它是一个单独的设备(例如,用于访问内核的一种设备;不是物理设备),不等同于/dev/tty0任何其他设备。这是有点类似于与情况/dev/tty这是它自己的装置(5:0),因为它提供了比其他虚拟控制台或终端设备稍微不同的功能。

“控制台列表”确实是由console=引导参数定义的控制台列表(如果没有,则为默认控制台)。您可以通过查看来查看以这种方式定义的控制台/proc/consoles/dev/console确实提供了访问这些中的最后一个的权限:

您可以在内核命令行上指定多个console =选项。输出将出现在所有这些文件上。打开时将使用最后一个设备/dev/console


评论不作进一步讨论;此对话已转移至聊天
terdon

6

“什么/dev/console?” 在上一个答案中被回答。当您知道其他两个问题的答案时,也许答案会更清楚。

Q1。“代表物理终端本身的设备文件是什么?”

没有这样的设备文件。

Q2。“是/dev/console用来干什么的?”

在Linux上,/dev/console用于在启动(和关闭)期间显示消息。正如斯蒂芬·基特(Stephen Kitt)的回答所指出的,它也用于“单用户模式”。使用它没有其他意义。

Unix的“美好时光” /dev/console是专用的物理设备。但这在Linux中并非如此。

相关证据

1.“代表物理终端本身的设备文件是什么?”

让我尝试理解这种方式。/dev/tty{1..63}并且/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)module。即虚拟控制台设备不是由可加载的内核模块提供的;它是初始内核映像(也称为“内置”)的一部分。

其次,出现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。但是到目前为止,我还不需要关心细节。它只是工作。

$ 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将访问不同的虚拟控制台,具体取决于当前处于活动状态的虚拟控制台。人们实际使用tty0什么,并且类似地console在Linux上使用什么?

  1. 从技术上讲,您可以从console/ tty0进行读写,例如运行a getty来允许登录tty0。但这仅是一种快速的技巧。因为这意味着您无法利用Linux的多个虚拟控制台。

  2. systemd查找sysfs与/ dev / console设备关联的属性,以检测基础的TTY设备。当用户使用引导设置内核控制台时,这允许systemd自动生成a getty并允许在串行控制台上登录console=ttyS0。这很方便;它避免了在两个不同位置配置此控制台的需要。再次参见man systemd-getty-generator。但是,systemd实际上并没有/dev/console为此打开。

  3. 在系统引导过程中,您甚至可能尚未安装sysfs。但是您希望能够尽快显示错误和进度消息!因此,我们绕过点1)。内核通过将stdin / stdout / stderr连接到来启动PID 1 /dev/console。从一开始就设置这种简单的机制非常好。

  4. 在Linux容器内,文件at /dev/console可能会创建为不同的名称,而不是字符设备number 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安装方式的组合来标识。

  5. 您可以将紧急消息写入console/ tty0,以写入用户当前的虚拟控制台。这对于紧急用户空间错误消息很有用,类似于打印到控制台的紧急内核消息(请参阅参考资料man dmesg)。但是,至少在系统完成引导之后才执行此操作。

    rsyslog 在此页面上一个示例,该示例将内核消息打印到/dev/console;这在Linux上毫无意义,因为默认情况下内核已经这样做了。一个我再也找不到的示例说,将其用于非内核消息不是一个好主意,因为有太多的syslog消息,您充斥了控制台,并且妨碍了太多。

    systemd-journald同样具有将所有日志转发到控制台的选项。原则上,这对于在虚拟环境中进行调试可能很有用。虽然,对于调试,我们通常/dev/kmsg转而使用。这会将它们保存在内核日志缓冲区中,因此您可以使用读取它们dmesg。类似于内核本身生成的消息,这些消息可能会根据当前内核配置回显到控制台。


作为对第2点的补充,它通常很常见(不仅在Linux上)运行xconsole以跟踪正在发生的事情;-)。(并且避免将消息直接写入帧缓冲区,例如在SPARCstation上。)
Stephen Kitt,

@StephenKitt,当我第一次使用SUSE Linux时,我认为它启动了xconsole或将其启动,以便您可以从桌面主菜单启动它,或其他类似的东西-我不记得了,但是我已经看过它了:-)。
sourcejedi

让我尝试理解这种方式。/dev/tty{1..63}并且/dev/pts/n是代表设备本身的设备文件(尽管它们是仿真的),与进程或内核无关。/dev/tty0代表某物/dev/tty{1..63}当前正在使用的那个(也许是内核或外壳程序?)。/dev/tty代表过程会话当前使用的控制终端。/dev/console代表内核当前使用的终端?代表物理终端本身的设备文件是什么,与内核或进程无关?
蒂姆(Tim)

@Tim“ / dev / tty0代表/dev/tty{1..63}中的当前被某人(也许是内核或shell进程?)使用的那个”-内核。
sourcejedi

代表物理终端本身的设备文件是什么,与内核或进程无关?
蒂姆(Tim)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.