Bem-vindo ao meu Editor do System V Init, mais conhecido como (e como vai ser daqui para a frente denominado) ksysv. Esta secção introduz alguns conceitos e explica o que podes fazer com o ksysv.
A explicação que se segue é "emprestada" a partir do tksysv (uma inspiração para o ksysv):
O System V init está-se a tornar a norma no mundo do Linux para controlar a inicialização do 'software' no arranque do sistema. Isto porque é mais fácil de usar e mais poderoso e flexível que o 'init' tradicional do BSD.
Não vou dar pormenores sobre a história dele aqui (principalmente porque não a conheço :-).
O executável do 'init' está localizado em /sbin e não em /etc . Isto é importante dado que podem tentar fazer uma actualização duma máquina para o 'init' do System V sem reinstalar e reformatar. O núcleo do Linux procura em primeiro lugar em /etc pelo seu 'init' , por isso deves confirmar se o 'init' antigo foi apagado.
O 'init' do SysV também difere do 'init' do BSD na medida em que os ficheiros de configuração estão numa sub-directoria de /etc em vez de residirem directamente na directoria /etc. Esta directoria chama-se rc.d. Aqui irás encontrar o rc.sysinit e as seguintes directorias:
init.d/ rc0.d/ rc1.d/ rc2.d/ rc3.d/ rc4.d/ rc5.d/ rc6.d/ |
A init.d contém um conjunto de 'scripts'. Basicamente, precisas dum 'script' para cada serviço que possas iniciar no arranque do sistema ou quando mudas de nível de execução ('runlevel'). Os serviços incluem coisas como a rede, o NFS, o sendmail, o httpd, etc. Os serviços não incluem coisas como o setserial que só precisa de correr uma vez e que termina imediatamente. Coisas como essas devem ir para o rc.local.
O rc.local deve estar em /etc/rc.d se for necessário um. A maioria dos sistemas incluem um mesmo que não faça muita coisa. Pode-se incluir também um rc.serial em /etc/rc.d se for necessário realizar acções específicas para a porta série no arranque.
A cadeia de eventos é a seguinte:
o núcleo procura em vários pontos pelo 'init' e corre o primeiro que encontrar
o init corre o /etc/rc.d/rc.sysinit
o rc.sysinit executa um conjunto de acções e então corre o rc.serial (se existir)
o init corre o rc.local
o init corre todos os 'scripts' para o 'runlevel' por omissão
O 'runlevel' por omissão é decidido no /etc/inittab. Deve existir uma linha perto do topo do estilo:
id:3:initdefault: |
Daí, deves olhar para a segunda coluna e ver que o 'runlevel' por omissão é o 3, como deve ser na maioria dos sistemas. Se o quiseres mudar, podes editar o /etc/inittab à mão e mudar o 3. Tem cuidado ao mexeres no inittab. Se fizeres asneira, podes recuperar dela reiniciando o sistema e fazendo:
LILO boot: linux single |
Isto *deve* permitir-te entrar em modo de mono-utilizador de modo a poderes corrigir o erro.
Agora, como é que ele corre todos os 'scripts' correctos? Se fizeres um 'ls -l' no rc3.d, irás ver algo do estilo:
lrwxrwxrwx 1 root root 13 13:11 S10network -> ../init.d/network lrwxrwxrwx 1 root root 16 13:11 S30syslog -> ../init.d/syslog lrwxrwxrwx 1 root root 14 13:32 S40cron -> ../init.d/cron lrwxrwxrwx 1 root root 14 13:11 S50inet -> ../init.d/inet lrwxrwxrwx 1 root root 13 13:11 S60nfs -> ../init.d/nfs lrwxrwxrwx 1 root root 15 13:11 S70nfsfs -> ../init.d/nfsfs lrwxrwxrwx 1 root root 18 13:11 S75keytable -> ../init.d/keytable lrwxrwxrwx 1 root root 23 13:11 S80sendmail -> ../init.d/sendmail.init lrwxrwxrwx 1 root root 18 13:11 S90lpd -> ../init.d/lpd.init lrwxrwxrwx 1 root root 11 13:11 S99local -> ../rc.local |
O que irás notar é que não existem 'ficheiros reais' na directoria. Tudo o que existe é uma ligação ('link') simbólica para um dos 'scripts' existentes na directoria init.d. Os 'links' também têm um "S" e um número no início. O "S" significa que se deve iniciar este 'script' em particular' e o "K" significa que se deve terminar. O número só existe para fins de ordenação. O 'init' irá iniciar todos os serviços baseando-se na ordem em que estes aparecem. Podem-se usar números duplicados, mas isso só te trará confusões de alguma maneira. Só precisas de usar um número de dois dígitos em conjunto com um "S" ou um "K" maiúsculo para iniciar ou terminar os serviços que precisas.
Como é que ele inicia e termina serviços? Simples. Cada um dos 'scripts' é construído de maneira a aceitar um argumento que pode ser "start" ou "stop". De facto, podes executar estes 'scripts' à mão com um comando como:
/etc/rc.d/init.d/httpd.init stop |
para parar o servidor httpd. O 'init' só lê o nome e se tiver um "K", chama-o com o argumento "stop". Se tiver um "S" chama o 'script' com um argumento "start".
Algumas pessoas querem uma maneira fácil de configurar as máquinas para que estas possam ser multi-usos. Podia existir um 'runlevel' de "servidor" que só corre o "httpd", o "sendmail", a rede, etc. Por outro lado, podia existir um 'runlevel' de "utilizador" que corre o xdm, a rede, etc.