Puis-je annuler une mise à niveau d'apt-get en cas de problème?

53

Existe-t-il un moyen, avant de commencer un aptitude upgradeou apt-get upgrade, de configurer quelque chose de manière à pouvoir restaurer facilement votre système à l'état "apt" qu'il était avant la mise à niveau proprement dite, en cas de problème?

C’est-à-dire, par exemple, réinstallez l’ancienne version des packages mis à niveau au cours du processus.

(EDIT) Quelques astuces : Je sais que, etckeeperpar exemple, utilise un système d’accroché aptpour qu’il soit averti chaque fois qu’il aptinstalle ou désinstalle un paquet. Je suppose qu’il pourrait exister une sorte de script permettant de sauvegarder la liste des paquetages nouvellement installés et leur numéro de version précédent afin de pouvoir les réinstaller à partir du aptcache ( /var/cache/apt/archives). Il y a aussi checkinstallqui peut garder une trace des modifications de fichiers ...

Des détails sur comment y parvenir correctement?

Totor
la source
Je ne sais pas si apt a quelque chose comme ça intégré, vous devriez garder une trace des numéros de paquets actuellement installés, etc. Un IMHO plus simple suffit pour restaurer la sauvegarde d'hier si nécessaire.
Anthon

Réponses:

46

Je venais juste de trouver une réponse à cette question, car le dernier apt-get upgradesur un serveur Debian ne permettait pas de démarrer le noyau le plus récent au-delà d’une busybox, sans monter la partition racine zfs. Au moins un noyau plus ancien pouvait toujours démarrer, mais était incompatible avec d'autres logiciels. D'où la nécessité d'un retour en arrière.

La réponse courte - vous pouvez utiliser la commande suivante:

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

s'il fait ce que vous voulez, supprimez-le -set exécutez-le à nouveau. Voici les étapes que j'ai prises pour que cela fonctionne correctement:

  1. J'ai temporairement coupé mon /var/log/dpkg.logpour laisser juste la mise à jour d'aujourd'hui

  2. J'ai installé le script minuscule apt-historyd' ici dans ~/.bashrcet couru

    $ 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. Ceci fournit une liste joliment formatée de paquets versionnés à restaurer en l’alimentant apt-get install. Coupez cette liste au besoin dans un éditeur de texte, puis exécutez-la (avec d'abord -spour un essai à sec):

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

Apt avertira des dégradations attendues. Pour éviter que cette restauration ne soit écrasée lors de la prochaine mise à niveau, les packages devront être épinglés jusqu'à la résolution du problème d'origine. Par exemple avec: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
la source
Bien trouver ces ressources! Très bonne réponse!
L0j1k
1
La apt-history rollbackcommande peut être remplacée par quelque chose comme awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Totor
Avec l'extension suivante, il ne correspond qu'aux mises à jour de la date donnée (il n'est donc pas nécessaire de modifier le journal auparavant):awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
luator
1
Après avoir coupé dpkg.log, je reçois un tas de messages de version non trouvée, c'est-à-dire E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found. J'utilise Debian Stretch pour Raspian.
dps
7

Les fichiers journaux /var/log/apt/history.loget /var/log/apt/term.logsont les éléments les plus proches disponibles pour votre description:

Je suppose qu'il pourrait y avoir une sorte de script permettant de sauvegarder la liste des paquetages nouvellement installés et leur numéro de version précédent

history.logdonne une liste récapitulative de chaque action effectuée aptdans le format suivant:

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

En particulier, il fournit une liste des packages nouvellement installés ou des packages supprimés. De plus, term.logmontre ce qui est réellement apparu sur le terminal pendant l'action, de sorte que l'ancienne et la nouvelle version des paquets soient affichées. Un échantillon aléatoire de mon 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) 

Il aptest déconseillé d’ essayer de revenir en arrière automatiquement, mais si vous utilisez les journaux, il devrait être possible de le faire manuellement à moins que l’action échouée ait cassé quelque chose qui interfère avec aptles actions de, comme une base de données dpkg incohérente. Dans ce cas, vous devrez résoudre le problème avant de continuer.

Faheem Mitha
la source
4

Non, apt ne rend pas cela facile.

La meilleure option est un type d'instantané. Soit des instantanés du système de fichiers via lvm / zfs / btrfs, soit des instantanés d’instance si vous utilisez une machine virtuelle.

La seule autre option consiste à dresser l'inventaire des packages installés (dpkg -l) avant et après. Si vous souhaitez "restaurer", vous devez installer explicitement la version précédente.

bahamat
la source
Je connais la version exacte, mais apt refuse: apt install openssl=1.0.2g-1ubuntu4.12résultats in E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found. Je viens de passer à 1.0.2g-1ubuntu4.13et je me demande si cela cause des problèmes avec la SCRO / CSP maintenant
Csaba Toth
Il se peut qu'il ne soit plus dans le référentiel.
bahamat