8.2. O processo init

O programa init é o processo com número de ID 1. Ele é responsável pela inicialização do sistema da maneira necessária e, além disso, tem uma função especial. Ele é iniciado diretamente pelo kernel e resiste ao sinal 9, que normalmente elimina os processos. Todos os outros programas são iniciados diretamente pelo init ou por um de seus processos-filho.

O init é configurado centralmente no arquivo /etc/inittab em que os runlevels são definidos (consulte a Seção 8.2.1, “Runlevels”). O arquivo também especifica os serviços e os daemons disponíveis em cada um dos níveis. Dependendo das entradas em /etc/inittab, vários scripts são executados pelo init. Para fins de clareza, esses scripts, chamados scripts init, residem no diretório /etc/init.d (consulte a Seção 8.2.2, “Scripts Init”).

Todo o processo de inicialização e encerramento do sistema é mantido pelo init. Desse ponto de vista, o kernel pode ser considerado um processo em segundo plano cuja tarefa é manter todos os outros processos e ajustar o horário da CPU e o acesso ao hardware, de acordo com as solicitações de outros programas.

8.2.1. Runlevels

No Linux, os runlevels definem como o sistema é iniciado e quais serviços estão disponíveis no sistema em execução. Após a inicialização, o sistema é iniciado conforme definido em /etc/inittab na linha initdefault. Normalmente, é 3 ou 5. Consulte a Tabela 8.1, “Runlevels disponíveis”. Como alternativa, é possível especificar o runlevel durante a inicialização (no prompt, por exemplo). Os parâmetros que não forem avaliados diretamente pelo próprio kernel serão passados para o init.

Tabela 8.1. Runlevels disponíveis

Runlevel

Descrição

0

Desligamento do sistema

S

Modo de usuário único; do prompt de inicialização, somente com mapeamento de teclado americano

1

Modo de usuário único

2

Modo multiusuário local sem rede remota (NFS, etc.)

3

Modo multiusuário completo com rede

4

Não usado

5

Modo multiusuário completo com rede e gerenciador de vídeo X — KDM, GDM ou XDM

6

Reinicialização do sistema

[Important]Evite o Nível de execução 2 com uma partição montada via NFS

Você não deverá usar o nível de execução 2 se seu sistema montar uma partição como /usr através do NFS. O sistema pode comportar-se de forma inesperada se as bibliotecas ou arquivos de programa estiverem ausentes pois o serviço NFS não está disponível no nível de execução 2 (modo multiusuário local sem rede remota).

Para mudar os níveis de execução durante a execução do sistema, digite telinit e o número correspondente como um argumento. Somente o administrador do sistema pode fazer isso. A lista a seguir resume os comandos mais importantes na área de runlevel.

telinit 1 ou shutdown now

O sistema muda para o modo de usuário único. Esse modo é usado para manutenção do sistema e tarefas de administração.

telinit 3

Todos os programas e serviços essenciais (incluindo a rede) são iniciados, e os usuários comuns podem efetuar login e trabalhar no sistema sem um ambiente gráfico.

telinit 5

O ambiente gráfico é habilitado. Geralmente um gerenciador de exibição como XDM, GDM ou KDM é iniciado. Se o login automático estiver habilitado, o usuário local será conectado ao gerenciador de janelas pré-selecionado (GNOME ou KDE ou qualquer outro gerenciador de janelas).

telinit 0 ou shutdown -h now

O sistema é desligado.

telinit 6 ou shutdown -r now

O sistema é desligado e, em seguida, reinicializado.

Runlevel 5 é o runlevel padrão em todas as instalações padrão do SUSE Linux. É solicitado o login dos usuários com uma interface gráfica ou o usuário padrão está conectado automaticamente. Se o runlevel padrão for 3, o Sistema Windows X deverá ser configurado adequadamente, conforme descrito no Capítulo 14, O sistema X Window, antes que o runlevel seja alternado para 5. Se isso for feito, verifique se o sistema funciona da maneira desejada, digitando telinit 5. Se tudo ocorrer conforme o esperado, você poderá usar o YaST para definir o runlevel padrão como 5.

