Criando repositório local de pacotes Debian e Ubuntu

Num passado não muito distante eu ainda acessava a Internet usando conexão discada e com provedor gratuito (acredito que ainda haja muita gente nessa situação). Nunca tive do que reclamar da minha conexão “banda-lerda” a não ser do fato que quando a máquina dava problemas e eu precisa reinstalar tudo novamente teria que baixar todos os pacotes de atualização novamente, por conta disso fui obrigado a procurar uma solução para evitar downloads que já tinha realizado antes.

Havia ainda o problema de download do mesmo pacote diversas vezes para instalação nos 8 servidores que rodam Debian lá do trabalho. Como estava ficando entediado daquilo resolvi partir para busca de como criar um repositório local de forma que uma vez que tivesse o pacote atualizado poderia já utiliza-lo em qualquer instalação Debian que fizesse daí para frente sem muitas dores de cabeça. O resultado desta busca é o que descrevo abaixo e que certamente será muito útil para mais alguém.

Antes de mais nada é bom deixar claro que o que eu vou descrever aqui não é  novo e muito menos sofisticado já que isso está documentado no HOW-TO do APT [1] além de outros artigos espalhados pela Internet e indexados pelo Google como pode ser visto em [2], e também este artigo em hipótese alguma esgota o assunto.

Nota: Daqui para frente vamos partir do pré-suposto que todos os comandos devem ser executados com privilégios administrativos (usuário root). Na realidade alguns deles até poderiam ser executados com um usuário ordinário, mas optei por seguir este padrão de forma que ninguém venha a ter dúvidas se algo não funcionar.

Criando um lar para o nosso repositório

Indo direto a prática a primeira coisa que precisamos é um diretório onde tenhamos espaço suficiente para guardar o nosso repositório. Eu sugiro um diretório na raiz do sistema chamado /debian onde nós incluiremos alguns subdiretórios para compor a estrutura do nosso repositório.

# mkdir -p /debian/dists/etch/main/binary-i386

Note que estamos criando um diretório para raiz dos nossos repositórios (debian) e dentro dele um diretório com o nome da distribuição (etch) e em seguida outro para guardar os pacotes binários para a minha arquitetura (binary-i386).

Com exceção deste último, os anteriores poderão ter os nomes que você preferir, desde que não se esqueça de mudá-los também no restante do artigo.

Como esse repositório é para uso pessoal apenas e nós teríamos muito trabalho para ficar separando de qual seção baixamos determinados pacotes para organizá-los, sugiro que haja apenas a seção “main” mas se você quiser se aventurar a ficar selecionando os pacotes e move-los para outros diretórios sinta-se a vontade, crie também o contrib, o nonfree etc. Mas lembre-se que “os pacotes não nascerão lá sozinhos” e você terá que gerenciar isso na mão.

Vale lembrar ainda que poderíamos apenas ter usado um diretório como “/debian” apenas para criar o nosso repositório, mas se fizermos isso no caso de gravarmos o nosso repositório em um CD o apt-cdrom não conseguirá achar o repositório corretamente, além do mais fica muito feio 😉

Copiando os pacotes para o local apropriado

Agora que já temos o nosso local para o repositório devemos copiar os arquivos “.deb” para dentro dele. O cache do apt é um bom local de onde podemos começar copiando os arquivos que alimentarão o nosso repositório. Então vamos fazer uma cópia integral dele:

# cp /var/cache/apt/archives/*.deb /debian/dists/etch/main/binary-i386

Se você possui mais arquivos “.deb” em algum outro local no seu HD sinta-se a vontade para copiá-los para este diretório também e assim ter um repositório único de onde você poderá gerenciar todos os seus pacotes. Apesar de não haver restrições quanto a quantidade de pacotes a serem movidos ali pra dentro, eu sugiro que você defina um tamanho máximo para o seu repositório, por exemplo eu gosto muito do número “650MB”, pelo simples motivo que assim posso gravar todo o repositório em um CD e futuramente usá-lo como se fosse um “quase CD oficial” de atualizações. Digamos que seria algo como o “Kokar” [3] que,acredito eu, todos devem conhecer do filho brasileiro do Debian, o “Kurumin” [4]. Se você for um feliz proprietário de um DVD-Writer, talvez você goste do número 3.8GB e queira gravar tudo num DVD-R. O procedimento será basicamente o mesmo.

