지금은 사용자 정의 initramfs를 테스트하고 있지만 로그에 오류가 있을 때마다
"tty에 액세스할 수 없습니다. 작업 제어가 꺼져 있습니다."
initramfs의 /dev에는 null, sda1, ttyS0이라는 네 개의 파일이 있습니다. 커널 매개변수는 "console=ttyS0"입니다.
또한 ctrl+c를 테스트했는데 제대로 작동합니다. 그러면 이 문제는 어떻게 발생하는 걸까요? 비지박스 문서에서,
"sh: tty에 액세스할 수 없습니다. 작업 제어가 꺼져 있습니다." 오류가 계속 발생하는 이유는 무엇입니까? 내 쉘에서 Control-C가 작동하지 않는 이유는 무엇입니까? 이것은 실제로 uClibc 질문은 아니지만 어쨌든 여기서 답변하겠습니다. 쉘이 제어 터미널을 얻을 수 없으므로 작업 제어가 꺼집니다. 이는 일반적으로 /dev/console에서 쉘을 실행할 때 발생합니다. 커널은 /dev/console 장치에 제어 터미널을 제공하지 않습니다. 일반 tty(예: tty1 또는 ttyS0)에서 쉘을 실행해야 하며 모든 것이 완벽하게 작동합니다. 쉘이 /dev/console에서 실행되기를 원한다면 drivers/char/tty_io.c를 변경하여 "noctty = 1;"을 설정하는 행을 변경하여 커널을 해킹할 수 있습니다. ”를 “0”으로 설정하세요. 실제 콘솔에서 셸을 실행하는 것이 좋습니다.
tty를 입력하면 /dev/ttyS0 대신 /dev/console이 표시됩니다.
이것이 이 문제에 대한 모든 정보입니다. 누군가가 나를 도울 수 있기를 바랍니다 :-)
답변1
pizdelect가 언급했듯이 이것이 해결책입니다.https://raw.githubusercontent.com/brgl/busybox/master/shell/cttyhack.c.
저는 그냥 ::respawn:/bin/cttyhack /bin/sh
.
답변2
재컴파일은 cttyhack.c
너무 번거롭습니다. 셸에 /bin/sh를 래핑하면 됩니다.
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