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

Axe*_*ine 161 linux tty console

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

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

dch*_*kov 116

来自Kernel.org 上Linux 内核文档

/dev/tty        Current TTY device
/dev/console    System console
/dev/tty0       Current virtual console
Run Code Online (Sandbox Code Playgroud)

在过去的美好时光/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始终是当前控制台。

  • @SFun28,我总是使用`sudo -i`,瞧——一个root shell。 (10认同)
  • 不错的运动!Ubuntu 锁定 root,因此在 Ubuntu 上重现它的一种方法是:`$ sudo sh -c "sleep5; echo tty0 > /dev/tty0"` (7认同)
  • 写入需要 root 权限的文件的一种习惯用法是 echo stuff | 须藤三通/dev/tty0 >/dev/null; (5认同)

jll*_*gre 69

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

  • /dev/tty[0-N](N是最高的归属 TTY 编号,例如 63) 是您切换到的虚拟控制台之一control- alt-F1等等;

  • /dev/tty0 默认情况下也是虚拟控制台;

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

  • @RonVince 我的意思是`/dev/tty` 可以是不同的设备,如果有的话,取决于打开它的进程。答案已更新。 (2认同)

sou*_*edi 31

/开发/控制台

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

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

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

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

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

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

systemd-nspawn容器内,标准/dev/console文件被替换为伪终端设备 (PTY)。这些最好被描述为虚拟终端设备。它们是动态创建的,也用于实现像 GNOME 终端这样的图形终端模拟器,以及像ssh.

/开发/ tty0

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

您还可以使用 读取和写入当前 VT /dev/tty0tty0是通常的内核控制台,例如,如果您没有明确选择一个。“系统首先寻找 VGA 卡 [这是 VT 运行的地方],然后寻找串行端口”。您还可以将控制台设置为特定的 VT,例如console=tty1.

“如果你的系统中没有VGA卡,第一个串口将自动成为控制台。” “串行控制台”之类ttyS0的可能是tty0. 不能在串行控制台之上使用 VT 系统。

/开发/ tty

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

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