Pesquisar neste blog

sexta-feira, 21 de novembro de 2008

Conhecendo a inicialização do Linux

Grande parte das pessoas não sabem como funciona o sistema de
inicialização do Linux, por isso resolvi descrevê-lo aqui.

O boot do sistema é baseado em fases, cada fase tem uma função
específica, por isso nenhuma fase deve ser repetida e a próxima fase
sempre levará em conta que as tarefas da fase anterior foram
executadas com sucesso.

A primeira fase, depois da escolha do kernel a ser carregado (geralmente via LILO ou GRUB), é a descompressão e carregamento do kernel. O kernel do Linux é comprimido, o que possibilita, entre outras coisas, a ocupação de menos espaço em disco.

Depois da descompressão e carregamento do sistema, começarão a surgir mensagens do kernel, avisando sobre o que está acontecendo, como testes de portas seriais, entre outros. Todas as mensagens do kernel são úteis e devem sempre ser observadas. Caso você precise ver as mensagens do kernel após o boot completo do sistema, não precisa reiniciá-lo, basta digitar dmesg no shell.


Após a inicialização completa do kernel, o sistema passa o controle para alguns scripts, conhecidos como scripts de inicialização ao estilo Sys V. Os scripts podem ser encontrados geralmente no diretório /etc/rc.d, são normalmente três:

rc.sysinit:
Executado apenas uma vez, durante o boot do sistema. Ajusta algumas coisas, como o relógio e data do sistema, entre outras coisas.

rc:
Executado quando o runlevel é alterado. Runlevels serão explicados posteriormente. O rc "mata" os processos do atual runlevel, levando em consideração alguns detalhes que serão descritos posteriormente, e inicia os novos processos, característicos do runlevel atual.

rc.local:
Executado logo após todos os outros scripts de inicialização. É útil para ajustar alguns parâmetros do sistema que devem ser inicializados mas não necessitam da criação de um script completo ao estilo Sys V. Alguns exemplos de programas normalmente incializados nesse script são servidores de fontes "incomuns", restauradores de som, entre outros. Outra função desse script é recriar os arquivos /etc/issue e /etc/issue.net, que são responsáveis
pelas mensagens exibidas enquanto o sistema aguarda o login e senha do usuário (nos sistemas Conectiva é comum a presença da imagem gerada pelo linux_logo, com algumas informações sobre o sistema).

Agora o sistema já está inicializado, então o controle é passado para o gerenciador de login, que ficará aguardando a ação do usuário. Se algum usuário realizar o login no sistema, o controle será passado para o shell padrão do usuário, por exemplo o bash. Outras formas de login são discutidas abaixo, junto com a explicação sobre os runlevels.

Runlevels

Toda a inicialização do sistema é baseada em runlevels, ou seja,
níveis de execução. Os sistemas Linux possuem 6 runlevels:

0 - conhecido como halt, é o runlevel que desliga o sistema;

1 - monousuário, inicilializa o sistema sem opções de segurança, no
modo monousuário sem rede;

2 - multiusuário, inicializa o sistema com todas as opções de
multiusuários e segurança;

3 - multiusuário com rede, o mesmo do runlevel 2, mas com opções de rede ativas, o runlevel mais comum;

4 - não utilizado;

5 - multiusuário em modo gráfico, igual ao runlevel 3, mas inicia o
servidor X automaticamente;

6 - reboot, reinicializa o sistema.


Alguns sistemas podem variar, mas o padrão é esse. A descrição do sistema de runlevels normalmente pode ser encontrada no arquivo /etc/inittab, onde você também poderá alterar runlevel padrão do sistema.

