Quem é o /etc/rc.local ?

Você conhece o arquivo /etc/rc.local ? ou para que serve ?

O arquivo /etc/rc.local é um script onde você instrui ao Linux o que deve ser executado logo após iniciar todos os serviços ou como se diz popularmente, o que deve ser executado após o boot.
Geralmente ele é um arquivo assim :

#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will “exit 0” on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing

exit 0;

Vê a linha exit 0; ?
Pois bem, é antes dessa linha que adicionamos comandos que queremos que sejam executados logo após o boot (porém depois dos serviços iniciados) como por exemplo um script de firewall, montagem de discos remotos e assim por diante.

Eu tenho como hábito adicionar linhas assim :

# previne o fork-bomb
ulimit -u 1000

Existe em todas as linguagens de programação, independente de sistema operacional ou permissões de usuário, um recurso chamado fork que quebra o programa em um ou mais processos, este recurso se bem utilizado é primoroso, no entanto, se um bug ou má intenção de um programa (conhecido como fork-bomb) disparar fork’s a todo instante então em pouco tempo vai consumir todos os recursos da máquina até ela travar. O que a linha acima faz, é estabelecer um limite para a quantidade de processos que o kernel poderá processar, esse limite é arbitrário e relativo, para a maioria, 1.000 processos é um valor bastante razoável.

Outra linha que costumo adicionar :

# previne smurf-attack
echo "0" >/proc/sys/net/ipv4/icmp_echo_ignore_all

Você provavelmente já ouviu falar de ataques de negação de serviços (em inglês DoS-Denial of Service), o que a linha acima tenta prevenir. Eu não sei a história do nome “Smurf Attack”, mas provavelmente leva esse nome pela maneira como os Smurfs do desenho animado sempre atacavam seu oponente, nunca sozinhos porque era pequenos e frágeis, mas em conjunto com os seus amigos. Esse tipo de DoS funciona assim, o atacante sobreescreve o cabecalho do datagrama disfarçando seu IP com o IP da vitima e envia uma solicitação de broadcast para outra vítima, daí então a segunda vitima responderá o broadcast para a primeira vitima ao invés do atacante, fica parecendo dois navios atacando um ao outro com broadcasts intermináveis. A linha acima tenta evitar esse tipo de DoS.

Estes foram apenas dois exemplos, há muito mais que também incluo, eles podem estar num script único ou em forma de instruções separadas como foi exibida acima, mas o fato é demonstrar o uso do arquivo /etc/rc.local que agora você poderá utiliza-lo para incluir suas próprias instruções.

Algo que as vezes preocupa em usar o arquivo /etc/rc.local é o tempo de boot que é proporcional a quantidade de instruções que você for incluir nele. Além disso, o terminal texto ou gráfico só prosseguirá quando o /etc/rc.local tiver sido completamente executado. Por essa razão não é muito saudável você colocar nele o carregamento dum script de firewall que utilize resoluções de nomes DNS, pois se seu script tiver uma linha assim :

/sbin/iptables -t nat -A POSTROUTING -s $SUA_REDE -o eth0 -d br.ubuntu.com -j MASQUERADE

O tempo de boot do seu computador demorará proporcionalmente ao tempo que for para resolver o nome “br.ubuntu.com”. Isso traz algumas armadilhas, digamos que seu link fique fora do ar, o que acontece ? A resolução do nome acima vai levar uma eternidade, daí vai ficar louco da vida para acessar logo o terminal para resolver o problema, mas /etc/rc.local simplesmente demorará muito até liberar o terminal porque ficou num ciclo de resolução de nomes sem link para o servidor de DNS.

O exemplo ruim foi um script de firewall, mas tente entender que isso valha para qualquer processo que consuma tempo, quanto mais lingüiça colocarmos no /etc/rc.local mais tempo levará o boot, se uma dessas instruções travar, você simplesmente matou o boot.

É claro que existem meios de contornar a situação ao usar o /etc/rc.local, uma delas é o “&” no final de um comando a ser executado, isto fará com que comando seja executado em background e liberará o /etc/rc.local para prosseguir, por exemplo :

# montar a pasta sshfs com uso de chaves
sshfs root@ip.do.servidor:/home/pasta_compartilhada /media/pasta_local/ -o allow_other&

Notou o “& ” (E comercial) no final da linha ? Pois é, assim o comando será executado em background, e o arquivo /etc/rc.local prosseguirá com a próxima linha a ser executada.

