如何关闭使用 Yocto 构建的嵌入式系统上的控制台?

Esk*_*lva 5 linux console linux-kernel embedded-linux yocto

我正在运行由 Yocto Zeus 构建的 Linux 内核 4.14.149,并且正在运行 2019.07 U-boot。根据我们安全团队的建议,我正在尝试摆脱 Linux 控制台。我不担心调试(一旦我让它工作无论如何);我们还有其他方法将系统日志从机器中取出,而这不会在软件开发板上完成。该机制已经到位,并且已经过测试工作。我们有一个 i.MX6 作为我们的核心(这是一个嵌入式系统),并且我们在开发板上的控制台有专用的 UART5。

我尝试了几种不同的方法来做到这一点。第一个是禁用帧缓冲区控制台内核配置 ( CONFIG_FRAMEBUFFER_CONSOLE)。这种方法的主要问题是它禁用了启动屏幕。我们在 U-boot 中出现了一个闪屏(并且由 Linux 再次显示),但是 Linux 在启动时似乎重置了帧缓冲区或其他内容,导致显示闪烁并在我们启动之前暂时空白。应用程序启动,这是不可接受的(这也是我们在 U-boot 和 Linux 中放置启动屏幕的原因)。

我还尝试在命令行上设置“console=”。这接近我们想要实现的目标,因为控制台不再从 UART 输出,但我们看到它开始出现在启动屏幕顶部的显示屏上。我还没有找到任何方法来解决这个问题(如果需要,我可以上传屏幕截图)。

仅仅完全消除控制台参数似乎不起作用,它仍然来自 UART。根据串行控制台文档,这是可以预料的,该文档表示它只使用第一个可用的设备。

我尝试在 Linux 源代码的 main.c 中注释掉控制台初始化,它很快就爆炸了。

我尝试设置为网络控制台(请参阅在嵌入式系统上将内核控制台发送到哪里?),但启动屏幕仍然被覆盖,与设置为无情况相同。

我尝试的最后一件事就是将其设置为虚假设备(Linux 命令行上的“console=ttymxc9”)。虽然这似乎有效(显示器或 UART 上没有数据),但它似乎在启动过程中停止(崩溃?)并且无法获取日志(它在我们的应用程序服务运行之前停止)。我说停止是因为我们为 Linux 配置了心跳,并且我们仍然获得正确的 LED 心跳行为。然而,我添加到我们的构建中的 systemd 服务似乎都没有运行(我添加了一个服务,用于在启动后将 Journalctl 日志文件保存到外部 SD 卡上的文件中,以进行调试,直到我开始工作为止)

至此,我已经没有关于如何摆脱控制台同时保持闪屏完整的想法了。禁用 Linux 控制台的正确方法是什么?

Jia*_* Xu 4

对于内核版本 5.11 及更高版本:

在“设备驱动程序”下的“字符设备”子菜单中make menuconfig,有一个名为“空 TTY 驱动程序”( CONFIG_NULL_TTY) 的选项,您可以启用该选项并将其添加console=ttynull到内核引导命令行,以便简单地丢弃所有控制台输出。

您还可以禁用CONFIG_VTCONFIG_UNIX98_PTYS,因为您根本不需要通过控制台与程序交互。

对于较旧的内核(例如我的 4.14):您可以通过以下位置的差异添加此支持: https: //lore.kernel.org/lkml/20190403131213.GA4246@kroah.com/T/,然后按照上面的说明进行操作。

  • 看来此支持在 4.14 中不可用,并且是在 5.4 和 5.11 之间添加的,但我能够将其向后移植到我的内核而没有问题。我将更新您的答案(假设我可以)并附上我使用的补丁的链接以及我是如何进行的。谢谢。 (2认同)