Caso precise de uma ajuda para procurar e mover os seus arquivos “.deb” para o novo local sinta-se a vontade em usar o comando “find” para auxiliar nesta árdua tarefa. Algo como o comando a seguir deve ser suficiente:

# find / -name "*.deb" -exec mv {} /debian/dists/etch/main/binary-i386 \;

Indexando o novo repositório

Agora que já temos os nossos arquivos “.deb” concentrados em um único local podemos indexar o nosso repositório. Sem entrarmos muito em detalhes sobre onde, como, pra que ou por que, os comandos abaixo resolverão o nosso problema:

# cd /debian
# dpkg-scanpackages dists/etch/main/binary-i386 /dev/null >dists/etch/main/binary-i386/Packages 2>/dev/null
# cd dists/etch/main/binary-i386
# gzip -c Packages > Packages.gz

O comando “dpkg-scanpackages” é quem fica responsável por criar o nosso índice de pacotes que deve ter, obrigatoriamente, o nome “Packages”. Em seguida entramos no diretório onde estão os nossos pacotes e compactamos este arquivo com o utilitário GZip.

Uma rápida leitura na página de manual deste comando trará luz as suas dúvidas sobre ele. Por hora só nos interessa observar que estamos direcionando a saída de erro (“2>”) para o /dev/null e descartando-a por completo. Seria legal se nós, ao invés disso, redirecionássemos essa saída para um arquivo que posteriormente nos ajudaria a remover os pacotes duplicados (se existirem). Mas deixemos assim por enquanto!

Identificando a seção do repositório

Agora vamos criar o arquivo “Release” que contém informações sobre a seção do nosso repositório executando as seguintes ações:

1 – Abra um editor de textos, como o nano, por exemplo

# nano /debian/dists/etch/main/binary-i386/Release

2 – Digite esse conteúdo:

Archive: etch
Component: main
Origin: Debian
Label: RepositorioLocal
Architecture: i386

Esteja atento ao “Archive” e ao “Component” caso você tenha mudado o nome dos diretórios, quando os criou lá no inicio do artigo.

Nota: Para encontrar estes atributos eu usei como base alguns CDs de instalação Debian. Apesar dos seus nomes fazerem sentido e dispensar comentários, por-favor não encham a minha caixa postal perguntando se existem outros além deles pois a minha resposta será um simples “não sei”, com a possibilidade de variações como “sei lá” ou ainda “não faço a menor idéia” 😉 Talvez haja alguma página explicando sobre eles no site do Debian, mas como isso é o suficiente para que tudo funcione eu não quis pesquisar a respeito. Mas sinta-se a vontade a pesquisar e se quiser compartilhar comigo as suas descobertas é só entrar em contato.

Identificando o repositório

O repositório em si é identificado da mesma forma que a seção, a diferença está nos demais parâmetros do arquivo Release e no local onde ele fica. Então novamente poderíamos abrir o nosso editor de textos para criar este outro arquivo, mas como ele é um pouco mais complexo eu prefiro listar aqui um pequeno shellscript que o cria pra não termos muito trabalho.