Outro método, útil especialmente se você não abre mão de carregar um script longo no /etc/rc.local é usar o sistema de agendamento do Linux com o comando “at”. Digamos que você queira que o script de firewall seja executado 1 minuto após o boot inicial, basta acrescentar ao /etc/rc.local a instrução :

at now + 1 minute -f /carregar/meu/script/de/firewall.sh

O que a linha acima faz é rodar o script /carregar/meu/script/de/firewall.sh 1 minuto mais tarde. Assim o nosso querido /etc/rc.local não sofre nenhuma interrupção no momento de boot, ou ela será mínima. Se seu script tiver problemas com resoluções de nomes, seu terminal já estará liberado para você fazer qualquer acerto. A mesma idéia vale para qualquer script que possa comprometer o /etc/rc.local.
Nota: Para executar comandos “at”, o pacote “atd” precisa estar instalado.

É claro que essas dicas valem muito, você não as encontrará em Livros porque administradores de rede são como donos de veículos antigos, que muitas vezes são obrigados a construir suas próprias peças ou no nosso caso, nossas próprias soluções.

Talvez, na próxima oportunidade eu venha a falar do /etc/rc.d/ e como criar scripts auto-inicializáveis com start/stop.

  1. #1 por Lauro César em 23 \23\UTC dezembro \23\UTC 2008 - 11:32

    Cara… Instalei o Fedora 8 em 04 máquinas no trabalho de minha esposa e ele tinha um problema que, quando a internet estava fora d ar ele simplesmente demorava uma eternidade para dar boot e quando finalmente iniciava ficava lento pacas… O problema era com o cups que embora compartilhasse a impressora na rede interna ficava louco quandoa conexão com a internet falhava. Será que era algum problema em algum script desses? Parece que hoje está resolvido mas fiquei um bom tempo sofrendo com isto e não achei solução.

  2. #2 por Patola em 23 \23\UTC dezembro \23\UTC 2008 - 19:49

    Nota: O rc.local é carregado antes dos serviços (/etc/rc2.d) e o atd é carregado pelos serviços. Então a linha que você enviar pelo comando “at” só será iniciada depois de o atd carregar. Isso é importante para quem tiver que considerar a seqüência de inicialização dos comandos.

  3. #3 por Nighto em 24 \24\UTC dezembro \24\UTC 2008 - 18:58

    Excelente artigo. Já conhecia o sujeito, mas não tão profundamente, nem o at, que me pareceu muito útil. Obrigado!

    []

  4. #4 por t0ze em 25 \25\UTC dezembro \25\UTC 2008 - 20:52

    Obrigado pela dica :-)

  5. #5 por Fabiano Pachêco de Carvalho em 25 \25\UTC dezembro \25\UTC 2008 - 22:41

    Excelente dica. Muito útil para personalizar o ubuntu de uma forma mais aprofundada. Parabéns pelo post.
    http://fabianopc.wordpress.com

  6. #6 por hamacker em 27 \27\UTC dezembro \27\UTC 2008 - 18:50

    Patola, companheiro ex-conectiva, a nota dentro do /etc/rc.local
    esclarece que os comandos alí são executados no final de qualquer rc
    level.

    Aqui no trabalho, nenhum serviço é executado depois do rc.local
    o que parece corroborar com a minha afirmação. Tú tens certeza disso ?

  7. #7 por Patola em 29 \29\UTC dezembro \29\UTC 2008 - 1:00

    Não, você tem razão. Comi mosca… É no final e não no começo da execução do rc.

  8. #8 por Rafael em 19 \19\UTC junho \19\UTC 2009 - 20:43

    Olá
    Legal a leitura, agregando dicas…

    Já conhecia o script comentado aqui, mas não pra minha surpresa aparece o sinal de ponto e virgula após o exit 0
    a pergunta, ele é opcional? vi aqui no ubuntu e no debian, e em ambos não tem ; na instalação “limpa”, até vou conferir no slack.
    mas mesmo assim vou experimentar colocar, me parece para marcar o fim da linha, como em algumas linguagens. Certo?

    Abraços

  9. #9 por Walmyr em 23 \23\UTC julho \23\UTC 2009 - 16:29

    Adorei o artigo, tive que adicionar umas linhas ao rc.local, pra consertar um bug da wi fi do notebook da minha namorada. Obrigado pela dica. :)

%d blogueiros gostam disto: