/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 / consolehttps://github.com/torvalds/linux/blob/master/Documentation/admin-guide/serial-console.rst
在Linux上,可以使用
console=
引导选项配置内核控制台。调用printk()
的内核代码可能会向其中写入消息,例如加载设备或发生错误时。这些消息也由内核缓冲。 (另请参阅dmesg
)。找到并启动控制台设备后,它将接收所有先前缓冲的消息。您可以多次传递
console=
来配置多个控制台,消息将被写入所有控制台。显然,您只能选择每个“类型”的一个控制台:您不能同时使用console=ttyS0
和console=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设备节点
tty1
到tty63
是虚拟终端。它们也称为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
评论
您可能对此也有兴趣