#!/bin/bash
# Script para Identificar um repositório local de pacotes Debian/Ubuntu
# Welington Braga - Maio/2006
#
ORIGIN="Debian"
LABEL="MeuRepositorioLocal"
DISTRIB="etch"
ARCHITECTURE="i386"
DESCRIPTION="Repositório Local de Welington Braga"
CAMINHO="/debian"
RELEASE_MASTER="$CAMINHO/dists/$DISTRIB/Release"
#
cd "$CAMINHO"
echo " * Escrevendo o Release do repositório";
echo "Origin: $ORIGIN" > "$RELEASE_MASTER" ;
echo "Label: $LABEL" >> "$RELEASE_MASTER" ;
echo "Suite: $DISTRIB" >> "$RELEASE_MASTER" ;
echo "Codename: $DISTRIB" >> "$RELEASE_MASTER" ;
echo "Date: `date +%c`" >> "$RELEASE_MASTER" ;
echo "Architectures: $ARCHITECTURE" >> "$RELEASE_MASTER" ;
echo "Description: $DESCRIPTION" >> "$RELEASE_MASTER" ;
echo "Components:" `find "dists/$DISTRIB" -mindepth 1 -maxdepth 1 -type d -printf "%f "` >> "$RELEASE_MASTER" ;
echo "MD5Sum:" >> "$RELEASE_MASTER" ;
for M in `find "dists/$DISTRIB" -mindepth 1 -maxdepth 1 -type d -printf "%f "`; do cd "dists/$DISTRIB" ; md5sum "$M/binary-$ARCHITECTURE/Release"; md5sum "$M/binary-$ARCHITECTURE/Packages"; md5sum "$M/binary-$ARCHITECTURE/Packages.gz"; cd "$OLDPWD"; done >> "$RELEASE_MASTER" ;

Eu costumo salvar este script dentro da pasta “/debian” com o nome “indexrep.sh” e após isso basta dar permissão de execução e dispará-lo via linha de comandos:

# nano /debian/indexrep.sh
# chmod u+x /debian/indexrep.sh
# /debian/indexrep.sh

Note que a primeira parte do script possui apenas algumas definições de variáveis para facilitar a manutenção dele, assim se você precisar criar outro repositório basta alterar estas variáveis.

Na segunda parte vem o que eu chamei de “um pouco mais complexo”. Observe os atributos “Components” e “MD5sum”. Não seria nada impossível de preenchê-los na mão, mas seria trabalhoso ficar calculando o HASH MD5 de cada arquivo de índice nas seções do nosso repositório. Então a menos que você tenha tempo sobrando e precise massagear o seu ego calculando os Hashs na mão, eu recomendo que você salve este script no disco, dê permissão de execução e use-o com toda liberdade.

Observe ainda que para cada distribuição haverá um arquivo deste com dados de todos os diretórios referentes as seções em cada uma delas.

Usando o seu novo repositório

Finalmente o seu repositório está pronto para uso. Agora nós devemos incluir o seu caminho no /etc/apt/sources.list e atualizar a lista de pacotes. Para incluí-lo use o seu editor de textos preferido, ou a ferramenta gráfica apropriada para isso, como por exemplo o utilitário “Canais de Software” em Sistema/Administração no Ubuntu:

deb file:/debian/ etch main

Para atualizar a lista de pacotes use o já tradicional comando aptitude update ou apt-get update ou ainda usando o Synaptic via modo gráfico.

Prontinho! Agora é só instalar os seus pacotes como se fosse um repositório oficial.

Gravando o seu novo repositório em CD

A gravação em CD pode ser feita da maneira como melhor agradar ao estimado leitor, desde que se respeite as seguintes regras:
1 – Seu(s) repositório(s) devem caber no CD (cerca de 680MB, no máximo).
2 – Tudo que estiver abaixo de “/debian” deve ser gravado como está.

Obs.: A regra um pode ser ampliada caso você tenha como gravar em DVD, ao invés de CD neste caso poderíamos gravar repositórios de até 4GB, aproximadamente.

Após gravado você pode incluir o CD na lista de repositórios do seu sistema usando o comando:

# apt-cdrom add

A partir daí é só alegria, toda vez que você precisar instalar um pacote que esteja no CD o Debian o pedirá para inserir a mídia, então divirta-se!

Considerações finais – Há um jeito mais simples

Este texto estava engavetado desde Maio/2006, quando o escrevi para ser publicado na Debian Zine que infelizmente deixou de existir. Depois que o escrevi surgiram algumas ferramentas gráficas que fazem exatamente a mesmíssima coisa, só de forma mais amigável tal como o AptOnCD[5]. Então se você não quer se “sujar” com a linha de comandos do seu Debian/Ubuntu vale apenas instalar esta ferramenta que automatiza tudo pra você

