Comandos init e telinit do Linux
Nos sistemas operacionais do tipo Unix, telinit e init fornecem a inicialização do controle de processo. Eles são usados pelo sistema quando ele é inicializado .
Este documento cobre as versões Linux do telinit e init .
Descrição
init é o pai de todos os processos . Sua função principal é criar processos a partir de um script armazenado no arquivo / etc / inittab . Esse arquivo geralmente possui entradas que fazem o init gerar gettys em cada linha em que os usuários podem efetuar login . Ele também controla processos autônomos exigidos por qualquer sistema em particular.
Sintaxe
/ sbin / init [-a] [-s] [-b] [-z xxx ] [0123456Ss]
/ sbin / telinit [-t sec ] [0123456sSQqabcUu]
Níveis de execução
Um nível de execução é uma configuração de software do sistema que permite que apenas exista um grupo selecionado de processos. Os processos gerados pelo init para cada um desses níveis de execução são definidos no arquivo / etc / inittab . O Init pode estar em um dos oito níveis de execução: 0 a 6 e S ou s . O nível de execução é alterado ao fazer com que um usuário privilegiado execute telinit , que envia sinais apropriados para o init , informando para qual nível de execução alterar.
Os níveis de execução 0 , 1 e 6 são reservados. O nível de execução 0 é usado para interromper o sistema, o nível de execução 6 é usado para reinicializar o sistema e o nível de execução 1 é usado para colocar o sistema no modo de usuário único. O nível de execução S não deve ser usado diretamente, mas mais para os scripts executados ao entrar no nível de execução 1 .
Os níveis de execução 7 – 9 também são válidos, embora não sejam realmente documentados. Isso ocorre porque as variantes Unix “tradicionais” não as usam. Caso você esteja curioso, os níveis de execução S e S são de fato os mesmos. Internamente, são aliases para o mesmo nível de execução.
Inicializando
Depois que o init é chamado como a última etapa da sequência de inicialização do kernel , ele procura o arquivo / etc / inittab para ver se há uma entrada do tipo initdefault . A entrada initdefault determina o nível de execução inicial do sistema. Se não houver essa entrada (ou nenhuma / etc / inittab ), um nível de execução deve ser inserido no console do sistema.
Os níveis de execução S ou s levam o sistema ao modo de usuário único e não requerem um arquivo / etc / inittab . No modo de usuário único, um shell raiz é aberto no / dev / console .
Ao entrar no modo de usuário único, o init inicializa as configurações stty dos consoles para valores sãos. O modo “CLocal” está definido. A velocidade do hardware e o handshake não são alterados.
Ao entrar no modo multiusuário pela primeira vez, o init executa as entradas de inicialização e espera de inicialização para permitir que os sistemas de arquivos sejam montados antes que os usuários possam efetuar login. Em seguida, todas as entradas correspondentes ao nível de execução são processadas.
Ao iniciar um novo processo, o init verifica primeiro se o arquivo / etc / initscript existe. Caso isso aconteça, ele usa esse script para iniciar o processo.
Cada vez que um filho termina, o init registra o fato e o motivo pelo qual ele morreu em / var / run / utmp e / var / log / wtmp , desde que esses arquivos existam.
Alterando níveis de execução
Depois de gerar todos os processos especificados, o init espera que um de seus processos descendentes morra, por um sinal de “falha de energia” ou até que seja sinalizado pelo telinit para alterar o nível de execução do sistema. Quando uma das três condições acima ocorre, ela reexamina o arquivo / etc / inittab . Novas entradas podem ser adicionadas a esse arquivo a qualquer momento. No entanto, o init ainda aguarda a ocorrência de uma das três condições acima. Para fornecer uma resposta instantânea, o comando telinit Q (ou q ) pode ativar o init para reexaminar o arquivo / etc / inittab .
Se o init não estiver no modo de usuário único e receber um sinal de falha de alimentação ( SIGPWR ), ele lerá o arquivo / etc / powerstatus . Em seguida, ele inicia um comando com base no conteúdo deste arquivo:
- F (FAIL) – A energia está falhando, o UPS está fornecendo energia. Execute as entradas powerwait e powerfail.
- O (OK) – A energia foi restaurada, execute as entradas powerokwait.
- L (LOW) – A energia está falhando e o no-break está com a bateria fraca. Execute as entradas do powerfailnow.
Se o / etc / powerstatus não existir ou contiver mais nada, as letras F , O ou L , init se comportarão como se tivesse lido a letra F.
O uso do SIGPWR e / etc / powerstatus é desencorajado. Alguém que queira interagir com o init deve usar o canal de controle / dev / initctl . Mais informações sobre isso estão disponíveis, visualizando o código-fonte do pacote sysvinit .
Quando o init é solicitado a alterar o nível de execução, ele envia o sinal de aviso SIGTERM para todos os processos indefinidos no novo nível de execução. Aguarda 5 segundos antes de terminar forçosamente esses processos através do sinal SIGKILL . Observe que o init assume que todos esses processos (e seus descendentes) permanecem no mesmo grupo de processos que o init criou originalmente para eles. Se algum processo alterar sua afiliação ao grupo de processos, não receberá esses sinais. Esses processos precisam ser encerrados separadamente.
Meio Ambiente
O Init define as seguintes variáveis de ambiente para todos os seus filhos:
CAMINHO | / bin : / usr / bin : / sbin : / usr / sbin |
INIT_VERSION | Como o nome diz. Útil para determinar se um script é executado diretamente do init . |
RUNLEVEL | O nível de execução do sistema atual. |
PREVLEVEL | O nível de execução anterior (especialmente útil após alterar o nível de execução). |
CONSOLE | O console do sistema. Isso é realmente herdado do kernel; no entanto, se não estiver definido, init o configurará para / dev / console por padrão. |
Telinit
/ sbin / telinit está vinculado a / sbin / init . É necessário um argumento de um caractere e sinaliza init para executar a ação apropriada. Os argumentos a seguir servem como diretrizes para o telinit :
0 , 1 , 2 , 3 , 4 , 5 ou 6 | diga ao init para mudar para o nível de execução especificado. |
a , b , c | diga ao init para processar apenas as entradas do arquivo / etc / inittab com o nível de execução a , b ou c . |
Q ou q | diga ao init para reexaminar o arquivo / etc / inittab . |
S ou s | diga ao init para mudar para o modo de usuário único. |
Você ou você | diga ao init para se reexecutar (preservando o estado). Nenhum reexame do arquivo / etc / inittab acontece. O nível de execução deve ser um de S , s , 1 , 2 , 3 , 4 ou 5 , caso contrário, a solicitação seria ignorada silenciosamente. |
O telinit também pode dizer ao init quanto tempo deve esperar entre os processos de envio dos sinais SIGTERM e SIGKILL . O padrão é 5 segundos, mas isso pode ser alterado com a opção -t sec .
O telinit pode ser invocado apenas por usuários com privilégios apropriados.
O binário init verifica se é init ou telinit observando sua identificação de processo; a identificação do processo real do init é sempre 1 . A partir daí, em vez de chamar o telinit, também é possível usar o init como um atalho.
Interface
O Init escuta um fifo em / dev ( / dev / initctl ) para mensagens. O Telinit usa isso para se comunicar com o init . A interface não está muito bem documentada; Para saber mais sobre a interface, os usuários devem visualizar a própria fonte.
Signals
O Init reage a vários sinais, incluindo:
SIGHUP | Tem o mesmo efeito que telinit q . |
SIGUSR1 | Ao receber este sinal, o init fecha e reabre seu controle fifo, / dev / initctl . Útil para scripts de inicialização quando / dev é remontado. |
SIGINT | Normalmente, o kernel envia esse sinal para iniciar quando Ctrl-Alt-Del é pressionado. Ativa a ação ctrlaltdel . |
SIGWINCH | O kernel envia esse sinal quando a tecla KeyboardSignal é pressionada. Ativa a ação kbrequest . |
arquivos
/ etc / inittab
/ etc / initscript
/ dev / console
/ var / run / utmp
/ var / log / wtmp
/ dev / initctl
Init Bootflags
É possível passar um número de sinalizadores para iniciar no monitor de inicialização (como o LILO ). Init aceita os seguintes sinalizadores:
-s , S , solteiro | Inicialização no modo de usuário único. Nesse modo, o / etc / inittab é examinado e os scripts de inicialização rc geralmente são executados antes do início do shell do modo de usuário único. |
1-5 | Nível de execução para inicializar. |
-b , emergência | Inicialize diretamente em um único shell de usuário sem executar nenhum outro script de inicialização. |
-a , auto | O carregador de inicialização do LILO adiciona a palavra ” auto ” à linha de comando se inicializou o kernel com a linha de comando padrão (sem intervenção do usuário). Se isso for encontrado, init define a variável de ambiente ” AUTOBOOT ” como ” yes “. Observe que você não pode usar isso para nenhuma medida de segurança; é claro que o usuário poderia especificar ” auto ” ou -a na linha de comando manualmente. |
-z xxx | O argumento para -z é ignorado. Você pode usar isso para expandir um pouco a linha de comando, para que ocupe um pouco mais de espaço na pilha. O Init pode manipular a linha de comando para que o ps mostre o nível de execução atual. |
O telinit também pode dizer ao init quanto tempo deve esperar entre os processos de envio dos sinais SIGTERM e SIGKILL . O padrão é 5 segundos, mas isso pode ser alterado com a opção -t sec .
O telinit pode ser invocado apenas por usuários com privilégios apropriados.
O binário init verifica se é init ou telinit observando sua identificação de processo; o ID do processo real do init é sempre 1 . A partir daí, em vez de chamar o telinit, também é possível usar o init como um atalho.
Comandos relacionados
kill – envia um sinal para um processo, afetando seu comportamento ou matando-o.
login – Inicia uma sessão em um sistema.
service – Execute um script de inicialização do System V.
sh – O interpretador de comandos do Bourne shell.