Mantendo um espelho Debian em máquinas mais velhas

Temos várias máquinas aqui que rodam Linux. É dado ao usuário o direito de escolher a distribuição que ele quiser, democraticamente. É garantido ao operador, o direito sagrado de só tirar dúvidas com respeito ao Debian. Uma excessão é gentilmente aberta ao Ubuntu. Para facilitar a difícil tarefa de escolher a distribuição, eu mantenho repositórios do Debian e do Ubuntu, além de ISOs das mesmas. O espelho é mantido em um AMD K6-500, velho de guerra. Mantenho o debian/{etch,lenny,sid} e o ubuntu/{edgy,feisty,gutsy}, nas arquiteturas i386 e amd64, além do debian-security e debian-multimedia. O ubuntu ocupa 105Gb e o debian 75Gb. Como temos vários usuários avançados, mantemos os fontes (Sources) dos pacotes, caso queiram fazer alguma alteração nos pacotes compilados.

A máquina foi instalada do zero, com o Debian Etch. O sistema de arquivos escolhido foi o ext3. As opções de montagem, no /etc/fstab, são noatime,nodiratime,errors=remount-ro para ser mais rápido. O mesmo está com a opção writeback para o journaling. Além dos pacotes da instalação básica, eu uso os seguintes para montar o mirror: lighttpd monit apticron visitors exim debmirror

O lighttpd é o servidor web, ao invés do apache, o monit para monitorar e reiniciar os serviços em caso de queda de algum deles, o apticron para baixar as atualizações e me avisar, por email, se alguma coisa precisa ser feita, o visitors para estatísticas de visitas e o debmirror para efetivamente baixar os pacotes. Na configuração do lighttpd (/etc/lighttpd/lighttpd.conf), eu só adicionei as seguintes linhas

url.rewrite      =      (
                              "^/ubuntu/(.*)" => "/mirror/ubuntu/$1",
                              "^/debian/(.*)" => "/mirror/debian/$1",
                              "^/debian-security/(.*)"        => "/mirror/debian-security/$1",
                              "^/debian-multimedia/(.*)"      => "/mirror/debian-multimedia/$1",
                              "^/debian-marillat/(.*)"        => "/mirror/debian-multimedia/$1",
                      )

A razão é que eu prefiro manter o espelho sob um diretório mirror, do que direto no /var/www. Se você não se importar, não precisa nem mexer na configuração (mas você terá que alterar o script de atualização do mirror, no final do post).

Para configurar o monit, basta acrescentar as seguintes linhas ou no final do /etc/monit/monitrc, ou dentro de um arquivo em /etc/monit/monit.d (prefiro esta, pois se mantém inalterada depois de um upgrade:

check process dhclient with pidfile /var/run/dhclient.eth0.pid
  start program = "/etc/init.d/networking start"
  stop program  = "/etc/init.d/networking stop"

check process cron with pidfile /var/run/crond.pid
 start program = "/etc/init.d/cron start"
 stop  program = "/etc/init.d/cron stop"
 if 5 restarts within 5 cycles then timeout

check process sshd with pidfile /var/run/sshd.pid
 start program = "/etc/init.d/ssh start"
 stop program  = "/etc/init.d/ssh stop"
 if failed port 22 protocol ssh then restart
 if 5 restarts within 5 cycles then timeout

check process lighttpd with pidfile /var/run/lighttpd.pid
 start program = "/etc/init.d/lighttpd start"
 stop program  = "/etc/init.d/lighttpd stop"
 if cpu > 90% for 5 cycles then alert
 if cpu > 90% for 10 cycles then restart
 if loadavg(5min) greater than 10 for 4 cycles then restart

Edite o arquivo /etc/monit/monitrc, para o email que deve receber as notificações (set alert). Caso use o monit.d, não se esqueça de tirar o comentário no final do arquivo. Você pode ainda acompanhar o estado da máquina acessando http://seu_espelho:2812, no seu browser favorito.

O visitors, que é um gerador de estatísticas simples mas que contém o que você precisa para um espelho, é chamado por um arquivo (visitors, por exemplo) salvo em /etc/cron.d, com o seguinte conteúdo:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""
9 * * * * www-data visitors -WMY /var/log/lighttpd/access.log > index.html

ou seja, atualizado de hora em hora (aos 9 minutos de cada hora). Agora basta acessar http://seu_mirror, para ter a estatística de visitas.

Para manter seu mirror atualizado, principalmente com as atualizações de segurança, instale o apticron, insira seu email no /etc/apticron/apticron.conf, e adicione o arquivo apticron no /etc/cron.d, com o seguinte conteúdo:

MAILTO="" 
SHELL=/bin/sh
0 */4 * * * root /usr/bin/apticron

para checar as atualizações, de quatro em quatro horas.

Finalmente, para baixar os pacotes, use o debmirror. Eu fiz um script para o debian, que adicionei no /etc/cron.d, também, pra atualizar o espelho uma vez ao dia

MAILTO="operador@seudominio"
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
1 23 * * * www-data /usr/local/bin/mkdebmirror-marillat
15 22  * * * www-data /usr/local/bin/mkdebmirror-debian
1 3  * * * www-data /usr/local/bin/mkdebmirror-security
1 4  * * * www-data /usr/local/bin/mkdebmirror-ubuntu

Desta vez o MAILTO não está vazio, porque eu quero ser notificado se as atualizações foram feitas corretamente. O conteúdo do /usr/local/bin/mkdebmirror-debian é o seguinte (fácil alterar para as outras atualizações):

proto=http
host=sft.if.usp.br
root=debian
destdir=/var/www/mirror/
defopt="--progress -v -p --arch=i386,amd64 --source --host=$host --root=$root \
--section=main,contrib,non-free --ignore-missing-release --ignore-release-gpg \
--dist=etch,lenny,sid  -e $proto --passive --getcontents --ignore-small-errors" 
echo "------------------ create mirror for debian ------------------"
debmirror $defopt $destdir/debian 

Agora é só baixar os pacotes e em um ou dois dias =) você terá um espelho geral do Debian, para sua rede. Acorde cedo e verifique os emails do apticron e dos scripts de atualização dos espelhos.