引导至 initramfs 时如何避免“无法访问 tty;作业控制已关闭”

引导至 initramfs 时如何避免“无法访问 tty;作业控制已关闭”

我现在正在测试我的自定义 initramfs,但每次日志都会有

“无法访问 tty;作业控制已关闭”。

initramfs中的/dev有四个文件:null、sda1、ttyS0。内核参数是“console=ttyS0”。

另外,我测试了ctrl+c,它工作得很好。那么这个问题怎么会发生呢?在 busybox 文档中,

为什么我不断收到“sh:无法访问 tty;作业控制已关闭”错误?为什么 Control-C 在我的 shell 中不起作用?这并不是一个真正的 uClibc 问题,但无论如何我都会在这里回答。由于您的 shell 无法获取控制终端,作业控制将被关闭。当您在 /dev/console 上运行 shell 时,通常会发生这种情况。内核不会在 /dev/console 设备上提供控制终端。您应该在普通 tty(例如 tty1 或 ttyS0)上运行 shell,一切都会完美运行。如果你真的希望你的 shell 在 /dev/console 上运行,那么你可以通过更改 drivers/char/tty_io.c 来更改设置“noctty = 1;”的行来破解你的内核(如果你喜欢这种事情)。 ”将其设置为“0”。我建议您在真正的控制台上运行 shell...

我输入 tty,它给我 /dev/console 而不是 /dev/ttyS0。

这就是有关此问题的所有信息,希望有人可以帮助我:-)

答案1

正如 pizdelect 所评论的,这是解决方案:https://raw.githubusercontent.com/brgl/busybox/master/shell/cttyhack.c

对于我来说,我只是使用::respawn:/bin/cttyhack /bin/sh.

答案2

重新编译cttyhack.c太麻烦了,把/bin/sh包在shell里就可以了:

setsid sh -c 'exec sh </dev/tty1 >/dev/tty1 2>&1'

将工作。

答案3

这是一个更短的解决方案:

exec setsid sh </dev/tty1 >/dev/tty1 2>&1

如果你只想运行agetty,那么这甚至更短:

exec setsid agetty tty1 </dev/tty1 >/dev/tty1 2>&1

相关内容