Referências

[1] How-to oficial do APT – http://www.debian.org/doc/manuals/apt-howto/ch-basico.pt-br.html#s-dpkg-scanpackages
[2] Repositórios locais para Debian – http://www.google.com.br/search?q=reposit%C3%B3rio+local+debian
[3] Kokar, addons para o Kurumin – http://www.guiadohardware.net/gdhpress/kurumin/#kokar
[4] Kurumin, distribuição GNU/Linux brasileira – http://www.guiadohardware.net/gdhpress/kurumin/
[5] Site oficial do projeto AptOnCD – http://aptoncd.sourceforge.net

11 comentários em “Criando repositório local de pacotes Debian e Ubuntu”

  1. @Alcyr
    Revise os passos, verifique se este monte de pacotes foram realmente indexados. Acredito que você tenha esquecido algo.

    @William
    O APTOnCD fechar anormalmente indica que há algo errado com o seu sistema. Talvez haja algum pacote crítico corrrompido, o uso de recursos em demasia que força o Linux a fechar alguma aplicação etc. Tente reduzi a quantidade aplicações abertas e tente novamente.

    @William
    Eu também tinha feito um script, mas o seu ficou show.

  2. fiz tudo e deu certo mais tenho uma duvida:

    os grandes repositorios como os do ubuntu e do debian e os ppa exigem autenticação e aquele negocio de chave pgp
    vc saberia como colocar essa chave em um repositorio offline?

    1. Saudações @Vinícius Letério,
      Eu até já li a respeito do assunto mas lembro que na época achei muito trabalhoso para o fim a que eu precisava resolver. Por conta disso deixei pra lá e infelizmente não me recordo do link, mas talvez na documentação do Debian e do apt tenha esta informação.

  3. os repositorios do ubuntu tem aquela estrutura de pastas:

    http://br.archive.ubuntu.com/
    -ubuntu
    -pool
    -main
    -a
    -amarok
    -*.deb (etc)

    eu até ia fazer manualmente mais da muito trabalho colocar 2200+ arquivos debs em pastas separadas
    teria algum programa ou script que me gere esta estrutura de pasta??

    1. Rapaz, agora você me pegou.

      Eu certa vez fiz um script para criar esta estrutura de pastas, mas não consegui fazer com que os arquivos fossem corretamente indexados, por isso optei por deixar tudo junto mesmo tendo milhares de arquivos.

      Se você quiser separá-los automaticamente existe um jeito bacana que é usando o código abaixo que usei na época para este propósito.

      #Packages source
      cd /tmp/archives ;
      #Packages target
      destin=”/tmp/ubuntu/pool/main”
      for arquivo in lib*.deb; do firstletter=${arquivo:0:4}; mkdir -p ${destin}/${firstletter} || true; mv ${arquivo} ${destin}/${firstletter}; done ;
      for arquivo in *.deb; do firstletter=${arquivo:0:1}; mkdir -p ${destin}/${firstletter} || true; mv ${arquivo} ${destin}/${firstletter}; done ;

      Aqui eu considero que todos os pacotes estão em /tmp/archives e a variável “destin” indica o caminho para onde os pacotes serão movidos agrupados pela letra inicial do seu nome. Perceba que eu uso dois laços “for”, onde um eu trato os arquivos “lib*” e no outro eu trato os demais pacotes.

      Observe duas coisas entretanto:
      (1) Eu aqui considero TODOS como parte de “main”, para saber se eles deveriam estar em outro local seria necessário mais esforço e ler o cabeçalho do arquivo .deb usando o dpkg.
      (2) Como eu disse, da vez que tentei fazer este teste não obtive muito sucesso com a indexação dos arquivos. Mas não lembro o porque – talvez tenha sido falta de cabeça para persistir mais um pouco.

      Caso funcione, não deixe de compartilhar o resultado do trabalho, ok!?

  4. Primeiramente parabéns pelo seu trabalho para a comunidade linux.

    Gostaria de saber como posso também incluir os pacotes sources que baixei dos repositorios oficiais.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.