Posso reverter uma atualização do apt-get se algo der errado?

53

Existe uma maneira, antes de iniciar um aptitude upgradeou apt-get upgrade, de configurar algo para que você possa "facilmente" reverter seu sistema para o estado "apt" que estava antes da atualização real, se algo der errado?

Por exemplo, reinstale a versão antiga dos pacotes que foram atualizados durante o processo.

(EDIT) Algumas dicas : Eu sei que, etckeeperpor exemplo, usa algum gancho aptpara que seja notificado sempre que aptinstalar ou desinstalar um pacote. Suponho que possa haver algum tipo de script que possa salvar a lista de pacotes recém-instalados e o número da versão anterior para poder reinstalá-los a partir do aptcache ( /var/cache/apt/archives). Há também o checkinstallque pode acompanhar as modificações do arquivo ...

Algum detalhe sobre como conseguir isso corretamente?

Totor
fonte
Não estou ciente de que o apt tem algo assim embutido, você teria que acompanhar os números dos pacotes atualmente instalados etc. IMHO mais fácil apenas para restaurar o backup de ontem, se necessário.
Anthon

Respostas:

46

Eu só agora tinha que descobrir uma resposta para isso, porque a última apt-get upgradeem um servidor Debian tornou impossível inicializar o kernel mais recente além de um busybox, falhando ao montar a partição raiz zfs. Pelo menos um kernel mais antigo ainda podia inicializar, mas era incompatível com outro software. Daí a necessidade de uma reversão.

A resposta curta - você pode usar o seguinte comando:

$ apt-get -s install $(apt-history rollback | tr '\n' ' ')

se fizer o que você deseja, remova -se execute-o novamente. Aqui estão as etapas que eu tomei para fazer isso funcionar corretamente:

  1. Eu aparei temporariamente o meu /var/log/dpkg.logpara deixar apenas a atualização de hoje

  2. Eu instalei o pequeno roteiro apt-historyde aqui em ~/.bashrce correu

    $ apt-history rollback > rollback.txt
    ...
    libzfs2:amd64=0.6.4-4~wheezy 
    zfsutils:amd64=0.6.4-4~wheezy 
    zfs-initramfs:amd64=0.6.4-4~wheezy
    ...
    
  3. Isso fornece uma lista bem formatada de pacotes com versão para reverter, alimentando-a apt-get install. Apare esta lista conforme necessário em um editor de texto e, em seguida, execute (com a -sexecução a seco primeiro):

    $ apt-get -s install $(cat rollback.txt | tr '\n' ' ')
    $ apt-get install $(cat rollback.txt | tr '\n' ' ')
    

O Apt alertará sobre os downgrades esperados. Para evitar que essa reversão seja substituída pela próxima atualização, os pacotes precisarão ser fixados até que o problema original seja resolvido. Por exemplo, com:apt-mark hold zfsutils libzfs2 ...


function apt-history(){
    case "$1" in
      install)
            cat /var/log/dpkg.log | grep 'install '
            ;;
      upgrade|remove)
            cat /var/log/dpkg.log | grep $1
            ;;
      rollback)
            cat /var/log/dpkg.log | grep upgrade | \
                grep "$2" -A10000000 | \
                grep "$3" -B10000000 | \
                awk '{print $4"="$5}'
            ;;
      *)
            cat /var/log/dpkg.log
            ;;
    esac
}
ChrisW
fonte
Bom encontrar esses recursos! Ótima resposta!
L0j1k 25/05
11
O apt-history rollbackcomando pode ser substituído por algo parecido awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Totor
Com a seguinte extensão, ele corresponde apenas às atualizações da data especificada (portanto, não há necessidade de modificar o log antes):awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
luator
11
Depois de aparar o dpkg.log, recebo várias mensagens de versão não encontrada, ou seja E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found. Estou usando o Debian Stretch for Raspian.
dps
7

Os arquivos de log /var/log/apt/history.loge /var/log/apt/term.logsão as coisas mais próximas disponíveis para sua descrição:

Suponho que possa haver algum tipo de script que possa salvar a lista de pacotes recém-instalados e o número da versão anterior.

history.logfornece uma lista resumida de todas as ações aptexecutadas no seguinte formato:

Start-Date: 2013-06-21  16:05:05
Commandline: apt-get install rdiff-backup
Install: python-pyxattr:i386 (0.5.0-3, automatic), rdiff-backup:i386 (1.2.8-6), python-pylibacl:i386 (0.5.0-3, automatic
), librsync1:i386 (0.9.7-7, automatic)
End-Date: 2013-06-21  16:05:42

Em particular, fornece uma lista de pacotes recém-instalados ou de pacotes removidos. Além disso, term.logmostra o que realmente apareceu no terminal durante a ação, para mostrar as versões antiga e nova dos pacotes. Uma amostra aleatória do meu history.log:

Preparing to replace gnupg 1.4.10-4 (using .../gnupg_1.4.10-4+squeeze1_i386.deb) ...
Unpacking replacement gnupg ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Processing triggers for doc-base ...
Processing 1 changed doc-base file(s)...
Registering documents with scrollkeeper...
Setting up gnupg (1.4.10-4+squeeze1) 

aptNão é recomendável tentar reverter automaticamente, mas se você usar os logs, deverá ser possível fazê-lo manualmente, a menos que a ação com falha tenha quebrado algo que interfira aptnas ações da empresa, por exemplo, um banco de dados inconsistente do dpkg. Nesse caso, você precisará corrigir o problema antes de continuar.

Faheem Mitha
fonte
4

Não, o apt não facilita as coisas.

A melhor opção é algum tipo de instantâneo. Instantâneos do sistema de arquivos através de lvm / zfs / btrfs ou instantâneos de instância, se você estiver usando algum tipo de VM.

A única outra opção é fazer um inventário dos pacotes instalados (dpkg -l) antes e depois. Se você quiser "reverter", precisará instalar explicitamente a versão anterior.

bahamat
fonte
Eu sei a versão exata, mas o apt recusa: apt install openssl=1.0.2g-1ubuntu4.12resulta em E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found. Acabo de atualizar para 1.0.2g-1ubuntu4.13e eu estou querendo saber se isso é fazendo com que alguns CORS / problemas CSP agora
Csaba Toth
Pode não estar mais no repositório.
bahamat