我现在正在测试我的自定义 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