Removendo pacotes órfãos

Quando um pacote é instalado, junto com ele chegam suas dependências. Mas quando ele é desinstalado, suas dependências permanecem dentro do sistema.

Isso porque uma dependência pode ser requerida por outro programa e removê-la sem cuidado poderia levar a um desastre como, por exemplo, desinstalar todo o ambiente gráfico! Pois uma dependência puxa outra…

Isso na opção padrão. Podemos orientar o gerenciador de pacotes a proceder diferentemente se quisermos.

Mas a dica de hoje é para controlar os pacotes órfãos, aqueles que foram instalados para servirem de pré-requisito para outro mas que não foram removidos quando o pacote dependente foi removido e agora, não sendo usado nem referenciado por mais ninguém, vagam pelo sistema de gestão de pacotes consumindo espaço em disco e entrada no banco de dados.

Eu vou testar o deborphan, uma aplicação de linha de comando que faz exatamente o que o nome sugere.

Primeiro vamos checar se essa aplicação está disponível para instalação em nosso repositório:

leandro@leandro:~$ apt-cache search deborphan
deborphan - programa que pesquisa pacotes instalados e não utilizados, exemplo bibliotecas

Certos do existência, vamos instalar:

leandro@leandro:~$ sudo apt-get install deborphan

Vou executar sem argumentos e ver como será o resultado:

leandro@leandro:~$ deborphan
    android-tools-adb:all
    android-tools-fastboot:all
    lib32z1:amd64
    libllvm9:amd64
    libncurses5:i386
    libncurses5-dev:amd64
    libupnp6:amd64
    wine-stable:all

O deborphan não precisa ser executado com privilégio de administrador (root).

O resultado parece meio decepcionante. Imaginei que haveria centenas de entradas.

Há um outro problema, que não chega a ser da aplicação. Eu achei a sugestão para esse comando navegando pela Internet e nem lembro onde foi que achei originalmente a referência. Mas depois, pesquisando mais sobre o assunto, encontrei diversos artigos sugerindo remover imediatamente esses pacotes. Algo como:

leandro@leandro:~$ deborphan | xargs sudo apt-get -y remove –purge

Isso parece coerente, mas analisando a saída para meu sistema, eu posso ver que há pacotes que eu efetivamente uso, como o android-tools-adb!

Ou seja, pode ser uma situação perigosa! Mas deixe-me consultar o gestor de pacotes sobre as três entradas não relacionadas a bibliotecas (android-tools-adb:all, android-tools-fastboot:all,wine-stable:all)

leandro@leandro:~$ apt show android-tools-adb
Package: android-tools-adb
Version: 1:8.1.0+r23-5ubuntu2
Priority: extra
Section: universe/devel
Source: android-platform-system-core
Origin: Ubuntu
Maintainer: Ubuntu Developers ubuntu-devel-discuss@lists.ubuntu.com
Original-Maintainer: Android Tools Maintainers android-tools-devel@lists.alioth.debian.org
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 27,6 kB
Depends: adb
Homepage: https://android.googlesource.com/platform/system/core
Download-Size: 11,0 kB
APT-Manual-Installed: yes
APT-Sources: http://br.archive.ubuntu.com/ubuntu focal/universe amd64 Packages
Description: pacote de transição
 Este é um pacote de transição. Pode ser removido sem prejudicar o sistema.

leandro@leandro:~$ apt show android-tools-fastboot
Package: android-tools-fastboot
Version: 1:8.1.0+r23-5ubuntu2
Priority: extra
Section: universe/devel
Source: android-platform-system-core
Origin: Ubuntu
Maintainer: Ubuntu Developers ubuntu-devel-discuss@lists.ubuntu.com
Original-Maintainer: Android Tools Maintainers android-tools-devel@lists.alioth.debian.org
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 27,6 kB
Depends: fastboot
Homepage: https://android.googlesource.com/platform/system/core
Download-Size: 4.060 B
APT-Manual-Installed: yes
APT-Sources: http://br.archive.ubuntu.com/ubuntu focal/universe amd64 Packages
Description: pacote de transição
 Este é um pacote de transição. Pode ser removido sem prejudicar o sistema.

leandro@leandro:~$ apt show wine-stable
Package: wine-stable
Version: 3.0.1ubuntu1
Priority: optional
Section: universe/otherosfs
Source: wine1.6 (1:3.0.1ubuntu1)
Origin: Ubuntu
Maintainer: Graham Inggs ginggs@ubuntu.com
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 8.192 B
Depends: wine
Download-Size: 2.064 B
APT-Manual-Installed: yes
APT-Sources: http://br.archive.ubuntu.com/ubuntu focal/universe amd64 Packages
Description: Windows API implementation (transitional package)
 This is a transitional dummy package to complete the migration to the Debian
 wine packages. It can be safely removed.

Como podemos ver, removê-los é uma opção segura. Mas…

Quanto de espaço obteríamos de volta?

leandro@leandro:~$ deborphan -z
      27 android-tools-adb:all
      27 android-tools-fastboot:all
     172 lib32z1:amd64
   67657 libllvm9:amd64
     326 libncurses5:i386
       6 libncurses5-dev:amd64
     335 libupnp6:amd64
       8 wine-stable:all

Olhando a saída do comando você pode ficar confuso. Não há indicação da unidade de medida referenciada. Mas comparando com a saída do comando apt show que rodei anteriormente podemos ver que a unidade é Kilobytes(sim, kilobytes!!).