Geralmente, há duas situações quando os runlevels são mudados. Primeiro, os scripts de parada do runlevel atual são iniciados, fechando alguns programas essenciais ao runlevel atual. Em seguida, os scripts do novo runlevel são iniciados. Na maioria dos casos, vários programas são iniciados. Por exemplo, ocorre o seguinte quando o runlevel 3 muda para 5:

  1. O administrador (root) solicita que o init mude para um nível de execução diferente digitando telinit 5.

  2. O init consulta seu arquivo de configuração (/etc/inittab) e determina se ele deve iniciar /etc/init.d/rc com o novo runlevel como parâmetro.

  3. O rc chama todos os scripts de parada do runlevel atual, mas somente aqueles para os quais não há script de início no novo runlevel. Neste exemplo, todos os scripts residem em /etc/init.d/rc3.d (o runlevel antigo era 3) e iniciam com K. O número depois de K especifica a ordem de início, pois algumas dependências devem ser consideradas.

  4. Os scripts do novo runlevel são os últimos a serem iniciados. Neste exemplo, eles estão em /etc/init.d/rc5.d e começam com S. O mesmo procedimento relativo à ordem em que eles foram iniciado se aplica nesse caso.

Ao mudar para o mesmo runlevel que o atual, o init somente verifica as mudanças em /etc/inittab e inicia as etapas adequadas, por exemplo, para iniciar um getty em outra interface. A mesma funcionalidade pode ser obtida com o comando telinit q.

8.2.2. Scripts Init

Há dois tipos de scripts em /etc/init.d:

Scripts executados diretamente pelo init

Isso só ocorrerá durante o processo de boot ou se um encerramento imediato do sistema for iniciado (falha de energia ou pressionamento de Ctrl-Alt-Del). A execução desses scripts é definida em /etc/inittab.

Scripts executados indiretamente pelo init

São executados durante a mudança do runlevel e sempre chamam o script master /etc/init.d/rc, que garante a ordem correta dos scripts relevantes.

Todos os scripts estão localizados em /etc/init.d. Scripts que são executados durante o boot são chamados através de links simbólicos de /etc/init.d/boot.d. Os scripts para mudança do nível de execução são chamados através de links simbólicos em um dos subdiretórios (/etc/init.d/rc0.d para /etc/init.d/rc6.d). Isso só serve para fins de clareza, além de evitar scripts duplicados se forem usados em vários runlevels. Como todos os scripts podem ser executados como de início ou de parada, eles devem entender os parâmetros start e stop. Os scripts também entendem as opções restart, reload, force-reload e status. Essas diversas opções são explicadas na Tabela 8.2, “Opções possíveis do script init”. Os scripts executados diretamente pelo init não têm esses links. Eles são executados independentemente do runlevel, quando necessário.

Tabela 8.2. Opções possíveis do script init

Opção

Descrição

start

Inicia o serviço.

stop

Pára o serviço.

restart

Se o serviço estiver sendo executado, o pára e o reinicia. Se não estiver, o inicia.

reload

Recarrega a configuração sem parar e reiniciar o serviço.

force-reload

Recarrega a configuração se o serviço suportá-la. Caso contrário, age como se restart tivesse sido ativado.

status

Mostra o status atual do serviço.

Os links em cada subdiretório específico de runlevel possibilitam a associação de scripts a diferentes runlevels. Durante a instalação ou desinstalação de pacotes, esses links são adicionados e removidos com a ajuda do programa insserv (ou usando /usr/lib/lsb/install_initd, que é um script que chama esse programa). Consulte a página de manual insserv(8) para obter detalhes.

Veja a seguir uma pequena apresentação dos scripts de boot e de parada iniciados primeiro e por último, respectivamente, bem como uma explicação do script de manutenção.

boot

