Durante o processo de boot, mensagens são mostradas no vídeo e salvas no arquivo de log
/var/log/dmesg. Para visualizar este arquivo você pode usar o comando
dmesg. Observe:
# dmesg
Entendendo os níveis de execução e o processo init
Muitas distribuições
Linux usam diferentes tipos de arquivos shell-script para iniciar serviços e processos do sistema. Existem dois tipos de estilos de inicialização para sistemas operacionais
Linux/Unix: Sys V init e o BSD init.
O
BSD é popular em distribuições como Slackware, FreeBSD e OpenBSD. Com esse tipo de estilo de inicialização o processo init usa o arquivo /etc/rc para inicializar vários arquivos shell-scripts para configurar o sistema. O Linux Slackware utiliza um estilo de inicialização modificado, no qual existe um arquivo /etc/inittab no lugar de /etc/rc e aceita níveis de execução.
O
Sys V init é utilizado na maioria das distribuições Linux, pois ele dispõe de um maior número de recursos e de uma maior flexibilidade do que o BSD init. Para não entrar em muitos detalhes adianto que os tópicos a seguir são todos oriundos do estilo de inicialização Sys V init e por isso eles esclarecerão a maior parte das duvidas que venham a aparecer.
O processo de boot no Linux é bem customizável, porém pode ser diferente entre as distribuições nos detalhes. Para entender o processo de boot e como localizar e reparar falhas no hardware é necessário se familiarizar com o conceito de níveis de execução ou runlevels.
Níveis de execução ou runlevels são processos executados em uma ordem programada durante o processo de boot. Os níveis de execução determinam quais serviços serão executados durante a carga do sistema operacional.
No Linux existem sete níveis de execução predefinidos, numerados de 0 a 6, porém o que cada um executará dependerá da distribuição usada e da configuração que o administrador do sistema efetuou. Para sabermos qual nível de execução a nossa distribuição do Linux está usando digite:
# runlevel
N 3
A tabela abaixo descreve os níveis de execução, observe:
0 |
Desliga o sistema. |
1,s, single |
É utilizado para manutenção do sistema, é chamado de monousuário e somente o essencial é executado. |
2 |
Modo multiusuário sem suporte de rede. |
3 |
Nível de execução padrão, multiusuário com todos os serviços habilitados e login do sistema em modo texto. |
4 |
Indefinido ou não utilizado. |
5 |
Nível de execução padrão, multiusuário com todos os serviços habilitados e login do sistema em modo gráfico. |
6 |
Executa o reboot do sistema. |
Alterando os níveis de execução
Para mudar os níveis de execução do sistema podemos usar dois comandos:
init ou
telinit.
# init 1
Ou
# telinit 1
O comando telinit é atualmente um link para o comando /sbin/init para prover compatibilidade com outros sistemas Unix.
Definindo quais processos serão executados por cada nível de execução
Até agora vimos que o comando init é responsável pela alteração dos processos em execução dentro de um nível de execução, porém quais processos serão executados por cada nível de execução é feita pela hierarquia de diretórios /etc/rc.d e scripts de shell.
Configurando o processo init
Depois que o gerenciador de boot é startado, o kernel do Linux executa o primeiro processo que é o init. O init sempre será o processo de ID 1. Todos os outros processos serão processos filhos do init. Observe:
# ps x
PID TTY STAT TIME COMMAND
1 ? S 0:07 init [3]
2 ? SW 0:00 [keventd]
3 ? SWN 0:00 [ksoftirqd_CPU0]
Use também os comandos:
# pgrep init
Para visualizar a árvore de processos:
# pstree
Quando o init é executado ele lê as configurações contidas no arquivo
/etc/inittab. Uma delas define qual é o nível de execução que o sistema assumirá durante o processo de boot. No arquivo /etc/inittab procure a seguinte linha:
A sintaxe da linha é a seguinte:
id:nível de execução:ação:processo
- id - É uma seqüência de 1 a 4 caracteres que identificam a entrada no inittab.
- nível de execução - Defini o nível de execução padrão.
- ação - Específica à ação que o init irá aplicar. Para ter uma idéia das ações possíveis no prompt digite man inittab.
processo - Específica o processo que será executado.
Entendendo os scripts de inicialização
Os scripts de inicialização estão armazenados no diretório /etc/init.d e seus links são criados em /etc/rc?.d, onde o ? representa o nível de execução de 0 a 6 comentado anteriormente. Os links que se encontram nos diretórios /etc/rc?.d estão no seguinte formato:
SNNnome ou KNNnome
Onde S define que o script será carregado, K define que o scripts será terminado, NN representa o número que define a ordem começando do menor para o maior e o nome define o nome do script. Observe o exemplo:
# ls -l rc3.d/
lrwxrwxrwx 1 root root 13 May 10 2005 S20ssh -> ../init.d/ssh
Observe que quando o sistema é iniciado no nível de execução 3 o link S20ssh starta o script do serviço SSH que está no /init.d/ssh onde:
- S - Inicia o script;
- 20 - Número que defini a ordem de execução;
- ssh - O nome do script.
Para incluir um determinado serviço em algum nível de execução é necessário que o script de execução seja copiado para o diretório /etc/init.d e depois criar um link simbólico para o script.
# cp /debian/scripts/quotas /etc/init.d/
# ln -s /etc/init.d/quotas /etc/rc3.d/S90quotas
Para carregar ou terminar um processo em qualquer nível de execução, renomeie o link referente ao serviço nos diretórios /etc/rc?.d.
# mv S20exim K20exim
Todos os scripts localizados no diretório /etc/init.d suportam argumentos que podem ser usados para iniciar, parar e reiniciar os serviços. Veja o exemplo:
# ./lpd stop
Stopping printer spooler: lpd.
Para saber quais argumentos o script pode aceitar digite --help.
# ./lpd --help
Usage: /etc/init.d/lpd {start|stop|restart|force-reload}
Gerenciando scripts de inicialização com update-rc.d
O
update-rc.d é uma ferramenta de gerenciamento de scripts, com ele podemos remover ou adicionar todos os links de um script a partir do diretório /etc/init.d. Para remover todos os links de um script faça:
# update-rc.d -f exim remove
update-rc.d: /etc/init.d/exim exists during rc.d purge (continuing)
Removing any system startup links for /etc/init.d/exim ...
/etc/rc0.d/K20exim
/etc/rc1.d/K20exim
/etc/rc2.d/S20exim
/etc/rc3.d/K20exim
/etc/rc4.d/S20exim
/etc/rc5.d/S20exim
/etc/rc6.d/K20exim
Para reconfigurar um script ou se incluir um novo script no /etc/init.d e quer iniciá-lo faça:
# update-rc.d nome start NN runlevel .
- nome - nome do script em /etc/init.d
- start - executa o script.
- NN - número que determina quando o script deve ser executado ou finalizado.
- runlevel - define em qual nível de execução o script deve ser carregado ou terminado.
- . - separa as configurações.
Observe:
# update-rc.d exim start 20 4 . start 20 5 . stop 20 0 . stop 20 6 .
Adding system startup for /etc/init.d/exim ...
/etc/rc0.d/K20exim -> ../init.d/exim
/etc/rc6.d/K20exim -> ../init.d/exim
/etc/rc4.d/S20exim -> ../init.d/exim
/etc/rc5.d/S20exim -> ../init.d/exim
Para facilitar mais ainda o gerenciamento, podemos usar o update-rc.d com as configurações padrão. Ou seja, iniciar nos níveis de execução 2, 3, 4 e 5 e finalizar nos 0, 1 e 6:
# update-rc.d exim defaults
Adding system startup for /etc/init.d/exim ...
/etc/rc0.d/K20exim -> ../init.d/exim
/etc/rc1.d/K20exim -> ../init.d/exim
/etc/rc6.d/K20exim -> ../init.d/exim
/etc/rc2.d/S20exim -> ../init.d/exim
/etc/rc3.d/S20exim -> ../init.d/exim
/etc/rc4.d/S20exim -> ../init.d/exim
/etc/rc5.d/S20exim -> ../init.d/exim