Como criar um repositório interno do CentOS

O objetivo deste post, é mostrar como criar um repositório local do CentOS.

Criando um repositório local você tem alguns benefícios interessantes, dentre eles a economia do uso do link de internet em suas máquinas toda vez que for atualizar ou instalar pacotes novos, ou ainda, pode ser útil nos casos onde você não pode liberar acesso internet para todas as máquinas. Então você configura o seu repositório local e aponta as suas demais máquinas para buscarem os pacotes nele.

Neste tutorial, vamos fazer um repositório local do CentOS 6.4 para a arquitetura x86_64 (64 Bits) e configurá-lo para enviar emails de alerta com o Exim

Preparação do ambiente

Instalação do Apache

[root@ricardo ~]# yum install httpd

Instalar o pacote createrepo

Instalação do pacote createrepo, que cria informações de repositório utilizadas pelo yum e armazena estes dados numa pasta chamada “repodata”.

[root@ricardo ~]# yum install -y createrepo

Construir a estrutura do repositório

[root@ricardo ~]# mkdir -p /var/www/html/centos/6.4/{os,updates,fasttrack,extras,cr,contrib,centosplus,epel}/x86_64/

*Neste caso, queremos apenas pacotes 64bits

** Note que criaremos também uma pasta chamada epel. Será utilizada para baixarmos também pacotes do repositório Epel, necessário para a instalação de alguns pacotes extras, que não constam na mídia de instalação do CentOS. Maiores informações em http://fedoraproject.org/wiki/EPEL/FAQ#What_is_EPEL.3F

Criando o link simbólico:

[root@ricardo ~]# ln -s /var/www/html/centos/6.4 /var/www/html/centos/6

Precisamos copiar o conteúdo do DVD para o Apache. Então primeiro precisamos montar a ISO:

[root@ricardo ~]# mount -o loop /local_da_ISO/CentOS-6.4-x86_64-bin-DVD.iso /mnt

Copiando os arquivos:

[root@ricardo ~]# cp -pvr /mnt/* /var/www/html/centos/6.4/os/x86_64

Criando o repositório:

[root@ricardo ~]# createrepo /var/www/html/centos/6.4/os/x86_64

Script de rsync das atualizações

Agora iremos criar um script que será responsável por baixar as atualizações e utilizar um servidor smtp interno para enviar um e-mail informando o momento em que o download das atualizações foi concluído.

[root@ricardo ~]# vim /root/sync_repo.sh
#!/bin/bash
#CentOS updates
/usr/bin/rsync -avrt rsync://mirror.cogentco.com/CentOS/6.4/updates/x86_64/ --exclude=debug /var/www/html/centos/6.4/updates/x86_64/
/usr/bin/createrepo --update /var/www/html/centos/6.4/updates/x86_64/
/usr/bin/rsync -avrt rsync://mirror.cogentco.com/CentOS/6.4/fasttrack/x86_64/ --exclude=debug /var/www/html/centos/6.4/fasttrack/x86_64/
/usr/bin/createrepo --update /var/www/html/centos/6.4/fasttrack/x86_64/
/usr/bin/rsync -avrt rsync://mirror.cogentco.com/CentOS/6.4/extras/x86_64/ --exclude=debug /var/www/html/centos/6.4/extras/x86_64/
/usr/bin/createrepo --update /var/www/html/centos/6.4/extras/x86_64/
/usr/bin/rsync -avrt rsync://mirror.cogentco.com/CentOS/6.4/cr/x86_64/ --exclude=debug /var/www/html/centos/6.4/cr/x86_64/
/usr/bin/createrepo --update /var/www/html/centos/6.4/cr/x86_64/
/usr/bin/rsync -avrt rsync://mirror.cogentco.com/CentOS/6.4/contrib/x86_64/ --exclude=debug /var/www/html/centos/6.4/contrib/x86_64/
/usr/bin/createrepo --update /var/www/html/centos/6.4/contrib/x86_64/
/usr/bin/rsync -avrt rsync://mirror.cogentco.com/CentOS/6.4/centosplus/x86_64/ --exclude=debug /var/www/html/centos/6.4/centosplus/x86_64/
/usr/bin/createrepo --update /var/www/html/centos/6.4/centosplus/x86_64/
/usr/bin/rsync -avrt rsync://mirrors.rit.edu/epel/6/x86_64/ --exclude=debub /var/www/html/centos/6.4/epel/x86_64/
/usr/bin/createrepo --update /var/www/html/centos/6.4/epel/x86_64
nc 127.0.0.1 25 < /root/email

Conteúdo do email que será enviado ao término das atualizações (/root/email):

HELO 127.0.0.1
MAIL FROM:repositorio@ricardomartins.com.br
RCPT TO:sysadmin@ricardomartins.com.br
DATA
SUBJECT: Novas atualizações no Repositório CentOS
O repositório foi atualizado.
.
QUIT

Ajustando as permissões para a execução do script:

# chmod +x /root/sync_repo.sh

Agendando a execução do script:

# vim /etc/crontab
00 00 * * * /root/sync_repo.sh

 Configurando o Exim para o envio de e-mails

