INIT(8)

NOME
init, telinit - inicialização do controle de processos

RESUMO
/sbin/init [ -a ] [ -s ] [ -b ] [ -z xxx ] [ 0123456Ss ]
/sbin/init [ --version ]
/sbin/telinit [ -t SEGUNDOS ] [ 0123456sSQqabcUu ]
/sbin/telinit [ -e VAR[=VAL] ]

DESCRIÇÃO

  Init
init É o pai de todos os processos. O seu papel principal é criar processos a partir de um script guardado no ficheiro /etc/inittab (veja inittab(5)). Este ficheiro geralmente tem entradas que fazem o init gerar gettys em cada linha que os utilizadores podem registar. Também controla processos autónomos requeridos por qualquer sistema particular.

RUNLEVELS (NÍVEIS DE EXECUÇÃO)
Um runlevel é uma configuração de software do sistema que apenas permite que um grupo selecionado de processos exista. Os processos gerados pelo init para cada um destes níveis de execução estão definidos no ficheiro /etc/inittab. init pode estar em um de oito runlevels: 0–6 e S (também conhecido por s). O runlevel é modificado ao ter um utilizador privilegiado a correr telinit, o qual envia sinais apropriados para o init, a dizer-lhe para qual runlevel deve comutar.

Os runlevels S, 0, 1, e 6 são reservados. O runlevel S é usado para inicializar o sistema no arranque. Quando se arranca o runlevel S (no arranque) ou runlevel 1 (comutar de um runlevel de multi-utilizador) o sistema entra em "modo de único-utilizador", após o qual o runlevel actual é S. O runlevel 0 é usado para parar o sistema; o runlevel 6 é usado para reiniciar o sistema.

Após arrancar através de S o sistema entra automaticamente em um dos runlevels de multi-utilizador 2 a 5, a menos que existam problemas que precisem de ser corrigidos pelo administrador em modo de único-utilizador. Normalmente após entrar em modo de único-utilizador o administrador executa manutenção e depois reinicia o sistema.

Para mais informação, veja os manuais de shutdown(8) e inittab(5).

Os runlevels 7-9 são também válidos, apesar de não estarem realmente documentados. Isto porque as variantes UNIX "tradicionais" não os usam.

Os runlevels S e s são o mesmo. Internamente são nomes alternativos para o mesmo runlevel.

ARRANCAR
Após o init ser invocado como último passo da sequência de arranque do kernel, este procura o ficheiro /etc/inittab para ver se existe uma entrada do tipo initdefault (veja inittab(5)). A entrada initdefault determina o runlevel inicial do sistema. Se não existir tal entrada (ou não existir o /etc/inittab), tem de ser inserido um runlevel na consola do sistema.

O runlevel S ou s inicializa o sistema e não requer um ficheiro /etc/inittab.

Em modo de único utilizador, /sbin/sulogin é invocado em /dev/console.

Quando entra em modo de único utilizador, o init inicializa as definições stty da consola para valores sãos. O modo local é definido. A velocidade do hardware e o handshaking não são alterados.

Quando entra em modo multi-utilizador pela primeira vez, o init executa as entradas boot e bootwait para permitir que os sistemas de ficheiros sejam montados antes dos utilizadores fazerem login. Depois todas as entradas que correspondem ao runlevel são processadas.

Quando arranca um novo processo, o init primeiro verifica se o ficheiro /etc/initscript existe. Se existir, usa este script para arrancar o processo.

De cada vez que um filho termina, o init regista o facto e a razão de este ter terminado em /var/run/utmp e /var/log/wtmp, desde que estes ficheiros existam.

MODIFICAR OS RUNLEVELS
Após ter gerado todos os processos especificados, o init espera que um dos seus processos descendentes termine, por um sinal de falha de energia, ou até ser sinalizado pelo telinit para mudar o runlevel do sistema. Quando uma das três condições de cima ocorre, ele re-examina o ficheiro /etc/inittab. Novas entradas podem ser adicionadas a este ficheiro a qualquer altura. No entanto, o init ainda espera que uma das três condições de cima ocorra. Para fornecer uma resposta imediata, o comando telinit Q ou q pode acordar o init para re-examinar (recarregar) o ficheiro /etc/inittab.

