¿Puedo revertir una actualización de apt-get si algo sale mal?


53

¿Hay alguna forma, antes de comenzar una aptitude upgradeo apt-get upgrade, de configurar algo para que pueda "fácilmente" revertir su sistema al estado "apto" que tenía antes de la actualización real, si algo sale mal?

Es decir, por ejemplo, reinstale la versión anterior de los paquetes que se actualizaron durante el proceso.

(EDITAR) Algunas sugerencias : Sé que, etckeeperpor ejemplo, usa algún enlace aptpara que se le notifique cada vez que aptinstala o desinstala un paquete. Supongo que podría haber algún tipo de script que podría guardar la lista de paquetes recién instalados y su número de versión anterior para poder reinstalarlos desde el aptcaché ( /var/cache/apt/archives). También existe el checkinstallque puede realizar un seguimiento de las modificaciones de archivos ...

¿Algún detalle sobre cómo lograr eso correctamente?


No soy consciente de que apt tiene algo así, debería tener un registro de los números de paquete actualmente instalados, etc.
Anthon

Respuestas:


46

Ahora tenía que encontrar una respuesta a esto, porque el último apt-get upgradeen un servidor Debian hacía imposible arrancar el kernel más reciente más allá de un busybox, al no poder montar la partición raíz zfs. Al menos un kernel anterior aún podía arrancar, pero era incompatible con otro software. De ahí la necesidad de una reversión.

La respuesta corta: puede usar el siguiente comando:

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

si hace lo que desea, elimínelo -sy ejecútelo nuevamente. Estos son los pasos que tomé para que esto funcione correctamente:

  1. Me recorté temporalmente /var/log/dpkg.logpara dejar solo la actualización de hoy

  2. He instalado el pequeño script apt-historyde aquí en ~/.bashrcy corrió

    $ 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. Esto proporciona una lista bien formateada de paquetes versionados a los que retroceder introduciéndolos apt-get install. Recorte esta lista según sea necesario en un editor de texto y luego ejecútelo ( -sprimero para ejecutar en seco):

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

Apt advertirá sobre las rebajas que se esperan. Para evitar que la próxima actualización sobrescriba esta reversión, los paquetes deberán anclarse hasta que se resuelva el problema original. Por ejemplo con: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
}

¡Agradable encontrar esos recursos! ¡Gran respuesta!
L0j1k

1
El apt-history rollbackcomando se puede reemplazar con algo como awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Totor

Con la siguiente extensión, solo coincide con las actualizaciones de la fecha dada (por lo que no es necesario modificar el registro antes):awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
luator

1
Después de recortar dpkg.log obtengo un montón de mensajes de versión no encontrada, es decir E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found. Estoy usando Debian Stretch para Raspian.
dps

7

Los archivos de registro /var/log/apt/history.logy /var/log/apt/term.logson las cosas más cercanas disponibles para su descripción:

Supongo que podría haber algún tipo de script que podría guardar la lista de paquetes recién instalados y su número de versión anterior

history.logda una lista resumida de cada acción que se aptrealiza en el siguiente 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

En particular, proporciona una lista de los paquetes recién instalados o de los paquetes eliminados. Además, term.logmuestra lo que realmente apareció en el terminal durante la acción, por lo que mostraría las versiones antiguas y nuevas de los paquetes. Una muestra aleatoria de mi 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) 

aptNo se recomienda intentar retroceder automáticamente, pero si usa los registros, entonces debería ser posible hacerlo manualmente a menos que la acción fallida haya roto algo que interfiera con aptlas acciones, por ejemplo, una base de datos dpkg inconsistente. En ese caso, deberá solucionar el problema antes de continuar.


4

No, apt no lo hace tan fácil.

La mejor opción es algún tipo de instantánea. Instantáneas del sistema de archivos a través de lvm / zfs / btrfs o instantáneas de instancia si está utilizando una máquina virtual de algún tipo.

La única otra opción es hacer un inventario de los paquetes instalados (dpkg -l) antes y después. Si desea "retroceder", debe instalar explícitamente la versión anterior.


Sé la versión exacta, pero apt se niega: apt install openssl=1.0.2g-1ubuntu4.12resultados E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found. Acabo de actualizar 1.0.2g-1ubuntu4.13y me pregunto si eso está causando algunos problemas CORS / CSP ahora
Csaba Toth

Es posible que ya no esté en el repositorio.
bahamat
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.