Alguns runlevels que merecem destaque são o 1, 3 e 5. O runlevel 1 nunca deve ser utilizado, a não ser para manutenção do sistema, devido a falta total de segurança. O runlevel 3 é o mais comum e eu pessoalmente aconselho o seu uso. O runlevel 5 é o mais indicado para usuários novatos, que dependem completamente do sistema gráfico para trabalhar. Não aconselho o uso do runlevel 5, pois além de gastar recursos de máquina ainda, se a sua
placa de vídeo estiver configurada incorretamente, o servidor X tentará forçar a inicialização gráfica e sua tela no mínimo ficará piscando, tornando impossível qualquer comunicação com o sistema, o que também dificultará a reconfiguração da placa de vídeo. A escolha
fica por sua conta.

Runlevels e os scripts Sys V

O sistema de init, como foi citado anteriormente, procurará os scripts de incialização em /etc/rc.d. Existem, além dos scripts já citados, muitos outros, dentro do diretório /etc/rc.d/init.d.

Os scripts encontrados dentro do diretório /etc/rc.d/init.d possuem um modelo a ser seguido, onde eles devem aceitar no mínimo quatro parâmetros, a saber: stop, start, restart, status.

O init possui um sistema interessante para verificar quais os scripts que devem ser executados em cada runlevel. Dentro do diretório /etc/rc.d existem vários subdiretórios, com os nomes seguindo o modelo rcX.d, onde X é o numero do runlevel atendido pelo diretório. Isso significa que normalmente temos 6 diretórios seguindo esse modelo, de rc0.d a rc6.d. O script de inicialização, rc, verificará o runlevel atual e, segundo ele, entrará no diretório correto, por exemplo, para um runlevel 3, o diretório rc3.d. Dentro dos diretórios estão links
simbólicos para os scripts em init.d que devem ser executados no runlevel. Os links simbólicos possuem a seguinte nomenclatura:

EXXnome, onde E pode ser S, de start ou K, de kill, XX indica qual a ordem de execução do script na hierarquia de scripts e nome indica o nome do script na pasta init.d. Quem cria ou destrói os links é um aplicativo, chamado chkconfig.

O chkconfig lê algumas informações no cabeçalho dos scripts Sys V e determina qual a ordem de execução do script, quais os runlevels onde o script será executado com o parâmetro start e quais os runlevels onde o parâmetro utilizado será stop. Para indicar qual parâmetro usar ele cria o link com um prefixo K, de kill, para o parâmetro stop, e S, de start, para o parâmetro start. As páginas do manual do chkconfig explicam corretamente cada parâmetro do mesmo e como utilizá-lo corretamente.

Outro aplicativo normalmente encontrado é o ntsysv, que é uma espécie de front-end para o chkconfig, por meio dele podemos ver quais os serviços estão ativos e quais estão inativos de uma forma bem mais simples que pelo chkconfig.

Observe que não é porque você possui um script em /etc/rc.d/init.d que ele será executado, para ele ser executado, deve ser adicionado ao init via chkconfig ou ntsysv (ou outro aplicativo equivalente). Algumas informações sobre os serviços também podem ser visualizadas, essas informações são inseridas no cabeçalho dos scripts e normalmente
tem suporte a vários idiomas, descrevendo o que aquele serviço inicializado pelo script fará no seu sistema.

O shutdown do sistema também é determinado por um runlevel, ou o runlevel 0 (halt) ou o 6 (reboot), permitindo assim que alguns serviços possam ser devidamente desligados antes da queda do sistema, como por exemplo um servidor em impressão ou um gravador de configurações do misturador de som.

Agora que já conhecemos as fases básicas do boot do sistema e também o sistema de inicialização por scripts conhecido como Sys V, podemos personalizar alguns scripts segundo as nossas necessidades, criar alguns serviços e selecionar corretamente aqueles que serão
inicializados ou não durante os vários runlevels. Uma última dica: se você quiser alterar o runlevel com o sistema ligado, basta utilizar, como root, init X, onde X é o runlevel que você quer iniciar, ou seja, se você quiser reiniciar o sistema sem usar shutdown, basta digitar
"init 6".

No próximo artigo irei demonstrar como criar um script de inicialização e colocar para rodar via chkconfig.

Nenhum comentário: