Consegui resolver isso com reprepro
assinando os arquivos Release
. Para referência, isso é feito com a opção SignWith
em conf/distributions
e está documentada na página reprepro(1)
.
Estou no Ubuntu 10.04 e tentando configurar um repositório usando reprepro
. Eu também gostaria que o pino de tudo naquele repositório fosse preferido sobre qualquer outra coisa, mesmo se os pacotes fossem versões mais antigas. (Ele conterá apenas um conjunto selecionado de pacotes).
No entanto, parece que não consigo fazer o pinning funcionar e acredito que tenha algo a ver com o lado do repositório, em vez da configuração apt
no cliente.
Tomei as seguintes etapas para configurar meu repositório
/var/www/apt/
Criado o arquivo conf/distributions
, assim:
Origin: Shteef
Label: Shteef
Suite: lucid
Version: 10.04
Codename: lucid
Architectures: i386 amd64 source
Components: main
Description: My personal repository
Executou reprepro export
do diretório /var/www/apt/
.
Agora, em qualquer outra máquina, posso adicionar esse repositório (vazio) por HTTP ao meu /etc/apt/sources.list
e executar apt-get update
sem nenhum erro:
Ign http://archive.lan lucid Release.gpg
Ign http://archive.lan/apt/ lucid/main Translation-en_US
Get:1 http://archive.lan lucid Release [2,244B]
Ign http://archive.lan lucid/main Packages
Ign http://archive.lan lucid/main Sources
Ign http://archive.lan lucid/main Packages
Ign http://archive.lan lucid/main Sources
Hit http://archive.lan lucid/main Packages
Hit http://archive.lan lucid/main Sources
No meu caso, agora eu quero usar uma versão antiga do Asterisk, ou seja, o Asterisk 1.4. Eu reconstruí o pacote asterisk-1:1.4.21.2~dfsg-3ubuntu2.1
do Ubuntu 9.04 (com algumas pequenas alterações para corrigir dependências) e enviei-o para o meu repositório.
Neste ponto, eu posso ver o novo pacote em aptitude
, mas naturalmente ele prefere o novo Asterisk 1.6 atualmente nos repositórios do Ubuntu 10.04. Para tentar corrigir isso, criei /etc/apt/preferences.d/personal
da seguinte forma:
Package: *
Pin: release o=Shteef
Pin-Priority: 1000
Mas quando eu tento instalar o pacote asterisk
, ele ainda prefere a versão 1.6 sobre a minha própria versão 1.4. Isto é o que o apt-cache policy asterisk
mostra:
asterisk:
Installed: (none)
Candidate: 1:1.6.2.5-0ubuntu1
Version table:
1:1.6.2.5-0ubuntu1 0
500 http://nl.archive.ubuntu.com/ubuntu/ lucid/universe Packages
1:1.4.21.2~dfsg-3ubuntu2.1shteef1 0
500 http://archive.lan/apt/ lucid/main Packages
Claramente, não está pegando meu pin. Na verdade, quando eu executo apenas apt-cache policy
, recebo o seguinte:
Package files:
100 /var/lib/dpkg/status
release a=now
500 http://archive.lan/apt/ lucid/main Packages
origin archive.lan
500 http://security.ubuntu.com/ubuntu/ lucid-security/multiverse Packages
release v=10.04,o=Ubuntu,a=lucid-security,n=lucid,l=Ubuntu,c=multiverse
origin security.ubuntu.com
[...]
Ao contrário do repositório do Ubuntu, apt
parece não ter recebido release
-line para o meu próprio repositório. Eu estou suspeitando que esta é a causa porque eu não posso fixar release o=Shteef
no meu arquivo de preferências. Mas não consigo encontrar nenhuma diferença perceptível entre os arquivos Release
do meu repositório e o do Ubuntu que causaria isso.
Há algum passo que perdi ou cometi com erro ao configurar meu repositório?
ATUALIZADO
Graças a alguma ajuda de maxb no # ubuntu-server, pude descobrir mais sobre o que está acontecendo.
Parece que as listas de pacotes apt
downloads estão em /var/lib/apt/lists/
. Há um subdiretório chamado partial
, que a página de manual apt-cache(8)
descreve como:
Storage area for state information in transit.
Mas meu repositório Release
arquivo fica preso lá e nunca é copiado para o diretório pai lists
. Eu posso fazer o pinning funcionar se eu fizer este passo manualmente:
$ mv /var/lib/apt/lists/partial/archive.lan* /var/lib/apt/lists/
$ rm -f /var/cache/apt/*.bin
$ apt-cache policy
Package files:
100 /var/lib/dpkg/status
release a=now
1000 http://puppet.motto/apt/ lucid/main Packages
release v=10.04,o=Motto,a=lucid,n=lucid,l=Motto,c=main
origin puppet.motto
500 http://security.ubuntu.com/ubuntu/ lucid-security/multiverse Packages
release v=10.04,o=Ubuntu,a=lucid-security,n=lucid,l=Ubuntu,c=multiverse
origin security.ubuntu.com
[...]
Mas o passo manual é indesejável, claro.
Também notei que o arquivo Sources
está ausente no meu repositório, mas Sources.gz
é gerado. Recriar o arquivo Sources
ao descompactar Sources.gz
cria um arquivo que corresponde ao tamanho e aos hashes no arquivo Release
. Mas isso não parece resolver o meu problema.