Se o init não estiver em modo de único utilizador e receber um sinal de falha de energia (SIGPWR), ele lê o ficheiro /etc/powerstatus. Depois ele arranca um comando com base no conteúdo deste ficheiro.

F(AIL)
    A energia está a falhar, a UPS está a fornecer a energia. Executa as entradas powerwait e powerfail.

O(K)
    A energia foi restaurada, executa as entradas powerokwait.

L(OW)
    A energia está a falhar e a UPS tem pouca bateria. Executa as entradas powerfailnow.

Se /etc/powerstatus não existir ou conter nada mais do que as letras F, O ou L, o init irá comportar-se como se tivesse lido a letra F.

A utilização de SIGPWR e /etc/powerstatus está desencorajada. Alguém que queira interagir com o init deve usar o canal de controle /run/initctl - veja o manual initctl(5) para mais documentação sobre isto.

Quando o init é requerido para mudar o runlevel, eles envia o sinal de aviso SIGTERM a todos os processos que não estão definidos no novo runlevel. Depois espera 3 segundos antes de terminar à força estes processos via sinal SIGKILL. Note que o init assume que todos estes processos (e os seus descendentes) permanecem no mesmo grupo de processos no qual o init originalmente criou para eles. Se qualquer processo modificou a sua afiliação de grupo de processo não irá receber estes sinais. Tais processos precisam de ser terminados em separado.

TELINIT
/sbin/telinit está vinculado a /sbin/init. Recebe um argumento de um caractere e faz sinal ao init para executar a acção apropriada. Os seguintes argumentos servem como directivas para o telinit:

0, 1, 2, 3, 4, 5 ou 6
    diz ao init para comutar para o nível de execução especificado.

a, b, c
    tell init to process only those /etc/inittab file entries having runlevel a, b or c.

Q ou q
    diz ao init para re-examinar o ficheiro /etc/inittab.

S ou s
    diz ao init para comutar para modo de único utilizador.

U ou u
    diz ao init para se re-executar a ele próprio (preservando o estado). Não acontece o re-examinar do ficheiro /etc/inittab. O runlevel deve ser um de Ss0123456 caso contrário o pedido será ignorado em silêncio.

O telinit pode dizer ao init quanto tempo deve esperar entre enviar aos processos os sinais SIGTERM e SIGKILL. A predefinição é 3 segundos, mas isto pode ser mudado com a opção -t.

O telinit -e diz ao init para mudar o ambiente para os processos que ele gera. O argumento de -e ou está no formato de VAR=VAL o qual define a variável VAR para o valor VAL, ou no formato VAR (sem o sinal de igual) o qual remove a definição da variável VAR.

O telinit só pode ser invocado por utilizadores com privilégios apropriados.

O binário init verifica se é o init ou o telinit ao olhar para o seu process id; o id do verdadeiro processo do init é sempre 1. A partir conclui que em vez de se chamar o telinit pode-se simplesmente usar o init como um atalho.

AMBIENTE
O Init define as seguintes variáveis de ambiente para todos os seus filhos:

PATH
    /bin:/usr/bin:/sbin:/usr/sbin

INIT_VERSION
    Como o nome diz. Útil para determinar se um script corre directamente a partir do init.

RUNLEVEL
    O actual nível de execução do sistema.

PREVLEVEL
    O runlevel anterior (útil após uma mudança de runlevel).

CONSOLE
    A consola do sistema. Isto é realmente herdado do kernel; no entanto se não for definido o init irá defini-lo para /dev/console por predefinição.

BOOTFLAGS
É possível passar um número de bandeiras ao init a partir do monitor de arranque (ex. LILO ou GRUB). O init aceita as seguintes bandeiras:

-s, S, single
    Arranque em modo de único utilizador. Neste modo o /etc/inittab é examinado e os scripts rc de arranque são geralmente corridos antes da shell de modo de único utilizador ser arrancada.

1-5 O runlevel para o qual arrancar.

-b, emergency
    Arranca directamente para shell de único utilizador sem correr quaisquer scripts de arranque.