Ou seja, podemos recuperar 68558 Kb ou cerca de 66Mb de espaço em disco!!! Absolutamente decepcionante! Mas se tivermos em conta que o pacote custou 359Kb de espaço em disco até que é um bom negócio, mas acho que fazer esse tipo de limpeza não deveria ser alvo de preocupação de ninguém. Bem, mas cada caso é um caso.

Um servidor de rede, por exemplo, que não costuma receber instalações frequentes de novas aplicações não deve se preocupar. Talvez a máquina de um usuário mais arrojado possa se beneficiar.

É claro que o programa também melhora a indexação dos pacotes no banco de dados do gestor de pacotes, mas dada a pequena quantidade, não sei se causa impacto perceptível.

O comando tem várias opções que podem ser usadas para refinar o resultado ou modificar seu funcionamento. A MAN PAGE dele é a melhor fonte de consulta para isso.

Se quisermos remover os pacotes todos de uma vez podemos rodar o comando que mostrei no início da dica

leandro@leandro:~$ deborphan | xargs sudo apt-get -y remove –purge
Lendo listas de pacotes… Pronto
Construindo árvore de dependências
Lendo informação de estado… Pronto
Os seguintes pacotes foram instalados automaticamente e já não são necessários:
  adb android-libadb android-libbacktrace android-libbase android-libboringssl android-libcrypto-utils android-libcutils android-libetc1
  android-libf2fs-utils android-liblog android-libsparse android-libunwind android-libutils android-libziparchive android-sdk-platform-tools
  android-sdk-platform-tools-common dmtracedump etc1tool fastboot hprof-conv jsonlint libtinfo5:i386 php-composer-ca-bundle
  php-composer-semver php-composer-spdx-licenses php-composer-xdebug-handler php-json-schema php-symfony-console php-symfony-filesystem
  php-symfony-finder php-symfony-process sqlite3 squashfs-tools
Utilize ‘sudo apt autoremove’ para os remover.
Os pacotes a seguir serão REMOVIDOS:
  android-tools-adb android-tools-fastboot lib32z1 libllvm9 libncurses5:i386 libncurses5-dev libupnp6 wine-stable
0 pacotes atualizados, 0 pacotes novos instalados, 8 a serem removidos e 52 não atualizados.
Depois desta operação, 70,2 MB de espaço em disco serão liberados.
(Lendo banco de dados … 271907 ficheiros e directórios actualmente instalados.)
A remover android-tools-adb (1:8.1.0+r23-5ubuntu2) …
A remover android-tools-fastboot (1:8.1.0+r23-5ubuntu2) …
A remover lib32z1 (1:1.2.11.dfsg-2ubuntu1.3) …
A remover libllvm9:amd64 (1:9.0.1-12) …
A remover libncurses5:i386 (6.2-0ubuntu2) …
A remover libncurses5-dev:amd64 (6.2-0ubuntu2) …
A remover libupnp6 (1:1.6.19+git20160116-1) …
A remover wine-stable (3.0.1ubuntu1) …
A processar ‘triggers’ para libc-bin (2.31-0ubuntu9.9) …

Muito bom, de quebra a desinstalação nos deu mais uma dica para limpar o sistema.

sudo apt autoremove

Que se eu seguir pode provocar o caos na minha máquina! Na verdade ali estão referenciados muitos pacotes que eu efetivamente uso no dia a dia. Por exemplo, o pacote android-tools-adb

leandro@leandro:~$ apt depends android-tools-adb

android-tools-adb
  Depende: adb

O pacote adb foi instalado como dependência do pacote android-tools-adb e o autoremove entende que ele não é mais necessário, quando é necessário sim!!!!

Isso acontece porque os pacotes acima foram instalados automaticamente como dependência. O autoremove vai fazer a limpeza com base nesse critério.

Para corrigir isso eu vou marcar

leandro@leandro:~$ sudo apt-mark auto adb android-libadb android-libbacktrace android-libbase android-libboringssl android-libcrypto-utils android-libcutils android-libetc1
adb marcado para manter.
android-libadb marcado para manter.
android-libbacktrace marcado para manter.
android-libbase marcado para manter.
android-libboringssl marcado para manter.
android-libcrypto-utils marcado para manter.
android-libcutils marcado para manter.
android-libetc1 marcado para manter.

Agora é como se eu tivesse instalado esses pacotes pela linha de comando, em vez de terem sido instalados como dependência. Isso deve impedir o autoremove de agir desavisadamente. Ou seja, para esse pacote sair do sistema eu devo removê-lo explicitamente!

É claro que você também pode apenas instalar de novo se porventura esquecer e os pacotes forem removidos. É apenas para não precisar ficar vigiando o apt autoremove a toda hora.

Os demais pacotes que apareceram eu entendi que eram indesejáveis mesmo e deixei serem removidos.

Conclusão

Não saia rodando qualquer comando que encontre pela internet!

O deborphan pesquisa pelo banco de dados do gerenciador de pacotes e filtra aqueles que não possuam mais outros pacotes que dependam deles.

Mas isso não significam que seja seguro removê-los. É bom fazer uma pesquisa usando o comando apt antes para se certificar da segurança em remover o pacote.

Outro ponto a se questionar é se o benefício obtido vai compensar a instalação e o tempo gasto em aprender sobre o comando. Achei o resultado decepcionante, mas isso pode não ser o mesmo para todos!

Mas vale a pena conhecer sobre a ferramenta ao menos como opção de limpeza de sistemas.