Executado na inicialização do sistema usando diretamente o init. É independente do runlevel escolhido e só é executado uma vez. Nesse momento, os sistemas de arquivos proc e pts são montados e o blogd (boot logging daemon) é ativado. Se o sistema for inicializado pela primeira vez após uma atualização ou instalação, a configuração inicial do sistema será iniciada.

O daemon blogd é um serviço iniciado por boot e rc antes de qualquer outro. Ele será parado depois que os acionamentos feitos pelos scripts acima (por meio da execução de vários subscripts, por exemplo) forem concluídos. O blogd gravará a saída de tela no arquivo de registro /var/log/boot.msg, mas somente se e quando /var for montado para leitura-gravação. Caso contrário, o blogd armazenará no buffer todos os dados de tela até que /var se torne disponível. Obtenha mais informações sobre o blogd na página de manual blogd(8).

O script boot também é responsável pela inicialização de todos os scripts em /etc/init.d/boot.d com um nome iniciado com S. Nesse local, todos os sistemas de arquivos são verificados e os dispositivos de loop são configurados se necessário. O horário do sistema também é definido. Se ocorrer um erro durante a verificação e o reparo automáticos do sistema de arquivos, o administrador do sistema poderá intervir após digitar a senha raiz. Por fim, é executado o script boot.local.

boot.local

Digite aqui comandos adicionais a serem executados na inicialização antes de mudar para um runlevel. Ele pode ser comparado ao AUTOEXEC.BAT em sistemas DOS.

boot.setup

Este script é executado quando o modo de usuário único é mudado para outro runlevel e é responsável por várias configurações básicas, como o layout do teclado e a inicialização dos consoles virtuais.

halt

Este script é executado somente durante a mudança para o nível de execução 0 ou 6. Ele é executado como halt ou reboot. O modo como halt é chamado determina se o sistema deve ser encerrado ou reinicializado.

rc

Este script chama os scripts de parada adequados do runlevel atual e os scripts de início do runlevel recém-selecionado.

Você pode criar seus próprios scripts e integrá-los facilmente no esquema descrito acima. Para obter instruções sobre como formatar, nomear e organizar scripts personalizados, consulte as especificações do LSB e as páginas de manual do init, init.d e insserv. Além disso, consulte as páginas de manual do startproc e killproc.

[Warning]Scripts init defeituosos podem desligar o seu sistema

Scripts init defeituosos podem travar sua máquina. Edite esses scripts com muito cuidado e, se possível, submeta-os a testes detalhados no ambiente multiusuário. Algumas informações úteis sobre os scripts init podem ser encontradas na Seção 8.2.1, “Runlevels”.

Para criar um script init personalizado para determinado programa ou serviço, use o arquivo /etc/init.d/skeleton como gabarito. Grave uma cópia desse arquivo com o novo nome e edite o programa relevante e nomes de arquivos, caminhos e outros detalhes necessários. Você também pode precisar aprimorar o script com suas próprias partes, de modo que os acionamentos corretos sejam feitos pelo procedimento init.

O bloco INIT INFO na parte superior é uma parte necessária do script e deve ser editada. Consulte o Exemplo 8.1, “Um bloco INIT INFO mínimo”.

Exemplo 8.1. Um bloco INIT INFO mínimo

### BEGIN INIT INFO
# Provides:          FOO
# Required-Start:    $syslog $remote_fs
# Required-Stop:     $syslog $remote_fs
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Description:       Start FOO to allow XY and provide YZ
### END INIT INFO
    

Na primeira linha do bloco INFO, após Provides:, especifique o nome do programa ou serviço controlado pelo script init. Nas linhas Required-Start: e Required-Stop:, especifique todos os serviços que precisam ser iniciados ou parados antes de o próprio serviço ser iniciado ou parado. Essas informações são usadas posteriormente para gerar a numeração dos nomes de script, como encontrada nos diretórios de runlevel. Após Default-Start: e Default-Stop:, especifique os runlevels em que o serviço deve ser iniciado ou parado automaticamente. Por fim, para Description:, forneça uma breve descrição do serviço em questão.

