如何关闭使用 Yocto 构建的嵌入式系统上的控制台?
How do I turn off the console on an embedded system built with Yocto?
我是 运行ning Linux Yocto Zeus 构建的内核 4.14.149,我是 运行ning 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 中注释掉控制台初始化,但很快就爆炸了。
我尝试设置为网络控制台(参见 Where do you send the kernel console on an embedded system?),但启动画面仍然被覆盖,与设置相同,没有任何情况。
我尝试的最后一件事就是将它设置为伪造设备(Linux 命令行上的“console=ttymxc9”)。虽然这似乎有效(显示器或 UART 上没有数据),但它似乎在启动过程中停止(崩溃?)并且无法获取日志(它在我们的应用程序服务 运行s 之前停止) .我说失速是因为我们为心跳配置了 Linux,并且我们仍然获得正确的 LED 心跳行为。 None 我添加到构建中的 systemd 服务似乎 运行(我添加了一个以在启动后将 journalctl 日志文件保存到外部 SD 卡上的文件以进行调试,直到我开始工作)
此时,我运行 想不出如何在保持启动画面完好无损的情况下摆脱控制台。禁用 Linux 控制台的正确方法是什么?
对于内核版本 5.11 及更高版本:
在 make menuconfig
的“设备驱动程序”下的子菜单“字符设备”中,有一个名为“空 TTY 驱动程序”(CONFIG_NULL_TTY
) 的选项,您可以启用并添加 console=ttynull
到内核引导 cmdline,以便所有控制台输出都将被简单地丢弃。
您也可以禁用 CONFIG_VT
和 CONFIG_UNIX98_PTYS
,因为您根本不需要通过控制台与程序交互。
对于旧内核(比如我的 4.14):
您可以通过以下差异添加此支持:https://lore.kernel.org/lkml/20190403131213.GA4246@kroah.com/T/,然后按照上面的说明进行操作。
较新版本的 yocto 使用 systemd 和名为 getty.target 的服务来加载串行端口控制台。通过 运行 以下命令禁用(一次):
systemctl mask getty.target
这个答案可能不完全符合您的问题,但是,它可以作为其他用户的研究来源,就像我一样。我使用以下命令临时打开和关闭控制台 (ttyS0)。
systemctl stop serial-getty@ttyS0.service
和
systemctl start serial-getty@ttyS0.service
我是 运行ning Linux Yocto Zeus 构建的内核 4.14.149,我是 运行ning 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 中注释掉控制台初始化,但很快就爆炸了。
我尝试设置为网络控制台(参见 Where do you send the kernel console on an embedded system?),但启动画面仍然被覆盖,与设置相同,没有任何情况。
我尝试的最后一件事就是将它设置为伪造设备(Linux 命令行上的“console=ttymxc9”)。虽然这似乎有效(显示器或 UART 上没有数据),但它似乎在启动过程中停止(崩溃?)并且无法获取日志(它在我们的应用程序服务 运行s 之前停止) .我说失速是因为我们为心跳配置了 Linux,并且我们仍然获得正确的 LED 心跳行为。 None 我添加到构建中的 systemd 服务似乎 运行(我添加了一个以在启动后将 journalctl 日志文件保存到外部 SD 卡上的文件以进行调试,直到我开始工作)
此时,我运行 想不出如何在保持启动画面完好无损的情况下摆脱控制台。禁用 Linux 控制台的正确方法是什么?
对于内核版本 5.11 及更高版本:
在 make menuconfig
的“设备驱动程序”下的子菜单“字符设备”中,有一个名为“空 TTY 驱动程序”(CONFIG_NULL_TTY
) 的选项,您可以启用并添加 console=ttynull
到内核引导 cmdline,以便所有控制台输出都将被简单地丢弃。
您也可以禁用 CONFIG_VT
和 CONFIG_UNIX98_PTYS
,因为您根本不需要通过控制台与程序交互。
对于旧内核(比如我的 4.14): 您可以通过以下差异添加此支持:https://lore.kernel.org/lkml/20190403131213.GA4246@kroah.com/T/,然后按照上面的说明进行操作。
较新版本的 yocto 使用 systemd 和名为 getty.target 的服务来加载串行端口控制台。通过 运行 以下命令禁用(一次):
systemctl mask getty.target
这个答案可能不完全符合您的问题,但是,它可以作为其他用户的研究来源,就像我一样。我使用以下命令临时打开和关闭控制台 (ttyS0)。
systemctl stop serial-getty@ttyS0.service
和
systemctl start serial-getty@ttyS0.service