O Debian 7 apt está atualizando meu pacote backport personalizado com a versão idêntica “oficial”!

1

e feliz ano novo para todos vocês.

Recentemente eu criei o pacote nginx deb v1.4.4 da fonte backport debian que, é claro, adicionei ao apt sources.list e as coisas correram bem.

Eu corri apt-get update then apt-get -V upgrade hoje para verificar como o debian 7 apt se comportaria .. e é isso que eu consegui:

root@debian-lab:~/nginx-1.4.4-packages# apt-get -V upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be upgraded:
   nginx-full (1.4.4-1~bpo70+1 => 1.4.4-1~bpo70+1)
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/464 kB of archives.
After this operation, 9,027 kB disk space will be freed.
Do you want to continue [Y/n]?

Como você pode ver, o apt está tentando atualizar de (1.4.4-1 ~ bpo70 + 1 = > 1.4.4-1 ~ bpo70 + 1) , que é basicamente duas versão, mas meu pacote deb instalado tem módulos nginx customizados adicionados ao padrão nginx-full e após a atualização, meus módulos customizados foram todos substituídos pelo padrão debian wheezy backport deb .. Eu criei meu pacote nginx backport deb do backport debian source e instalei o build-deb através do backport também, mas algumas dependências instaladas automaticamente do stable é o que eu vi da saída detalhada.

Você pode me ajudar a evitar isso com um exemplo? Eu ouvi falar de alfinetar, mas é a resposta para o meu problema?

UPDATE

Eu tentei fixar o pacote e não funcionou e aqui está a saída:

apt-cache policy nginx-full
nginx-full:
Installed: 1.4.4-1~bpo70+1
Candidate: 1.4.4-1~bpo70+1
Version table:
 1.4.4-1~bpo70+1 0
    100 http://ftp.uk.debian.org/debian/ wheezy-backports/main amd64 Packages
*** 1.4.4-1~bpo70+1 0
    100 /var/lib/dpkg/status
 1.2.1-2.2+wheezy2 0
    500 http://ftp.uk.debian.org/debian/ wheezy/main amd64 Packages
    500 http://security.debian.org/ wheezy/updates/main amd64 Packages

E o seguinte é o nginx da política do apt-cache:

/etc/apt/preferences.d# apt-cache policy nginx
nginx:
  Installed: 1.4.4-1~bpo70+1
  Candidate: 1.4.4-1~bpo70+1
  Package pin: 1.4.4-1~bpo70+1
  Version table:
 *** 1.4.4-1~bpo70+1 1001
        100 http://ftp.uk.debian.org/debian/ wheezy-backports/main amd64 Packages
        100 /var/lib/dpkg/status
     1.2.1-2.2+wheezy2 1001
        500 http://ftp.uk.debian.org/debian/ wheezy/main amd64 Packages
        500 http://security.debian.org/ wheezy/updates/main amd64 Packages

Mas ainda está apto a tentar atualizá-lo e substituí-lo !!

Conteúdo do Sources.list:

deb http://ftp.uk.debian.org/debian/ wheezy main
deb-src http://ftp.uk.debian.org/debian/ wheezy main

deb http://security.debian.org/ wheezy/updates main
deb-src http://security.debian.org/ wheezy/updates main

# wheezy-updates, previously known as 'volatile'
deb http://ftp.uk.debian.org/debian/ wheezy-updates main
deb-src http://ftp.uk.debian.org/debian/ wheezy-updates main

# Wheezy Backports repository
deb http://ftp.uk.debian.org/debian wheezy-backports main
deb-src http://ftp.uk.debian.org/debian wheezy-backports main

Eu tentei fixar uma vez o nome do pacote 'nginx' e outra vez com o nginx-full ..

Mas ambos não conseguem segurar o pacote !!!

    
por Dr.SMS 31.12.2013 / 06:04

2 respostas

5

Para evitar problemas, primeiro sugiro que você use um número de versão personalizado (e maior) para seu pacote personalizado , por exemplo: 1.4.4-1~bpo70+1-mrsms . Isso só seria justo porque o seu pacote não é a mesma versão exata do backport "oficial". Você pode alterar o número da versão do arquivo debian/changelog antes de criá-lo.

Você pode testar a comparação de versões com dpkg (aqui, gt significa "maior que", o código de retorno é 0 se a expressão for verdadeira):

$ dpkg --compare-versions 1.4.4-1~bpo70+1-mrsms gt 1.4.4-1~bpo70+1
$ echo $?

Tenha cuidado, pois seu pacote personalizado ainda será atualizado se uma versão ainda maior for encontrada no repositório on-line. Eu sugeriria que você usasse pinagem para evitar isso (veja man apt_preferences ).

Você pode tentar isso criando um arquivo, digamos /etc/apt/preferences.d/nginx-full , com este conteúdo:

Package: nginx-full
Pin: version 1.4.4-1~bpo70+1-mrsms
Pin-Priority: 1001

Você também pode manter o pacote em seu estado atual de instalação, que é muito eficaz, mas não muito elegante (pode dificultar futuras atualizações):

# aptitude hold nginx-full
# echo "nginx-full" hold |dpkg --set-selections
    
por 31.12.2013 / 15:18
2

No bate-papo, o OP declarou que instalou seu pacote com dpkg --install . Além disso, o IIRC, APT analisa qual pacote prefere da seguinte maneira:

  1. Se um pacote for marcado, não faça nada com ele.
  2. Prefira qualquer pacote conhecido pelo sistema com a versão de programa mais alta.
  3. Se houver conflitos, prefira qualquer pacote conhecido pelo sistema que tenha a versão mais alta do pacote.
  4. Se ainda houver conflitos, prefira os pacotes de um repositório listado em /etc/apt/sources.list .
  5. Se ainda houver conflitos, prefira um pacote de qualquer repositório que venha primeiro em sources.list .

Armado com esta informação, podemos postular que o APT está escolhendo a versão do repositório sobre a versão instalada localmente no passo 4. Então, existem quatro maneiras de resolver este problema:

  1. Aumente a versão do pacote para algo além do que os repositórios oficiais da Debian fornecem. Isto fará com que seu pacote instalado localmente seja selecionado sobre o pacote Debian durante o passo 3. (@Totor me bateu nele, então eu vou adiar a resposta dele para instruções de como fazer isso.)
  2. Aumente a versão do programa para algo além do que os repositórios oficiais da Debian fornecem. Isso fará com que seu pacote seja selecionado durante a etapa 2, mas eu recomendo não fazer isso e, em vez disso, incrementar a versão do pacote - não há motivo técnico, é apenas mais correto. No entanto, se você optar por fazê-lo dessa maneira, ele será feito basicamente da mesma maneira que a versão do pacote, exceto que você alterará um campo diferente em seu debian/control file (ou qualquer outra coisa que você esteja usando para gerar seu pacote).
  3. Prenda seu pacote. Isso fará com que seu pacote seja selecionado durante a etapa 1. Mais uma vez, isso é coberto pela resposta do @Total.
  4. Crie um repositório local, coloque seu pacote nele e garanta que, quando você adicioná-lo ao seu sources.list , ele venha antes dos repositórios oficiais do Debian. Isto irá desencadear uma seleção no passo 5. Para fazer isso, consulte esta página Wiki do Debian . Você também pode estar interessado em esta pergunta do Ask Ask , se você quiser uma referência mais fácil no estilo tutorial.
por 01.01.2014 / 02:01