Primeiro instalamos o Exim e em seguida removemos o Sendmail (caso esteja instalado).

# yum install exim

A configuração do exim é feita no arquivo /etc/exim/exim.conf. Como a configuração padrão atende ao que queremos fazer, não vou modificar nada.

Removendo o Sendmail:

# yum remove sendmail

Inicializando o Exim e garantido sua inicialização no boot

# service exim start
# chkconfig exim on

Configurando os servidores que serão clientes do nosso repositório local

Faça antes um backup do arquivo original:

# cp -p /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.orig

Em seguida altere a url para o endereço do seu servidor interno.

#vi /etc/yum.repos.d/CentOS-base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://ip.do.servidor/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[updates]
name=CentOS-$releasever - Updates
baseurl=http://ip.do.servidor/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[extras]
name=CentOS-$releasever - Extras
baseurl=http://ip.do.servidor/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[cr]
name=CentOS-$releasever - Cr
baseurl=http://ip.do.servidor/centos/$releasever/cr/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://ip.do.servidor/centos/$releasever/contrib/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[centosplus]
name=CentOS-$releasever - Centosplus
baseurl=http://ip.do.servidor/centos/$releasever/centosplus/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[epel]
name=CentOS-$releasever - Epel
baseurl=http://ip.do.servidor/centos/$releasever/epel/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

Testando

Vá em uma máquina cliente, e faça uma atualização:

# yum update

Ou uma pesquisa:

# yum search [pacote]

Testando a instalação de um pacote:

# yum install [pacote]

Por hoje é isso…

  • Roberto Santiago

    Opa Ricardo fiz o procedimento de repositório local do Centos que vc postou, porem utilizei com os comandos para o 6.5, e o Rsync acabou não funcionando, as máquinas clientes estão comunicando normalmente, porem quando rodo o script para atualização do repo local da erro, com a seguinte mensagem:

    Saving Primary metadata
    Saving file lists metadata
    Saving other metadata
    Generating sqlite DBs
    Sqlite DBs complete
    rsync: failed to connect to mirror.cogentco.com: Connection timed out (110)
    rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.6]

    Tem alguma solução para isso ?

    • Opa Roberto, obrigado pelo seu comentário!

      Você consegue validar se realmente o acesso da máquina onde está rodando o rsync até o endereço mirror.cogentco.com está ok? Pois pela mensagem de erro de “Connection timed out” parece que existe um problema de conexão.

      • Opa Ricardo, realmente não deu certo, não sei se seria pq estou usando a versão 6.5, pois o que fiz foi so alterar o que estaria escrito 6.4 para 6.5, pode ser que deu pau nisso ai, se não for pedir demais rsrsrsrs…. vc não gostaria de fazer um tuto massa igual a esse acima para a versão 6.5 ????? agradeceria muito, acho que não somente eu, como todos que acessam o seu site, abração.

  • Reginaldo

    Meu amigo boa noite fiz o passo a passo que vc colocou no site mas gera um erro: @ERROR: Unknown module ‘pub’
    rsync error: error starting client-server protocol (code 5) at main.c(1503) [receiver=3.0.6]

    Saving Primary metadata
    Saving file lists metadata
    Saving other metadata
    Generating sqlite DBs
    Sqlite DBs complete

    Voce já viu este erro?
    Se puder me ajudar agradeço

  • Marcus Sousa

    Fala Reginaldo e galera do Blog. Para ajudar na questão aí. É o seguinte o erro está acontecendo pq o caminho que foi colocado na url é para protocolo http. Se vc abrir esta url http://mirror.cogentco.com/pub/linux/centos/ no browser irá funcionar, no rsync não. Isto é pq se vc for na url principal http://mirror.cogentco.com, vc vai notar que não existe o “pub” lá publicado, Este diretório é chamado através de um redirecionamento no apache quando vc clica no dir CentOS. Então o que vc deve fazer é colocar no seu browser o diretório http://mirror.cogentco.com e aí vc irá verificar o diretório CentOS. Pegue este CENTOS e modifique no seu comando rsync que deve estar assim rsync://mirror.cogentco.com/pub/linux/centos/6.6/contrib/x86_64/ –exclude=debug /var/www/html/centos/6.6/contrib/x86_64/ para /usr/bin/rsync -avrt rsync://mirror.cogentco.com/CentOS/6.6/contrib/x86_64/ –exclude=debug /var/www/html/centos/6.6/contrib/x86_64/.

    Obs. Realizamos a configuração em cima do Centos 6.6

    Mas de qualquer forma Ricardo, obrigado pois o blog ajudou muito. E já estamos utilizando aqui na empresa.

    Abraço a todos.

  • Ricardo Martins

    Sensacional o comentário Marcus. É exatamente este o ponto. O diretório pub é um redirect, não visto pelo rsync

  • mdunguel

    Bom dia, Ricardo.

    Segui o seu tutorial para a criação de um repositório local para Centos, porém estou recebendo a seguinte mensagem de erro:

    http://192.168.1.150/centos/6/extras/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 – “The requested URL returned error: 404 Not Found”

    http://192.168.1.150/centos/6/extras/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 – “The requested URL returned error: 404 Not Found”