bash: nenhum controle de trabalho neste shell

8

Eu tenho um sistema Linux mínimo.

init é /bin/bash, apenas um mínimo de bibliotecas /lib/, /dev/é preenchido estaticamente, sem daemons em execução (sem udev, ..)

Quando o bash inicia, recebo o seguinte erro:

bash: cannot set terminal process group (-1) inappropriate ioctl for device
bash: no job control in this shell

Quando inicio o bash com strace, recebo a seguinte saída:

rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
open("/dev/tty", O_RDWR|O_NONBLOCK)     = -1 ENXIO (No such device or address)
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0

....

readlink("/proc/self/fd/0", "/dev/console"..., 4095) = 12
stat("/dev/console", {st_mode=S_IFCHR|0600, st_rdev=makedev(5, 1), ...}) = 0
open("/dev/console", O_RDWR|O_NONBLOCK) = 3

Parece que o bash não pode ser aberto /dev/tty. Mas /dev/ttyexiste /dev/e tem permissões corretas:

ll /dev/tty*
crw-rw-rwT 1 root root 5, 0  2014-Sep-29  23:39:47  dev/tty
crw------T 1 root root 4, 0  2015-Dec-23  20:10:18  dev/tty0
crw------T 1 root root 4, 1  2015-Dec-23  20:10:18  dev/tty1

Por que não pode bashabrir /dev/tty? E o que o ENXIOerro significa?

Martin Vegter
fonte

Respostas:

4

init é /bin/bash

Como eu disse em https://unix.stackexchange.com/a/197472/5132 , init=/bin/shnão obtém os sistemas de arquivos "API" montados, trava de maneira desagradável sem liberação de cache quando se digita exit ( https: //unix.stackexchange .com / a / 195978/5132 ) e, em geral, deixa ao (super) usuário executar manualmente as ações que tornam o sistema minimamente utilizável.

Uma dessas ações (se você deseja usar um shell de controle de tarefas, como aparentemente faz) é adquirir um terminal de controle . /dev/ttynão é um dispositivo terminal real. É um dispositivo que redireciona para qualquer que seja o terminal de controle do processo de abertura. Se ele não tiver um , como o processo nº 1 não inicia (e geralmente o tempo todo quando um programa gerenciador de sistema real estiver sendo executado como o processo nº 1), a abertura do dispositivo falhará.

Seu sistema é muito mínimo. Você precisa executar um programa que configure um terminal de controle, inicialize uma sessão adequada e provavelmente faça alguns dos mínimos do gerenciamento de sistema, como desligar corretamente e de forma limpa, que executará o shell de controle de tarefas.

Leitura adicional

JdeBP
fonte
obrigado. Você poderia explicar como eu posso "configurar um terminal de controle / adquirir um terminal de controle"?
Martin Vegter
@MartinVegter Use o init do BusyBox.
Gilles 'SO- stop be evil'