Introdução

Em ambientes de treinamento eu costumava fornecer uma máquina virtual (VM) que eu dava o nome de VMCursoLadoServidor. Ainda continuo com esta mania (meus alunos copiam uma VM pronta) mas, agora, eu não a disponibilizo mais para download. Em vez disso, eu estou entregando um arquivo kickstart do CentOS para que você mesmo instale sistema operacional em uma máquina real, ou virtual utililizando teu software de virtualização preferido.

Este post explica como eu crio o mirror que disponibilizo em http://centos.pj. Esta URL é, como expliquei no post VirtualHost em Apache 2 No OS X Mountain Lion, um virtual host que disponibilizo no Apache instalado em meu notebook. Um mirror, por sua vez, é uma cópia de um site que possui pacotes, informações para instalação e ISOs de uma distribuição Linux (nesse caso, o CentOS).

Em próximos posts, mostrarei como construo esta VM no VirtualBox pela linha de comando através do utilitário VBoxManage e do uso de um arquivo kickstart. Mas, agora, vamos a construção do mirror. ;)

Por que o CentOS?

Talvez, antes de começar a ler o resto desse post, você me questione: porque você está trabalhando com o CentOS agora se, antes, a vm-curso-ladoservidor era criada com o Ubuntu? A minha resposta para isso é que, neste instante, eu estou escrevendo o livro "JBoss Certified Application Administrator (JBCAA) - Prático, detalhado e passo a passo" e, o CentOS é a distribuição que estou utilizando para executar todos os comandos que apresento nesse livro. Em breve eu disponibilizarei seu capítulos iniciais e esse texto estará contido nele.

Agora, voltando ao assunto! ;) Um mirror é muito útil na montagem de um ambiente de treinamento que utilize o CentOS. Seu uso possibilita que as máquinas busquem pacotes da rede local ao invés da Internet e isso contribui muito na velocidade de instalação destas máquinas. Além disso, podemos utilizar um mirror local para incluir pacotes proprietários que só possam estar disponíveis no ambiente onde ele está instalado.

Geralmente eu levo uma VM preparada para que os alunos simplesmente copiem e executem no primeiro dia de aula. Contudo, durante o curso, às vezes preciso demostrar a instalação de alguns pacotes. O mirror que crio em minha máquina ajuda muito quando o acesso a Internet é complicado, restrito, lento ou inexistente. Assim, quando ela está ativa na rede do ambiente de treinamento, o mirror também está.

Criando um mirror do CentOS

A criação do mirror é muito simples! \o/ Basicamente, eu executo o script mirror.sh que faz a cópia de um mirror público do CentOS (no script eu utilizo um de Costa Rica). Em seguida, eu disponibilizo o diretório desta cópia (mirror local) através do VirtualHost http://centos.pj (leia o post "VirtualHost Em Apache 2 No OS X Mountain Lion" para saber como eu configuro esse VirtualHost).

Do diretório acessado por http://centos.pj até o conteúdo do script mirror.sh:

$ cd ~/Sites/
$ ls -l
total 24
lrwxr-xr-x  1 pj  staff  28 Jan 15 17:48 CentOS -> /Users/pj/Work/CentOS/mirror
lrwxr-xr-x  1 pj  staff  37 Feb 10 14:27 LadoServidor -> /Users/pj/LadoServidor/Dropbox/Public
lrwxr-xr-x  1 pj  staff  41 Jan 26 11:12 curso-jboss -> /Users/pj/Work/cursos/publico/curso-jboss
$ cat LadoServidor/posts/criando-um-mirror-do-centos/mirror.sh 
#!/bin/bash

cd ~/Work/CentOS

rsync --progress -avrt --delete --delete-excluded \
--include "isos/i386/CentOS-6.3-i386-netinstall.iso" \
--exclude "isos/i386/*" \
--exclude "isos/x86_64" \
--exclude "local*" \
--exclude "centosplus" \
--exclude "x86_64" \
rsync://mirrors.abdicar.com/costarica_CentOS/6.3/ mirror/6.3

cd mirror

[ -L 6 ] || ln -s 6.3 6

Observe que fazer um mirror é algo tão simples quanto executar o comando rsync com alguns parâmetros. No meu caso, esses parâmetros fazem coisas como pedir para apresentar o progresso da cópia por arquivo, excluir os arquivos que são locais e não estão mais no mirror público, não fazer a cópia de alguns diretórios (--exclude) e, por fim, fazer a cópia do CentOS 6.3 para o diretório mirror/6.3. Feito isso, o script altera o diretório corrente para o do mirror e, não havendo o link simbólico 6 apontando para o diretório do mirror (6.3), cria-o. Em ambientes de treinamento eu não costumo trabalhar com VMs de 64 bits e, portanto, também ignoro em meu mirror local os pacotes desta versão do CentOS. Eu também solicito ao rsync que ignore todos os arquivos em isos/i386 e em isos/x68_64 exceto o CentOS-6.3-i386-netinstall.iso pois ele será o ISO que utilizarei para fazer a instalação do CentOS.

A primeira vez que a execução do script mirror.sh for realizada, ela será demorada e baixará milhares de arquivos. Mas, nas próximas vezes, será realizada apenas uma sincronização para igualar o mirror local com o remoto. No instante em que escrevo este post, meu mirror local tem o tamanho e a quantidade de arquivos apresentados pelos comandos a seguir:

$ du -hsc `readlink CentOS`
 23G  /Users/pj/Work/CentOS/mirror
 23G  total
$ find `readlink CentOS` -type f | wc -l
   13439

Configurando o CentOS para utilizar o mirror local

Nas máquinas CentOS que utilizarão o mirror criado, é necessário configurar o arquivo /etc/yum.repos.d/CentOS-base.repo. Basicamente a edição desse arquivo com o comando sed, conforme apresentado a seguir, ajusta o que é preciso:

$ sudo sed -i '
s/^\(mirrorlist\)/#\1/g
s/#\(baseurl=\).*$/\1http:\/\/centos.pj\/\$releasever\/os\/\$basearch\//g
' /etc/yum.repos.d/CentOS-Base.repo

A mudança efetuada pelo comando acima comenta o uso de mirrorlist e ajusta baseurl para que aponte para o mirror recém criado. Desta forma, o CentOS não irá mais buscar, ao utilizar o gerenciador de pacotes yum, nenhum mirror e simplesmente tentará baixar os pacotes que estiverem configurados em baseurl.

Fácil assim! ;)

Conclusão

Criar um mirror de uma distribuição Linux (como o CentOS) em sua máquina pode ser extremamente útil quando é necessário compartilhar pacotes que serão instalados por várias outras máquinas na mesma rede. Apesar do espaço tomado pela mirror em sua construção, num ambiente restrito como uma rede local de uma empresa ele atual basicamente como um cache, poupando o download repetitivo de pacotes por várias outras máquinas e, também, servindo como ponto único para que todas as máquinas busquem os pacotes atualizados localmente, sem necessidade de acesso a Internet.