Pinagem baseada na origem de um repositório reprepro

2

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

  • Instalado um servidor web (minha escolha pessoal aqui é Cherokee),
  • Criado o diretó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.

    
por Shtééf 05.05.2010 / 18:44

1 resposta

2

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) .

    
por 06.05.2010 / 13:24