As distribuições
GNU/Linux começaram a substituir o SysVinit pelo
systemd, com a promessa de fazer o boot ser mais rápido e eficiente. Mas o systemd dificulta um pouco a tarefa de rodar alguns serviços na inicialização do sistema.
Estes dias, precisei instalar um
firewall novo, baixei o
Fedora 17 e fiz o de sempre, instalei o básico e fui colocando apenas os serviços necessários para a tarefa.
Logo percebi que o
ntsysv não conseguia executar meu script no boot e nem o
/etc/rc.local, existia mais...
A solução foi estudar um pouco o systemd, então, descobri o seguinte:
Meu arquivo com as regras de IPtables para ser iniciado no boot, fica em
/etc/ini.d/firewall, e antigamente, iniciava ele colocando no
/etc/rc.local a linha: . /etc/init.d/firewall start
No
systemd, os arquivos de controle ficam em
/etc/systemd/system, logo criei um arquivo:
# vi /etc/systemd/system/firewall.service
Com o seguinte conteúdo:
[Unit]
Description=Firewall
[Service]
Type=forking
ExecStart=/etc/init.d/firewall start
ExecStop=/etc/init.d/firewall start
[Install]
WantedBy=multi-user.target
Dei um:
# shutdown -r now
E funcionou... Melhor, às vezes funcionava e às vezes não...
Um dos objetivos do systemd é fazer o sistema inciar mais rápido, para isso, os diversos processos do S.O. não são iniciados um a um, mas em paralelo.
Em meu script, existe uma linha verificando se a placa de rede está ativa, se não estiver, ele aborta o processo, o que às vezes acontecia se houvesse qualquer atraso no DHCP.
A solução mais prática que encontrei, foi criar um atraso no script do firewall acrescentando a linha
sleep 20, isto é, ele inicia a execução, mas pára nessa linha por 20 segundos, tempo suficiente para que o systemd levante as placas de rede.
Acredito que tenha outras soluções para o problema, mas de momento, é o que está funcionando...
Quem quiser saber mais sobre o
sysmted: