O que acontece com pacotes Debian dependentes quando você atualiza um pacote Debian?

5

Digamos que eu tenha um pacote debian A-1.0.0.deb (que contém uma biblioteca) e outro pacote B-1.0.0.deb (que contém um serviço) que depende da biblioteca A . Agora digamos que quero atualizar para A-1.0.1.deb .

De acordo com este documento , dpkg passa por um algoritmo bastante complicado para figura quais scripts de mantenedor de pacotes são chamados para cada pacote como parte do processo de atualização. Se algumas dessas etapas falharem, então A pode ser deixado em algum tipo de estado de limbo (por exemplo, "Half-installed").

No entanto, quando você quebra A , então B é quebrado também, pois depende de A . Então, a minha pergunta é dpkg tem alguma maneira interna de lidar com essa situação? O status de instalação de B é alterado dependendo do status de A ? Idealmente, dpkg teria alguma funcionalidade incorporada para mover B do estado instalado para outro estado (para que o serviço B possa ser interrompido e reiniciado quando A estiver íntegro), mas não posso encontre qualquer coisa na documentação dpkg que sugira que isso seja feito.

Se dpkg não lidar com essa situação de maneira inteligente, será que apt ?

    
por Ricky Stewart 08.11.2016 / 02:33

2 respostas

7

Pelo que eu experimentei não o que eu li.

  •   

    No entanto, quando você quebra A, então B está quebrado também, já que A depende disso. Então, a minha pergunta é se o dpkg tem alguma maneira embutida de lidar com essa situação?

    Sim, ele tentará reinstalar ou reconfigurar A na próxima execução.

    1. Se ele foi interrompido, ele consertará isso e continuará funcionando normalmente.

    2. Mas é um problema com scripts de controle, ele falhará de novo e de novo e permanecerá nesse loop. Então, é um bug e o relatório será preenchido nesse pacote e uma correção manual é necessária.

  •   

    O status de instalação do B muda dependendo do status de A?

    Não, o status permanece como Nenhuma alteração instalada, mas ele também controla a dependência quebrada, pelo menos não no mesmo arquivo /var/lib/dpkg/status .

  •   

    Se o dpkg não maneja esta situação de maneira inteligente, o apt?

    Não, o APT não interfere neste caso. apt usa dpkg , dpkg é a ferramenta de nível inferior e é a única ferramenta que realmente instala, constrói, remove pacotes Debian.

Vamos tentar, melhor é feito em uma caixa virtual.

  1. Prepare pacotes fictícios

    ~$ sudo apt install equivs
    ~$ mkdir deleteme
    ~$ cd deleteme
    

    B 1.0.0 depende de A

    ~/deleteme$ equivs-control b0
    ~/deleteme$ nano b0
    ...
    Package: b
    Version: 1.0.0
    ...
    Depends: a
    ...
    ~/deleteme$ equivs-build b0
    

    A 1.0.0 clean install & amp; remover

    ~/deleteme$ equivs-control a0
    ~/deleteme$ nano a0
    ...
    Package: a
    Version: 1.0.0
    ...
    ~/deleteme$ equivs-build a0
    

    Uma instalação suja 1.0.1, mas remova limpo

    ~/deleteme$ cp a0 a1
    ~/deleteme$ nano a1
    ...
    Package: a
    Version: 1.0.1
    ...
    Postinst: a1.postinst
    ...
    
    ~/deleteme$ nano a1.postinst
    
    #!/bin/sh    
    exit 1
    
    ~/deleteme$ equivs-build a1
    

    Agora, você deve ter:

    ~/deleteme$ ls -1
    a0
    a1
    a_1.0.0_all.deb
    a_1.0.1_all.deb
    a1.postinst
    b0
    b_1.0.0_all.deb
    
  2. Tente este cenário

    sudo su
    
    dpkg -i b_1.0.0_all.deb
    dpkg --audit
    dpkg -i a_1.0.0_all.deb
    dpkg --audit
    dpkg --configure -a
    dpkg --audit
    dpkg --remove a
    dpkg --remove b
    dpkg --remove a
    
    dpkg -i a_1.0.0_all.deb
    dpkg -i b_1.0.0_all.deb
    dpkg --audit
    dpkg -i a_1.0.1_all.deb
    dpkg --audit
    dpkg --remove a
    apt purge a
    
  3. Para entrar em um loop onde você não pode concluir a instalação, nem o remova.

    Crie clean A 1.0.1, B 1.0.0 mas A 1.0.0 com um script Prerm: que contenha exit 1 . Portanto, quando você tentar instalar o A 1.0.1, o dpkg não conseguirá remover o A 1.0.0.

por user.dz 17.11.2016 / 22:32
0

Se as dependências A foram alteradas no pacote instalado B , você verá um erro depois de executar apt-get update && apt-get upgrade o pacote será marcado como kept back :

The following packages have been kept back
B-1.0.0

dpkg não ajudará você, se uma atualização estiver disponível B-1.0.1 only apt-get dist-upgrade será útil.

    
por GAD3R 23.11.2016 / 20:53