Recuperando o estado dos pacotes no aptitude

Semana passada cometi um engano no aptitude e perdi a informação de quais pacotes foram instalados automaticamente para satisfazer dependências de outros pacotes. A seguir eu explico como consegui reverter a situação.

Dependências entre pacotes

O gerenciamento de pacotes no Debian utiliza o conceito de dependência entre pacotes.

Se um pacote "A" depende de um pacote "B" para funcionar, ao instalar o pacote "A", o gerenciador de pacotes instalará automaticamente também o pacote "B", para satisfazer essa dependência.

Mais tarde, caso o pacote "A" venha a ser desinstalado, e nenhum outro pacote instalado depender do pacote "B", então o pacote "B" será também desinstalado, automaticamente. Esse comportamento acontece tanto ao usar o aptitude quanto ao usar o apt-get.

Ao controlar automaticamente a instalação e a desinstação de pacotes dependentes entre si, o gerenciador de pacotes consegue evitar que pacotes desnecessários continuem instalados no sistema.

O estado dos pacotes

Para que o gerenciador de pacotes consiga fazer esse controle automático ele precisa saber quais pacotes foram instalados como dependência e quais não. Esse controle é feito registrando o estado dos pacotes instalados, para saber se eles foram "auto-instalados" ou instalados "manualmente".

Você pode ver o estado de "auto-instalado" de um pacote pelo aptitude:

 Ações  Desfazer  Pacote  Resolvedor  Pesquisar  Opções  Visões  Ajuda
C-T: Menu  ?: Ajuda  q: Sai  u: Atualiza  g: Baixar/Instalar/Remover Pcts.
aptitude 0.6.3
i     apt-utils                                                         0.8.10.3+s 0.8.10.3+s
i A   apt-xapian-index                                                  0.41       0.41
i A   aptdaemon                                                         0.31+bzr41 0.31+bzr41
i     aptitude                                                          0.6.3-3.2+ 0.6.3-3.2+
i     at                                                                3.1.12-1+s 3.1.12-1+s
i     base-files                                                        6.0squeeze 6.0squeeze
i     base-passwd                                                       3.5.22     3.5.22
i A   bluez                                                             4.66-3     4.66-3
i A   consolekit                                                        0.4.1-4    0.4.1-4
i     cpufrequtils                                                      007-1+sque 007-1+sque

Os pacotes listados acima marcados com uma letra "A" são pacotes que foram instalados automaticamente pelo gerenciador de pacotes, para satisfazer alguma dependência de algum outro pacote. Os pacotes que não estão marcados com a letra "A" são pacotes que foram instalados "manualmente", ou seja, diretamente a pedido do usuário.

O erro

O erro que eu cometi foi remover o estado de "auto-instalado" de todos os pacotes instalados no sistema, ao digitar algumas teclas de atalho por engano no aptitude.

Eu queria procurar pelo pacote "mutt-patched" no aptitude e uma das formas de fazer isso é digitar a tecla de atalho "/" para iniciar a pesquisa. Mas eu errei na digitação e não digitei a tecla "/".

Como resultado, o campo para pesquisa não foi aberto, e as teclas seguintes foram interpretadas como teclas de atalho, e não como o texto que eu queria pesquisar.

Quando eu comecei a digitar "mutt", a letra "m" ativou o ítem de menu "Pacote->Marcar manual", que tem a função de "Marcar o pacote selecionado como tendo sido manualmente instalado; ele não será removido a menos que você o remova manualmente", segundo o próprio aptitude.

Nesse ponto, eu poderia ter usado o comando "Desfazer" para que a modificação fosse desfeita. Mas eu já tinha digitado a tecla "u", que ativa o ítem de menu "Ações->Atualizar a lista de pacotes". Depois disso, o comando "Desfazer" fica desabilitado, daí já era tarde demais para eu usá-lo.

Como o cursor estava posicionado sobre o ítem "Pacotes instalados", todos os pacotes foram marcados como instalados "manualmente". Já não era mais possível saber quais pacotes haviam sido "auto-instalados".

A solução

Durante o sentimento de "fiz bobagem" me dei conta de que o próprio sistema tinha a solução para o problema.

Existe um script em /etc/cron.daily/apt que faz backup do estado dos pacotes em /var/backups/apt.extended_states*.

Assim, a solução para restaurar o estado dos pacotes foi:

sudo cp /var/backups/apt.extended_states.0 /var/lib/apt/extended_states

Essa eu devo ao autor do script de backup. Obrigado! ;-)