Como encontrar pacotes deb instalados desnecessariamente marcados como instalados manualmente

5

Declaração do problema

apt e aptitude lembram quais pacotes foram instalados automaticamente como dependências de algum outro pacote ou manualmente por algum motivo. Por vários motivos, a lista de pacotes manualmente pode se tornar desnecessariamente grande e pode começar a se acumular ao longo do tempo. Esses pacotes serão desinstalados somente quando especificamente solicitados.

Um exemplo comum são os pacotes de bibliotecas que podem ser instalados como hotfix por algum motivo, mas depois eles podem ser marcados como instalados automaticamente depois que algum software, dependendo deles, estiver instalado. No entanto, se isso não acontecer, eles permanecerão instalados mesmo depois que os pacotes que estiverem dependendo deles forem desinstalados. Ferramentas como deborphan podem encontrar esses pacotes que sobraram em alguns casos, mas precisam adivinhar muito e não é uma solução sistêmica.

Descrição de uma possível solução

É por isso que estou procurando uma maneira de encontrar esses pacotes que podem ser marcados como instalados automaticamente sem que eles sejam desinstalados. Isso significaria encontrar pacotes que estão atualmente marcados como instalados manualmente, mas são dependências (ou dependências recomendadas) de algum outro pacote instalado. Estes pacotes podem então ser marcados como automaticamente instalados e serão removidos quando não forem mais necessários por outro software.

Acho que posso fazer uma ferramenta como essa com os vínculos em Python para a libapt , mas eu odiaria reinventar a roda se algo como isso já existe.

    
por Ondřej Grover 24.09.2015 / 18:48

2 respostas

3

Pesquise por pacotes que são instalados manualmente e que são uma dependência obrigatória ou recomendada de um pacote instalado. Aptidão pode fazer isso.

aptitude search -q -F %p '?installed !?automatic (?reverse-depends(?installed .*) | ?reverse-recommends(?installed .*))'

Eu não acho que haja uma maneira de indicar qual dependência foi encontrada para cada pacote. Se você quiser essa informação, o Python seria o caminho a percorrer. Este script muito rápido e sujo parece fazê-lo (principalmente, acho que pode estar incorreto em alguns casos não diretos envolvendo disjunções, dependências de versão, pré-dependências,…).

#!/usr/bin/env python2
import apt
packages = apt.Cache()
covered = {}
# Inverse dependency computation: for each installed package, record which
# packages require it (as Depends: or Recommends:).
for p in packages:
    if p.installed:
        for l in p.installed.dependencies + p.installed.recommends:
            for d in l:
                if packages.has_key(d.name) and packages[d.name].installed:
                    if not covered.has_key(d.name):
                        covered[d.name] = []
                    covered[d.name] += [p.name]
# Print out the manually installed packages that are required by another
# installed package, as well as the requiring package(s).
for p in sorted(covered.keys()):
    if not packages[p].is_auto_installed:
        print(' '.join([p] + covered[p]))
    
por 25.09.2015 / 02:49
0

O gerenciador de pacotes apt fornece uma maneira simples de encontrar esses pacotes usando apt-mark :

# apt-mark showmanual

Isso mostrará todos os pacotes marcados como instalados manualmente. Você pode alterar qualquer um deles para uso automático:

# apt-mark auto PACKAGE_NAME

Na página de manual do apt-mark :

auto

auto is used to mark a package as being automatically installed, which will cause the package to be removed when no more manually installed packages depend on this package.

manual

manual is used to mark a package as being manually installed, which will prevent the package from being automatically removed if no other packages depend on it.

showauto

showauto is used to print a list of automatically installed packages with each package on a new line. All automatically installed packages will be listed if no package is given. If packages are given only those which are automatically installed will be shown.

showmanual

showmanual can be used in the same way as showauto except that it will print a list of manually installed packages instead.

    
por 23.10.2017 / 15:26