在 Linux 内核 initramfs 上启用 tty 访问 shell 的必要配置是什么?

在 Linux 内核 initramfs 上启用 tty 访问 shell 的必要配置是什么?

当回显时,eg显示加载到arm64 平台上/dev/ram0 的Linux initramfs 上的串行控制台终端的输出,但在使用eg 从/init 脚本启动此或shellecho "serial tx to ttyAMA0" > /dev/ttyAMA0时,没有与shell 的连接。shbash/bin/busybox sh

内核命令行:
root=/dev/ram0 rw earlyprintk console=ttyAMA0,115200 console=tty0,115200 initcall_debug=1

(与用户程序的串行端口提示交互的唯一成功尝试是使用/bin/busybox getty 115200 ttyAMA0,它显示登录提示,对键盘字符的输入做出反应并将“登录错误”打印到串行端口 ttyAMA0 终端,因为没有getty启用配置,因为这对于启动时的维护/救援 shell 来说是不必要的,因此无法登录到指定的用户帐户。与“正常”shell 终端访问的唯一提示是命令/sbin/tty,什么响应“不是 tty” Screen?shell 版本,shell 已经尝试过,但无法启用对 initramfs 的串行命令行访问 据我所知,没有必要,并且不可能更改设备树中的 tty 重定向。 ,但 www 搜索引擎上没有对此问题提供全面解决方案的解释,没有任何“类似问题”建议为此提供了解决方案。)minicomshbash

调整后的最小initramfs到目前为止,示例已经过测试,无需访问串行终端。

谢谢

答案1

使用您的内核启动选项:

console=ttyAMA0,115200 console=tty0,115200

内核会将其消息输出到串行端口ttyAMA0tty0即常见的 Linux KVM 控制台)。

但是当第一个进程启动时,它不能有两个单独的 TTY 设备,因为它是标准输入(同样对于标准输出和标准错误)。与所有进程一样,它只能(最多)有 1 个 stdin、1 个 stdout 和 1 个 stderr。该设备将是主控制台,并且它是由最后的 console=内核命令行上的选项。

如果/initinitramfs 中有一个脚本,则它执行的命令将继承主控制台 - 并且仅有的它 - 作为它们的标准输入/输出/错误,除非脚本明确为它们分配另一个设备。

因此,解决您的问题的最简单的解决方案就是以console=相反的顺序指定选项:

console=tty0 console=ttyAMA0,115200

(实际上没有必要指定波特率tty0,因为它不涉及串行端口连接。但指定它也没有坏处。)

答案2

解决了xuancong84 的回答关于类似的问题:
setsid sh -c 'exec sh </dev/ttyAMA0 >/dev/ttyAMA0 2>&1'

相关内容