Вопрос или проблема
Я сейчас тестирую свой кастомный initramfs, но каждый раз в логе появляется
“не удается получить доступ к tty; управление заданиями отключено”.
В /dev в initramfs есть четыре файла: null, sda1, ttyS0.
Параметр ядра ‘console=ttyS0’.
Также я тестировал ctrl+c, все работает нормально. Как могла возникнуть эта проблема?
В документации busybox,
Почему я продолжаю получать ошибки “sh: не удается получить доступ к tty; управление заданиями отключено”? Почему Control-C не работает в моей оболочке? Это не совсем вопрос uClibc, но я все равно отвечу на него здесь. Управление заданиями будет отключено, поскольку ваша оболочка не может получить управляющий терминал. Это обычно происходит, когда вы запускаете оболочку на /dev/console. Ядро не предоставит управляющий терминал на устройстве /dev/console. Вам следует запускать свою оболочку на обычном tty, таком как tty1 или ttyS0, и тогда все будет работать идеально. Если вы СОВСЕМ хотите, чтобы ваша оболочка работала на /dev/console, тогда вы можете изменить свое ядро (если вам это интересно), изменив drivers/char/tty_io.c, чтобы изменить строки, где устанавливается “noctty = 1;” на “0”. Я рекомендую вам вместо этого запустить оболочку на настоящем консоли…
Я ввожу tty, и он выдает мне /dev/console вместо /dev/ttyS0.
Вот вся информация об этой проблеме, надеюсь, кто-то сможет мне помочь:-)
Как указал pizdelect, вот решение: https://raw.githubusercontent.com/brgl/busybox/master/shell/cttyhack.c.
Для меня я просто использую ::respawn:/bin/cttyhack /bin/sh
.
Перекодирование cttyhack.c
слишком хлопотно, просто оберните /bin/sh в оболочку:
setsid sh -c 'exec sh </dev/tty1 >/dev/tty1 2>&1'
будет работать.
Вот более короткое решение:
exec setsid sh </dev/tty1 >/dev/tty1 2>&1
Если вы просто хотите запустить agetty
, то это еще короче:
exec setsid agetty tty1 </dev/tty1 >/dev/tty1 2>&1
Ответ или решение
Как избежать ошибки "can’t access tty; job control turned off" при загрузке в initramfs
Ошибка "can’t access tty; job control turned off" возникает в среде initramfs, когда оболочка не может получить доступ к управляющему терминалу. Это сообщеется, что ваша оболочка, скорее всего, запускается на /dev/console
, что не допускает активного управления заданиями.
Причины возникновения проблемы
-
Запуск на ненадлежащем терминале:
- По всей видимости, оболочка ищет терминал, но вместо
/dev/ttyS0
, она привязывается к/dev/console
. В результате контроля за процессами не осуществляется.
- По всей видимости, оболочка ищет терминал, но вместо
-
Параметры ядра:
- Вы указали параметр
console=ttyS0
, однако он не является достаточным для обеспечения работы оболочки. Оболочка должна запускаться на реальном терминале (обычноtty1
илиttyS0
), чтобы обеспечить управление заданиями.
- Вы указали параметр
Решения проблемы
-
Использование cttyhack:
- Один из подходов — использовать
cttyhack
, который позволяет оболочке работать, словно она подключена к управляющему терминалу. Для этого следуйте следующей команде:::respawn:/bin/cttyhack /bin/sh
- Один из подходов — использовать
-
Оборачивание командной оболочки:
- Если повторная компиляция
cttyhack.c
вызывает трудности, попробуйте обернуть вызов вашей оболочки в следующую команду:exec setsid sh -c 'exec sh < /dev/tty1 > /dev/tty1 2>&1'
Это создаст новую сессию и перенаправит стандартный ввод/вывод вашей оболочки на
/dev/tty1
, что позволит избежать проблемы с недоступностью tty.
- Если повторная компиляция
-
Использование agetty:
- Если вы хотите просто использовать
agetty
для управления вводом-выводом, ваша команда будет еще проще:exec setsid agetty tty1 < /dev/tty1 > /dev/tty1 2>&1
- Если вы хотите просто использовать
Подводя итог
Ошибка "can’t access tty; job control turned off" может быть успешно устранена путем правильного указания терминала для вашей оболочки в среде initramfs. Возможны несколько подходов для решения этой проблемы, включая использование cttyhack
, оборачивание оболочки в команды или обращение к agetty
. Эти шаги помогут обеспечить корректное управление процессами и полноценную работу системы.
Если вы столкнетесь с дополнительными трудностями или у вас возникнут другие вопросы, не стесняйтесь обращаться за помощью в профессиональные сообщества или на специализированные форумы.