Como posso fazer o downgrade de pacotes sem remover seus dependentes?

15

Eu tenho um número de pacotes de mesa que eu atualizei para uma versão do PPA, antes de limpar o PPA para que eu pudesse atualizar meu sistema. As diferenças nas versões são menores (elas são tecnicamente as mesmas, apenas um conjunto de bibliotecas eram do git e as outras são as versões finais).

Se eu tentar fazer o downgrade via Synaptic, apt-get ou aptitude, eu serei jogado no inferno da dependência.

Existe uma maneira de fazer o downgrade dos pacotes manualmente (talvez um por um) e marcar seus pacotes dependentes como imóveis (se isso fizer sentido) até que eu termine?

P.S. esta pergunta: Como fazer downgrade de um pacote via apt-get? é um pouco diferente e não ajuda nessa situação.

    
por RolandiXor 02.02.2014 / 05:50

3 respostas

12

Eu nunca joguei com isso antes, mas eu sugiro que você hold (ou lock ) a versão das dependências que causam problemas. Dessa forma, apt tem um número mais limitado de possíveis soluções e, talvez, não fique confuso ao tentar fazer o downgrade dos outros pacotes.

Se nada mais funcionar, você poderia usar a abordagem manual sugerida nesta resposta: Como fazer downgrade de um pacote via apt-get? . Basicamente, faça o download dos pacotes .deb necessários manualmente e, em seguida, instale-os um a um usando o nível inferior dpkg e um dos argumentos strongs: --ignore-depends , --force-depends , --force-depends-version ou mesmo --force-all .

Com o mesmo espírito acima, você tem o argumento --force-downgrade :

          downgrade(*): Install a package, even if newer version of
          it is already installed.

          Warning:  At  present  dpkg  does  not  do any dependency
          checking on downgrades and therefore will not warn you if
          the  downgrade  breaks the dependency of some other pack‐
          age. This can  have  serious  side  effects,  downgrading
          essential system components can even make your whole sys‐
          tem unusable. Use with care.

Mas isso pressupõe que você tenha lido man dpkg e que você entendeu o que você faz:

          Warning: These options are mostly intended to be used  by
          experts  only.  Using  them  without  fully understanding
          their effects may break your whole system.

Veja Erro: o número da versão não inicia com o dígito e Como instalar uma versão mais antiga do Java e < um href="https://sobrelinux.info/questions/162393/how-to-install-a-older-version-of-package-like-liquid-2-2-2"> Como instalar uma versão mais antiga do pacote como líquido 2.2.2? para exemplos de:

sudo dpkg --force-downgrade -i your_mesa_package.deb

E veja Como posso instalar um pacote sem instalar algumas dependências? para um exemplo (junto com o aviso apropriado) de:

sudo dpkg --force-all -i your_mesa_package.deb

No entanto, outra abordagem seria criar um pacote .deb fictício usando o pacote equivs (e talvez um nome ligeiramente diferente). Em seguida, instalar o pacote fictício deve permitir que você remova o pacote "true" enquanto mantém as dependências relevantes e, em seguida, instale a versão mais antiga. Não sei como exatamente isso funcionaria, mas verifique este tópico relevante para obter detalhes: Como remover um deb sem remover suas dependências .

    
por landroni 04.02.2014 / 08:41
3

Você pode usar primeiro apt-mark para marcar todas as dependências do pacote de destino (e talvez as recomendadas / sugeridas também) instaladas no sistema, conforme manual é instalado. Depois de fazer isso, instale as versões anteriores do software com apt-get mencionando a versão explicitamente.

  • Para listar os pacotes de dependência, recomendados e sugeridos para o pacote de destino:

    apt-cache show <target-package-name>
    
  • Marcando pacotes como manualmente instalados :

    sudo apt-mark manual <package-name(s)>
    

    (use isso para todas as dependências, recomenda e sugeriu).

  • Remova o pacote de destino:

    sudo apt-get remove <target-package-name>
    
  • Para ver uma lista de versões de pacotes para as quais você pode fazer downgrade / upgrade, use:

    apt-cache policy <target-package-name>
    
  • Instale a versão de destino do pacote necessário:

    sudo apt-get install <target-package-name>=<target-package-version-number> 
    

    ou

    sudo apt-get -t=<target release> install <target-package-name>
    

PS. Se a lista de pacotes dependências / recomendados / sugeridos , isto é, aqueles que devem ser marcados com apt-mark for grande, salve a lista pretendida da saída empacotada em apt-cache show <target-package-name> em qualquer arquivo, digamos /path/to/foo e use o apt-mark em uma combinação como esta:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese
    
por precise 05.02.2014 / 19:59
1

Acabei de passar pela dificuldade de atualizar para uma versão upstream de um pacote e, em seguida, decidir fazer o downgrade. Isto foi através de um repositório privado de mantenedores. No meu caso, foi tudo sobre experimentar a versão mais recente do systemd 233 (ainda não lançada).

A chave é entender que você precisa especificar todos os pacotes que devem ser rebaixados. Se você acertar, as chances são de que você fará o que quiser. Se você perder alguma coisa, o apt informará que a ação fará com que muitos pacotes sejam removidos. Para ter certeza de que usamos o sinalizador '-s' para experimentar o downgrade antes de fazer isso.

Os passos que você precisa seguir são:

1) Liste todas as dependências que foram atualizadas para o upstream (use alguma outra palavra-chave se sua situação for diferente):

dpkg -l|grep upstream

Isso lhe dá uma lista de pacotes com um número de versão original.

2) Relacione a versão estável correta para cada pacote:

for i in libnss-resolve:amd64 libsystemd0:amd64 libpam-systemd:amd64 libsystemd0:i386 libudev1:amd64 libudev1:i386 systemd systemd-sysv udev; do apt-cache show $i; done|grep Version

3) Verifique se tudo está bem:

apt -s --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5

0 to upgrade, 0 to newly install, 9 to downgrade, 0 to remove and 0 not to upgrade.

(não tenho certeza se --reinstall foi necessário btw, mas é isso que eu fiz)

4) Remova os -s e faça isso.

apt --allow-downgrades --no-remove --reinstall install libnss-resolve:amd64=232-21ubuntu5 libsystemd0:amd64=232-21ubuntu5 libpam-systemd:amd64=232-21ubuntu5 libsystemd0:i386=232-21ubuntu5 libudev1:amd64=232-21ubuntu5 libudev1:i386=232-21ubuntu5 systemd=232-21ubuntu5 systemd-sysv=232-21ubuntu5 udev=232-21ubuntu5
    
por user2427436 29.09.2017 / 21:04