如何找到 /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(),这是gettybusybox中的实现。相关部分是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 显示tty7tty7 是我的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 多显示器:当目标可用但不活动时,如何确定目标是不是物理连接到源?

从物理设备连接到本地服务器期间超时

将 USB 设备连接到 Android 模拟器?

使用 PHP 在运行 Windows Server 2012 的物理服务器上连接到 SQL Server 2012

Linux 命令(258)—— consoletype 命令