Para criar os links dos diretórios de runlevel (/etc/init.d/rc?.d/) para os scripts correspondentes em /etc/init.d/, digite o comando insserv new-script-name. O programa insserv avalia o cabeçalho INIT INFO para criar os links necessários para os scripts de início e parada nos diretórios de runlevel (/etc/init.d/rc?.d/). O programa também se encarrega da ordem correta de início e parada para cada runlevel, incluindo os números necessários nos nomes desses links. Se você preferir uma ferramenta gráfica para criar esses links, use o editor de runlevel fornecido pelo YaST, como descrito na Seção 8.2.3, “Configurando serviços do sistema (runlevel) com o YaST”.

Se um script já existir em /etc/init.d/, deve ser integrado ao esquema de runlevel existente. Crie os links nos diretórios de runlevel imediatamente com insserv ou por meio do serviço correspondente no editor de runlevel do YaST. As mudanças serão aplicadas durante a próxima reinicialização, e o novo serviço será iniciado automaticamente.

Não defina esses links manualmente. Se houver algum erro no bloco INFO, surgirão problemas quando insserv for executado posteriormente para algum outro serviço. O serviço adicionado manualmente será removido com a próxima execução de insserv.

8.2.3. Configurando serviços do sistema (runlevel) com o YaST

Depois que o módulo YaST é iniciado com YaST+Sistema+Serviços do Sistema (Runlevel), ele exibe uma visão geral que lista todos os serviços disponíveis e o status atual de cada um deles (desabilitado ou habilitado). Decida se o módulo deve ser usado no Modo Simples ou no Modo de Especialista. O Modo Simples padrão deve ser suficiente na maior parte dos casos. A coluna à esquerda mostra o nome do serviço, a coluna ao centro indica seu status atual e a coluna à direita fornece uma descrição resumida. Para o serviço selecionado, uma descrição mais detalhada é fornecida na parte inferior da janela. Para habilitar um serviço, selecione-o na tabela e, em seguida, selecione Habilitar. As mesmas etapas se aplicam para desabilitar um serviço.

Figura 8.1. Serviços do Sistema (Runlevel)

Serviços do Sistema (Runlevel)

Para ter mais controle sobre os runlevels em que um serviço é iniciado ou parado ou para mudar o runlevel padrão, selecione primeiro Modo de Especialista. O runlevel padrão atual ou o “initdefault” (o runlevel em que o sistema é inicializado por padrão) é exibido na parte superior. Normalmente, o runlevel padrão de um sistema SUSE Linux é o 5 (modo multiusuário completo com rede e X). Uma alternativa adequada poderia ser o runlevel 3 (modo multiusuário completo com rede).

Esta caixa de diálogo do YaST permite a seleção de um dos runlevels (como listado na Tabela 8.1, “Runlevels disponíveis”) como o novo padrão. Além disso, use a tabela mostrada nessa janela para habilitar ou desabilitar serviços e daemons individuais. A tabela lista os serviços e daemons disponíveis, mostra se eles estão habilitados no sistema e, se estiverem, para quais runlevels. Após selecionar uma das linhas com o mouse, clique nas caixas de seleção que representam os runlevels (B, 0, 1, 2, 3, 5, 6 e S) para definir os runlevels em que o serviço ou daemon selecionado deve estar em execução. O runlevel 4 é inicialmente indefinido para permitir a criação de um runlevel personalizado. Uma breve descrição do serviço ou daemon selecionado no momento é fornecida abaixo da visão geral da tabela.

Com Iniciar, Parar ou Atualizar, decida se um serviço deve ser ativado. Situação da Renovação verifica o status atual. Inicializar/Reinicializar permite selecionar se você deseja aplicar as mudanças ao sistema ou restaurar as configurações existentes antes da inicialização do editor de runlevel. A seleção de Concluir grava no disco as configurações mudadas.

[Warning]Configurações de runlevel defeituosas podem danificar o sistema

Configurações de runlevel defeituosas podem tornar um sistema inutilizável. Antes de aplicar as mudanças, tenha absoluta certeza sobre suas conseqüências.