web-dev-qa-db-fra.com

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

Existe-t-il un moyen, avant de démarrer un aptitude upgrade ou apt-get upgrade, pour configurer quelque chose afin que vous puissiez "facilement" restaurer votre système à l'état "apt" qu'il était avant la mise à niveau réelle, en cas de problème?

Il s'agit, par exemple, de réinstaller l'ancienne version des packages mis à niveau au cours du processus.

(EDIT) Quelques conseils : Je sais que etckeeper par exemple utilise un crochet sur apt afin qu'il soit averti chaque fois que apt installe ou désinstalle un package. Je suppose qu'il pourrait y avoir une sorte de script qui pourrait enregistrer la liste des packages nouvellement installés et leur numéro de version précédente pour pouvoir les réinstaller à partir du cache apt (/var/cache/apt/archives). Il y a aussi checkinstall qui peut garder une trace des modifications de fichiers ...

Des détails sur la façon de réaliser cela correctement?

57
Totor

Je viens juste de trouver une réponse à cette question, car le dernier apt-get upgrade sur un serveur Debian a rendu impossible le démarrage du noyau le plus récent au-delà d'une busybox, en échouant à 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 -s et exécutez-le à nouveau. Voici les étapes que j'ai suivies pour que cela fonctionne correctement:

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

  2. J'ai installé le petit script apt-history de ici en ~/.bashrc et a 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. Cela fournit une liste bien formatée de packages versionnés à restaurer en les alimentant dans apt-get install. Découpez cette liste selon les besoins dans un éditeur de texte, puis exécutez (avec -s pour le premier essai à sec):

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

Apt mettra en garde contre les déclassements attendus. Pour éviter que cette restauration ne soit écrasée par la prochaine mise à niveau, les packages devront être épinglés jusqu'à ce que le problème d'origine soit résolu. 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
}
52
ChrisW

Les fichiers journaux /var/log/apt/history.log et /var/log/apt/term.log sont les éléments les plus proches de votre description:

Je suppose qu'il pourrait y avoir une sorte de script qui pourrait enregistrer la liste des packages nouvellement installés et leur numéro de version précédente

history.log donne une liste récapitulative de chaque action que apt prend au 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 donne une liste des packages nouvellement installés ou des packages supprimés. Aditionellement, term.log montre ce qui est réellement apparu sur le terminal pendant l'action, ce qui afficherait les anciennes et les nouvelles versions des packages. 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 n'est pas recommandé de restaurer automatiquement apt automatiquement, mais si vous utilisez les journaux, il devrait être possible de le faire manuellement, sauf si l'action ayant échoué a cassé quelque chose qui interfère avec les actions de apt, par exemple une base de données dpkg incohérente. Dans ce cas, vous devrez résoudre le problème avant de continuer.

7
Faheem Mitha

Non, apt ne facilite pas la tâche.

La meilleure option est un certain type d'instantané. Soit des instantanés de système de fichiers via lvm/zfs/btrfs ou des instantanés d'instance si vous utilisez un VM d'une sorte quelconque.

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

4
bahamat