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

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

评论

您可能对此也有兴趣

#1 楼

摘自Kernel.org上的Linux Kernel文档:
/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/tty。键入/dev/tty0。按Enter并按Alt + F3切换到第三个控制台。
现在按Alt + F2切换回第二个控制台。键入root,按Enter键并切换到第3个控制台。
您可以看到sleep 5; echo tty0 > /dev/tty0是进程开始的控制台,而sleep 5; echo tty > /dev/tty是始终最新的控制台。

评论


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

–SFun28
2013年1月31日20:43

@ SFun28,我一直使用sudo -i和voila-根外壳。

–安德烈·拉斯洛(AndréLaszlo)
2014年3月23日22:30在

写入需要root特权的文件的一种习惯用法是echo echo | sudo tee / dev / tty0> / dev / null;

– Peter Cordes
2014年8月5日12:21



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

– Incnis Mrsi
2015年9月14日15:11

@ SFun28:如果sudo anycommand起作用,那么sudo -i成为root也可以。没有Linux / BSD / Unix这样的东西,您无法扎根。 (那么它将不再是Linux / BSD / Unix。)

– Evi1M4chine
17 Mar 21 '14:43



#2 楼



/dev/console是一组虚拟设备,可以在引导时将其设置为参数。它可能会重定向到串行设备或虚拟控制台,默认情况下指向/dev/tty0。当将多个console=选项传递到内核时,控制台输出将转到多个设备;您使用control-alt-F1切换到的虚拟控制台,依此类推;


/dev/tty[0-N]也是默认情况下的虚拟控制台;与打开控制台的进程相关联的控制台(物理,虚拟或伪设备,如果有)的别名。与其他设备不同,您不需要root用户特权即可对其进行写入。还请注意,像N启动的进程和类似的批处理一样,它们都没有可用的/dev/tty0,因为它们没有任何关联。这些过程在/dev/tty输出的cron列中具有/dev/tty



评论


从此语句“ / dev / tty是查询它的进程所使用的控制台”的语句来查询是什么意思?

–罗恩·文斯(Ron Vince)
2015年9月19日下午2:33

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

– jlliagre
2015年9月19日在8:28

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

–罗恩·文斯(Ron Vince)
2015年9月19日14:55



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

– jlliagre
2015年9月19日在20:36

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

– jlliagre
2015年9月20日15:31

#3 楼

/ dev / console

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连接到标准输出,标准错误和标准输入开始的。 /dev/console返回错误ENODEV(“无此设备”)。内核将打印一条日志消息,并无论如何启动init。有关不是tty设备的内核控制台的示例,请参见netconsole或我最喜欢的控制台行打印机。

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

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

/ dev / tty0

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

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

“如果您的系统中没有VGA卡,则第一个串行端口将自动成为控制台。”诸如ttyS0之类的“串行控制台”可能是tty0的最常见替代方案。

/ dev / tty

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

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

评论


是否有可能呼应其中任何一个?像回声“它从哪里出来?” >> / dev / ttt ... yyy ...

– dotbit
19/12/10在10:52

@dotbit写一个问题。您可以链接到此答案。您也可以在此处下一个临时评论,如果您愿意,可以给我发送指向您问题的链接。

– sourcejedi
19/12/10在10:55