Linux:/ dev / console,/ dev / tty和/ dev / tty0之间的区别


133

在Linux系统上/dev/console/dev/tty和之间有什么区别/dev/tty0

它们各自的用途是什么?它们如何比较?


3
您还可能有兴趣在
凯文-

Answers:


93

文档中

/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/tty/dev/tty0

Ctrl+ Alt+ 切换到第二个控制台F2。以身份登录root。输入sleep 5; echo tty0 > /dev/tty0。按Enter并通过按Alt+ 切换到第三个控制台F3。现在,按Alt+ 切换回第二个控制台F2。键入sleep 5; echo tty > /dev/tty,按Enter并切换到第三个控制台。

您可以看到这tty是进程开始的控制台,并且tty0始终是最新的控制台。


6
好运动!Ubuntu锁定根目录,因此在Ubuntu上重现该目录的一种方法是:$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"
SFun28

10
@ SFun28,我一直使用sudo -i和瞧-根壳。
安德烈·拉斯洛

4
写入需要root特权的文件的一种习惯用法是echo echo | sudo tee / dev / tty0> / dev / null;
彼得·科德斯

该死 当Ī̲写下unix.stackexchange.com/a/229598/80483时,Ī̲ 并未意识到这个答案!
Incnis Mrsi 2015年

@ SFun28:如果可行sudo anycommand,那么sudo -i扎根也可行。没有Linux / BSD / Unix这样的东西,您无法扎根。(这样就不再是Linux / BSD / Unix。)
Evi1M4chine

60
  • /dev/console是一组虚拟设备,可以在引导时将其设置为参数。它可能会重定向到串行设备或虚拟控制台,默认情况下指向/dev/tty0。将多个console=选项传递给内核时,控制台输出将到达多个设备。

  • /dev/tty0 是当前的虚拟控制台

  • /dev/tty[1-x]是你切换到与虚拟控制台的一个control- alt- F1等等。

  • /dev/tty是与打开它的进程相关联的控制台(物理,虚拟或伪设备,如果有)的别名。与其他设备不同,您不需要root用户特权即可对其进行写入。还要注意,诸如由cron批处理过程启动的过程和类似的批处理过程之类的过程均不可用/dev/tty,因为它们没有任何关联。这些过程?在输出TTY列中有一个ps -ef


通过此语句“ / dev / tty是查询它的进程所使用的控制台”语句来查询它是什么意思?
罗恩·文斯

1
@RonVince我的意思是/dev/tty可以是其他设备(如果有),具体取决于打开它的过程。答案已更新。
jlliagre

谢谢。我是否可以知道进程实际上是在/ dev / tty中进行读写操作,而不是直接从与其相关的设备文件中进行读写操作?
罗恩·文斯

@RonVince恐怕我不确定您在问什么。你能改一下吗?
jlliagre

1
@RonVince打开/ dev / tty(不是/dev/tty[1,..,n])是用于将某些内容写入用户终端的进程的Unix(和Linux)标准。直接写入任何其他设备都是非便携式的,更加复杂且可靠性较低。进程不需要知道进程终端连接到的实际设备是什么,内核已经知道了。
jlliagre

20

/ dev /控制台

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/serial-console.rst

在Linux上,可以使用console= boot选项配置内核控制台。调用的内核代码printk()可能会向其写入消息,例如,在加载设备或发生错误时。这些消息也由内核缓冲。(另请参见dmesg)。找到并启动控制台设备后,它将接收所有先前缓冲的消息。

您可以console=多次传递以配置多个控制台,并且消息将被写入所有控制台。显然,您只能选择每个“类型”的一个控制台:您不能同时使用console=ttyS0console=ttyS1

内核文档指定/dev/console编号为的字符设备(5,1)。打开此字符设备将打开“主”控制台,该控制台是控制台列表中的最后一个tty。在连接到标准输出,标准错误和标准输入的情况下init,启动了第一个非内核进程,称为“ PID 1” /dev/console

如果所有控制台都不是tty,则打开/dev/console将返回错误ENODEV(“无此类设备”)。内核将打印记录一条消息,然后开始init。有关不是tty设备的内核控制台的示例,请参见netconsole或我最喜欢的控制台行打印机

您还可以阅读阅读tty控制台列表/sys/class/tty/console/activesystemd文档指出,所示的第一个设备是主控制台。该列表实际上与内核命令行的顺序相反。的当前内核文档错误地指出,示出的最后一个设备是主或“活性”控制台。出于某种原因,可以轮询此文件进行更改(以防删除控制台设备?)。

systemd-nspawn容器内部,标准/dev/console文件将替换为伪终端设备(PTY)。最好将它们描述为虚拟终端设备。它们是动态创建的,还用于实现图形终端仿真器(如GNOME Terminal)和用于远程访问(如)ssh

/ dev / tty0

在Linux TTY 设备节点 tty1通过tty63有虚拟终端。它们也称为VT或虚拟控制台。它们在物理控制台设备驱动程序的顶部模拟多个控制台。一次仅显示和控制一个虚拟控制台。您可以chvt通过许多功能键来切换活动端子,例如使用或Ctrl + Alt + F1。

您也可以使用读写当前VT /dev/tty0tty0是常用的内核控制台,例如,如果您未明确选择一个控制台。“系统首先寻找运行VT的VGA卡,然后寻找串行端口”。您也可以将控制台设置为特定的VT,例如console=tty1

“如果您的系统中没有VGA卡,第一个串行端口将自动成为控制台。” 类似的“串行控制台” ttyS0可能是的最常见替代方案tty0。无法在串行控制台顶部使用VT系统。

/ dev / tty

/dev/tty是POSIX指定的三个标准设备文件/dev/之一(是POSIX指定的三个目录名称之一)。打开它等同于打开当前过程的控制终端。至少在Linux上进程首次打开终端时设置控制终端。例如,在中init,它将指代/dev/console

从控制终端分离是传统上启动后台进程所需的步骤之一,例如系统日志记录守护程序。成为后台进程的步骤非常复杂,但是具体来说,与控制终端分离的步骤是setsid系统调用。在更现代的系统中,初始化系统(例如systemd)首先在没有任何控制终端的情况下启动服务。

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.