sábado, 3 de maio de 2008

Inicialização de um Sistema Linux: Init, Inittab, Sysvinit. (LPI Prova 102)

O processo de inicialização (boot) do Linux costuma ser um item certo de cair na LPI (principalmente na prova 102), por esse motivo é preciso ter pleno conhecimento de como esse processo ocorre e principalmente é preciso conhecer o seu principal integrante que é o programa init.

Init é primeiro processo/programa a ser executado pelo sistema, logo após o carregamento do kernel pelo gerenciador de boot (lilo, grub, etc). Sua primeira tarefa será ir até o seu arquivo de configuração, normalmente /etc/inittab, e verificar qual o script mestre de inicialização, normalmente /etc/rc.d/rc.sysinit.

É preciso lembrar que nem todas as distribuições utilizam esse nome para o script mestre. O SuSE por exemplo chama o /etc/init.d/boot. Para que possamos verificar ou configurar qual será o script, basta ir no arquivo /etc/inittab verificar a linha:

si::sysinit:/etc/rc.d/rc.sysinit

O script mestre sysinit carregará então os itens básicos do sistema como seu nome, logs, data/hora, periféricos de entrada principal(teclado), fonte, partições de swap e dispositivos de armazenamento.

O próximo passo do init consiste em iniciar os itens referentes ao runlevel padrão do sistema. Como todos sabem os sistemas unix-like são multi-usuário e multi-tarefa, ou seja isso nos possibilita diferentes modos de execução, chamados run level, que são identificados por número:

0 – desligamento do sistema

1 – mono usuário

2 – multi usuário sem serviço de rede

3 – multi usuário com serviço de rede

4 – não especificado

5 - multi usuário com serviço de rede e login gráfico.

6 – reinicialização do sistema.

Apenas os níveis 0, 1 e 6 são padronizados. Os demais podem variar de distribuição para distribuição. Cada um desses níveis possui um script de inicialização no init próprio, portanto logo após a execução do script mestre o init executará o script referente ao runlevel padrão.

O nível padrão é configurado no /etc/inittab pela linha:

id:5:initdefault:

Os scripts referentes a cada runlevel por sua vez são configurados nas linhas:

l0:0:wait:/etc/rc.d/rc 0

l1:1:wait:/etc/rc.d/rc 1

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

l4:4:wait:/etc/rc.d/rc 4

l5:5:wait:/etc/rc.d/rc 5

l6:6:wait:/etc/rc.d/rc 6

Onde cada linha segue o padrão:

id:runlevel:ação:processo

A configuração da famosa combinação CTRL + ALT + DEL também é feita no arquivo /etc/inittab pela linha:

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

Por fim, o init irá executar um programa de emulação de terminal ou de login para que agora o usuário, com o sistema todo iniciado no runlevel desejado, possa acessar o sistema.

É preciso lembrar que todos os passos mostrados aqui não representam um caminho único. Esse processo de inicialização é chamado de SysVInit. Existem outros padrões de inicialização do init (o Ubuntu mesmo utiliza um bem distinto) como o SysIIIInit, BSDInit, porém para as questões da LPI é preciso ter bem em mente como é o funcionamento do padrão que já foi um dos mais difundidos entre as grandes distribuições.