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?
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:
J'ai temporairement coupé mon /var/log/dpkg.log
pour ne laisser que la mise à jour d'aujourd'hui
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
...
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
}
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.
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.