【问题标题】:How do I turn off the console on an embedded system built with Yocto?如何在使用 Yocto 构建的嵌入式系统上关闭控制台?
【发布时间】:2021-06-29 15:30:07
【问题描述】:

我正在运行由 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 中。这是可以预期的,基于the serial console documentation,它说它只使用第一个可用的设备。

我尝试在 Linux 源代码中注释掉 main.c 中的控制台初始化,结果爆炸得相当快。

我尝试设置为 netconsole(请参阅 Where do you send the kernel console on an embedded system?),但启动画面仍然被覆盖,与设置为无大小写相同。

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

在这一点上,我已经没有关于如何在保持启动画面完好无损的同时摆脱控制台的想法。禁用 Linux 控制台的正确方法是什么?

【问题讨论】:

    标签: linux linux-kernel console embedded-linux yocto


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 有什么我需要启用的吗?我正在从 kernel.org 运行 vanilla 4.14.149,但我没有那个选项。我下载了最新的 4.14 (228) 并且在 Kconfig 中也没有看到它。也许这是在更高版本的内核中添加的?如果我能找到一个补丁,我也许可以将它向后移植,直到我们可以升级我们的内核。
    • 似乎这种支持在 4.14 中不可用,并且是在 5.4 和 5.11 之间添加的,但我能够毫无问题地将它反向移植到我的内核。我将更新您的答案(假设我可以),并提供指向我使用的补丁的链接以及我如何处理它。谢谢。
    • CONFIG_NULL_TTY + console=ttynull 无论如何都会带你进入登录提示,所以不完全是需要的
    【解决方案2】:

    最近版本的 yocto 使用 systemd 和一个名为 getty.target 的服务来加载串行端口控制台。通过运行以下命令(一次)禁用:

    systemctl mask getty.target
    

    【讨论】:

      【解决方案3】:

      这个答案可能不完全适合您的问题,但是,它可以作为其他用户的研究来源,就像我一样。我使用以下命令暂时打开和关闭控制台 (ttyS0)。

      systemctl stop serial-getty@ttyS0.service
      

      systemctl start serial-getty@ttyS0.service
      

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2010-10-08
      相关资源
      最近更新 更多