-a, auto
    O boot loader LILO adiciona a palavra "auto" à linha de comandos se arrancar o kernel com alinha de comandos predefinida (sem intervenção do utilizador). Se isto for encontrado o init define a variável de ambiente "AUTOBOOT" para "yes". Note que você não pode usar isto para nenhuma medida de segurança - é claro que o utilizador podia especificar "auto" ou -a na linha de comandos manualmente.

-z xxx
    O argumento para -z é ignorado. Você pode usar isto para expandir um pouco a linha de comandos, para que tenha mais algum espaço na pilha. O init pode então manipular a linha de comandos para que ps(1) mostre o runlevel actual.

--version
    Este argumento, quando usado por si só, mostra a versão actual do init na consola/stdout. É uma maneira rápida de determinar qual software e versão do init está a ser usado. Após a informação de versão ser mostrada, o init termina imediatamente com um código de retorno de zero.

INTERFACE
O init escuta num fifo em /dev, /run/initctl, por mensagens. O Telinit usa isto para comunicar com init. A interface não está bem documentada nem acabada. Aqueles interessados devem estudar o ficheiro initreq.h no sub-directório src/ do arquivo tar do código fonte do init.

SINAIS
O Init reage a vários sinais:

SIGHUP
    Tem o mesmo efeito que telinit q.

SIGUSR1
    Na receção destes sinais, o init fecha e re-abre o seu fifo de controle, /run/initctl. Útil para scripts de arranque quando /dev é remontado.

SIGUSR2
    Quando o init recebe SIGUSR2, o init fecha e deixa o fifo de controle, /run/initctl, fechado. Isto pode ser usado para certificar que o init não está a segurar nenhuns ficheiros abertos. No entanto, também previne o init de mudar os runlevels. O que significa que comandos como o shutdown não funcionam mais. O fifo pode ser re-aberto ao enviar ao init o sinal SIGUSR1.

SIGINT
    Normalmente o kernel envia este sinal ao init quando CTRL-ALT-DEL é pressionado. Activa a acção ctrlaltdel.

SIGWINCH
    O kernel envia este sinal quando a tecla KeyboardSignal é pressionada. Activa a acção kbrequest.

CONFORMIDADE COM
O init é compatível com o init do System V. Funcionam muito próximos com os scripts nos directórios /etc/init.d e /etc/rc{runlevel}.d. Se o seu sistema usa esta convenção, deverá existir um ficheiro README no directório /etc/init.d a explicar como estes scripts trabalham.

FICHEIROS
/etc/inittab
/etc/initscript
/dev/console
/var/run/utmp
/var/log/wtmp
/run/initctl

AVISOS
O init assume que os processos e os descendentes dos processos permanecem no mesmo grupo de processos que foi originalmente criado para eles. Se os processos mudarem o seu grupo, o init não consegue mata-los e você pode acabar com dois processos a ler a partir de uma linha de terminal.

Num sistema Debian, entrar no runlevel 1 faz com que todos os processos sejam mortos excepto para tópicos de kernel e o script que faz a matança e outros processos na sua sessão. Como consequência disto, não é seguro retornar de runlevel 1 para um runlevel de multi-utilizador: os daemons que foram arrancados no runlevel S e são precisos para o funcionamento normal não estão mais a correr. O sistema deve ser reiniciado.

DIAGNÓSTICO
Se o init descobrir que está continuamente a renascer uma entrada mais de 10 vezes em 2 minutos,irá assumir que existe um erro na string de comando, gerar uma mensagem de erro na consola do sistema, e recusar o renascer desta entrada até que ou tenham passado 5 minutos ou tenha recebido um sinal. Isto previne de comer os recursos do sistema quando alguém comete um erro tipográfico no ficheiro /etc/inittab ou o programa para a entrada foi removido.

AUTOR
Miquel van Smoorenburg (miquels@cistron.nl), initial manual page by Michael Haardt (u31b3hs@pool.informatik.rwth-aachen.de).

VEJA TAMBÉM
getty(1), login(1), sh(1), runlevel(8), shutdown(8), kill(1), initctl(5), inittab(5), initscript(5), utmp(5)