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

17

Eu tenho vários pacotes de mesa que eu havia atualizado para uma versão PPA, antes de limpar o PPA para poder atualizar meu sistema. As diferenças nas versões são pequenas (elas são tecnicamente as mesmas, apenas um conjunto de bibliotecas era do git e os outros são as versões finais).

Se eu tentar fazer o downgrade via Synaptic, apt-get ou aptitude, sou jogado no inferno das dependências.

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

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

RolandiXor
fonte
Por que você não ppa-purgeprimeiro?
landroni
Você pode reinstalar o pacote.Por exemplo, se você usar synaptic, quando selecionar o pacote xyz, todas as dependências serão selecionadas por padrão.Mas você sempre poderá desmarcar todas as dependências e apenas instalar o pacote principal.Mais tarde, poderá instalar todas as dependências.Mas novamente, isso funciona apenas se você estiver pronto para reinstalar.
Usuário registrado
@landroni, se eu limpar, ele removerá os pacotes que não quero remover.
RolandiXor

Respostas:

13

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


Se nada mais funcionar, você pode seguir a abordagem manual sugerida nesta resposta: Como fazer o downgrade de um pacote via apt-get? . Basicamente, baixar os necessários .debpacotes manualmente, em seguida, instalá-los um por um com o de nível mais baixo dpkge um dos seus argumentos contundentes: --ignore-depends, --force-depends, --force-depends-version, ou mesmo --force-all.

No mesmo espírito que o acima, você tem o --force-downgradeargumento:

          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ê leu man dpkge entendeu o que 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.

Consulte Erro: número da versão não inicia com dígito e Como instalar uma versão mais antiga do Java e Como instalar uma versão mais antiga do pacote, como o líquido 2.2.2? para exemplos de:

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

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

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

Outra abordagem seria criar um .debpacote fictício usando o equivspacote (e talvez um nome ligeiramente diferente). A instalação do pacote fictício deve permitir a remoção do pacote "true", mantendo os deps relevantes e, em seguida, instalar a versão mais antiga. Não tenho certeza de como exatamente isso funcionaria, mas verifique este tópico relevante para obter detalhes: Como remover um deb sem remover suas dependências .

landroni
fonte
4

Você pode primeiro usar apt-markpara marcar todas as dependências do pacote de destino (e talvez também as recomendadas / sugeridas) instaladas no sistema como instalações manuais . Depois disso, instale as versões anteriores do software apt-getmencionando explicitamente a versão.

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

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

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

    (use isso para todas as dependências, recomendações e sugestões.)

  • 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 o 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 dependências / pacotes recomendados / sugeridos , ou seja, aqueles a serem marcados com apt-markfor grande, salve a lista pretendida da saída empacotada apt-cache show <target-package-name>em qualquer arquivo, digamos /path/to/fooe use o apt-markem uma combinação como esta:

cat /path/to/foo | xargs -imarkthese sudo apt-mark manual markthese
preciso
fonte
Esse método pode funcionar, mas em vez de marcar mais de 100 pacotes, eu apenas fui com a outra resposta.
RolandiXor
@RolandiXor, você poderia usar apt-cache policy <target-package-name>para ter uma lista de versões de pacotes que você pode desclassificar / upgrade to ..
precisa
..por favor, consulte a edição feita na postagem; se for maior número de arquivos devem ser marcados você poderia usar o comando de combinação incluído ...
preciso
Eu não acho que você está me entendendo. Enfim, eu o consertei agora e dei a recompensa (não posso trocá-la).
RolandiXor
1

Acabei de passar pela dor de atualizar para uma versão upstream de um pacote e depois decidir fazer o downgrade. Isso foi feito através de um repositório privado de mantenedores. No meu caso, tratava-se de 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, é provável que faça o que quiser. Se você perder algo, o apt dirá que a ação fará com que muitos pacotes sejam removidos. Para garantir que usamos o sinalizador '-s' para experimentar o downgrade antes de realmente fazer isso.

Os passos que você precisa seguir são:

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

dpkg -l|grep upstream

Isso fornece uma lista de pacotes com um número de versão upstream.

2) Liste qual é 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 tudo que é bom:

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, mas foi o que eu fiz)

4) Remova o -s e faça-o.

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
user2427436
fonte