apt-get purgar pacotes funciona bem, o aptitude ainda tem pacotes marcados como instalados e os reinstala

2

Eu criei um Rubygem para ajudar na remoção de kernels antigos que se acumularam ao longo dos anos e estão consumindo espaço em disco. (Meu laptop tinha 19 kernels sozinho, e em um pequeno SSD ...)

Eu quero usar o apt-get ou dpkg como o desinstalador, pois algumas pessoas não terão o aptitude instalado e eu não quero que os usuários da gema tenham que instalar nada.

O problema surge quando alguns usuários usam aptitude para outras coisas. Cenário:

  1. O usuário usa minha gem que com sucesso apt-get purge dos pacotes do kernel.
  2. O usuário inicia aptitude no modo interativo por qualquer motivo,
  3. O usuário pressiona a tecla 'g' (Download / Install / Remove Pkgs) imediatamente sem marcar nenhuma alteração, - >
  4. aptitude faz um novo download e reinstala os pacotes que apt-get removeram.

Atualmente, a gem usa apt-get purge <packages> para limpar os pacotes do kernel. ( Visto aqui .) Eu também tentei com dpkg --purge <packages> , mas o resultado é o mesmo, o aptitude ainda quer reinstalá-los.

Li todo o manual aptitude e pesquisei muitas coisas no Google, sem dados.

Talvez eu pudesse programaticamente gerenciar a lista de pacotes marcados / desmarcados de aptitude se eu pudesse encontrar onde está (embora eu prefira uma solução mais limpa). Eu assumo que não é /var/lib/dpkg/status ou então não haveria disparidade?

dpkg-query mostra o pacote status as Not e o estado desired como Unknown .

deKernel$ dpkg-query -l linux-image-3.2.0-39-generic
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                       Version                                    Description
+++-==========================================-==========================================-====================================================================================================
un  linux-image-3.2.0-39-generic               <none>                                     (no description available)
deKernel$

É possível entrar no aptitude e desmarcar manualmente os pacotes do kernel e o problema desaparece, mas isso é obviamente impraticável.

    
por damick 30.06.2013 / 23:16

1 resposta

2

aptitude tem seu próprio banco de dados de estado de pacote /var/lib/aptitude/pkgstates , que infelizmente parece não estar documentado. Ele armazena um bloco como este para cada pacote:

Package: bash
Architecture: amd64
Unseen: no
State: 1
Dselect-State: 1
Remove-Reason: 0

Eu acredito que o estado 1 significa installed , o estado branco 3 significa not installed . Eu também tenho alguns pacotes com o estado 4 no meu sistema, mas não consigo descobrir o que isso significa.

Acredito que o seu problema seja resultado da inconsistência entre o dpkg database /var/lib/dpkg/status e o aptitude database /var/lib/aptitude/pkgstates . De acordo com este post pkgstates deve refletir "o estado pretendido pelo usuário" para o pacote [s] ", então o aptitude provavelmente acredita que o usuário deseja que esses pacotes sejam instalados mesmo que o apt-get tenha acabado de removê-los.

Parece que a melhor solução para o seu problema é fazer o que o tripleee sugere: use aptitude se ele estiver instalado e, caso contrário, volte para apt-get .

    
por 15.09.2013 / 01:18