如何找到 /dev/console 连接到的物理设备?
Posted
技术标签:
【中文标题】如何找到 /dev/console 连接到的物理设备?【英文标题】:How can I find which physical device /dev/console connects to? 【发布时间】:2013-03-07 18:16:12 【问题描述】:有一个名为/dev/console
的设备文件,其(major,minor)
是(5,1)
。
当我使用串行控制台启动时,它会像 /dev/ttyS0
那样连接到我的 UART 端口。
但是当我在禁用串行控制台的情况下启动时,/dev/console
似乎连接到其他地方,/dev/ttyS0
总是连接到同一个物理设备,即UART0
。
是否有任何迹象(如/proc
或/sys
中的某些内容)显示此类信息?我在那里尝试过,但没有找到我想要的。
我开始追踪 Linux 内核源代码以澄清它们之间的关系。
谁能给我一些提示?何时、何地、如何以及如何确定/dev/console
连接的物理设备?
编辑:最新发现是:
/dev/console
由内核参数的console=
配置,而getty
又使用它来打开stdin/stdout/stderr
。如果未指定console=
,则/dev/null
将作为stdin/stdout/stderr
打开。但我不确定它们是否与/dev/console
完全相同,这意味着/dev/console
可以将其I/O 连接到不同的物理设备。
如果插入 USB HID 键盘且 console=
未配置为 UART,则可以读取 /dev/console
。因此/dev/console
== /dev/null
似乎没什么意义。
需要更多调查。
【问题讨论】:
试试看console=
参数是如何从内核命令行处理的。
是的,我看过了,原来参数被传递给init
,然后又传递给getty_main()
,这是getty
在busybox
中的实现。相关部分是close
原来的标准输入,然后根据传递的参数open
一个新的。所以我正在寻找一种可以从文件描述符中检索路径的方法;因为如果没有指定console=
,我想知道“默认”设备是什么。
如果没有为getty
指定控制台,init
打开的第一个stdin/stdout/stderr似乎是/dev/null
。有兴趣的可以去init_main()
->console_init()
->bb_sanitize_stdio()
busybox
的来源。
你有文件/sys/dev/char/5:1/active
吗?它应该包含实际设备的名称。
不,我的系统没有该文件。
【参考方案1】:
我认为/sys/devices/virtual/tty/console/active
是您正在寻找的。p>
【讨论】:
不幸的是,我的系统上没有这样的文件,这是一个基于 ARM 的嵌入式设备。目前我了解到的是控制台可以通过/etc/inittab
进行配置。
在内核内部,以console=初始化的最后一个模块被配置为控制台。如果我理解正确,那么 inittab 用于配置将使用哪个 tty 终端来运行登录程序。
仅供参考 Linux 2.6.35 没有该文件,一些较新的 Linux 系统有它。
在我的桌面 linux 上,这显示tty0
,然后/sys/devices/virtual/tty/tty0/active
显示tty7
和tty7
是我的X 服务器。
@CMCDragonkai:我相信这意味着tty7
是活跃的VC,但/dev/console
输出到tty0
。【参考方案2】:
来自http://man7.org/linux/man-pages/man4/console.4.html: “当前的控制台也由 /dev/console 或 /dev/tty0,主设备号为 4 的字符设备 和次要编号 0。”
我希望这就是你想要的。
【讨论】:
以上是关于如何找到 /dev/console 连接到的物理设备?的主要内容,如果未能解决你的问题,请参考以下文章
Tungsten Fabric架构解析丨TF如何连接到物理网络
Windows 多显示器:当目标可用但不活动时,如何确定目标是不是物理连接到源?