Gestión de parches de Linux: cómo revertir un parche fallido

Mantener los servidores actualizados es una de las principales responsabilidades de un administrador de sistemas. Sin embargo, las actualizaciones no siempre funcionan como se espera, por lo que es igual de importante que sepa a) revertir un parche para que el servidor vuelva al estado anterior yb) aplicar parches en subconjuntos para obtener más flexibilidad.

Este artículo se centra en las correcciones a nivel del sistema operativo realizadas con las herramientas de administración de paquetes YUM/DNF en Red Hat Enterprise Linux (RHEL). Para esta demostración, un servidor RHEL 7.7 en ejecución se actualiza a RHEL 7.9 usando yum, luego volvió a RHEL 7.7. Siempre se recomienda que realice copias de seguridad periódicas de sus servidores y las demostraciones proporcionadas en este artículo son solo para fines educativos.

Índice

Verifique el servidor para ver si hay correcciones/actualizaciones pendientes

A menos que esté utilizando una herramienta de administración de sistemas como Red Hat Satellite, debe probar los servidores manualmente en busca de actualizaciones.

Para este artículo, considere un servidor RHEL 7.7:

[[email protected] ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.7 (Maipo)

Utilizar el check-update Comando para verificar de forma no interactiva si hay actualizaciones pendientes en su servidor:

[[email protected] ~]# yum check-update
Loaded plugins: product-id, search-disabled-repos, subscription-manager

NetworkManager.x86_64                                        1:1.18.4-3.el7                          rhel-7-server-rpms
NetworkManager-config-server.noarch                          1:1.18.4-3.el7                          rhel-7-server-rpms
NetworkManager-libnm.x86_64                                  1:1.18.4-3.el7                          rhel-7-server-rpms
NetworkManager-team.x86_64                                   1:1.18.4-3.el7                          rhel-7-server-rpms
kernel-tools-libs.x86_64                                     3.10.0-1127.19.1.el7                    rhel-7-server-rpms
kexec-tools.x86_64                                           2.0.15-43.el7                           rhel-7-server-rpms
kmod.x86_64                                                  20-28.el7                               rhel-7-server-rpms
kmod-libs.x86_64                                             20-28.el7                               rhel-7-server-rpms
kpartx.x86_64                                                0.4.9-131.el7                           rhel-7-server-rpms
krb5-libs.x86_64                                             1.15.1-46.el7                           rhel-7-server-rpms
….
….
….
systemd.x86_64                                               219-73.el7_8.9                          rhel-7-server-rpms
systemd-libs.x86_64                                          219-73.el7_8.9                          rhel-7-server-rpms
systemd-sysv.x86_64                                          219-73.el7_8.9                          rhel-7-server-rpms
tcpdump.x86_64                                               14:4.9.2-4.el7_7.1                      rhel-7-server-rpms
teamd.x86_64                                                 1.29-1.el7                              rhel-7-server-rpms
tuned.noarch                                                 2.11.0-8.el7                            rhel-7-server-rpms
tzdata.noarch                                                2020a-1.el7                             rhel-7-server-rpms
util-linux.x86_64                                            2.23.2-63.el7                           rhel-7-server-rpms
yum.noarch                                                   3.4.3-167.el7                           rhel-7-server-rpms
yum-utils.noarch                                             1.1.31-54.el7_8                         rhel-7-server-rpms
Obsoleting Packages
iwl7260-firmware.noarch                                      25.30.13.0-76.el7                       rhel-7-server-rpms
    iwl7265-firmware.noarch                                  22.0.7.0-72.el7                         installed     

Cuando se escribió este artículo, RHEL 7.9 era la versión más reciente de RHEL 7 e hizo una yum update llevaría este servidor RHEL 7.7 a RHEL 7.9:

[[email protected] ~]# yum -y update
Loaded plugins: product-id, search-disabled-repos, subscription-manager
Resolving Dependencies
--> Running transaction check
---> Package NetworkManager.x86_64 1:1.18.0-5.el7 will be updated
---> Package NetworkManager.x86_64 1:1.18.8-1.el7 will be an update
---
Complete!

Después de un reinicio exitoso, verifique la versión de RHEL para confirmar que el servidor está actualizado a 7.9:

[[email protected] ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)

Revertir actualizaciones

Primero, verifique el historial de transacciones con el yum pedido:

[[email protected] ~]# yum history
Loaded plugins: product-id, search-disabled-repos, subscription-manager
ID     | Login user               | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
     8 | root <root>              | 2020-11-01 23:10 | I, O, U        |  157 EE

Las columnas Acción(es) y Modificado brindan información sobre los cambios que se han producido con esta transacción.

Comportamiento):

  • I - Nuevo paquete instalado
  • O - El paquete está obsoleto
  • U - El paquete se actualiza

Modificado:

  • 157 paquetes han sido modificados
  • EE - Hubo errores/advertencias en la transacción

Utilizando yum history packages-list muestra los cambios que se han producido desde la perspectiva de este paquete.

Me gusta systemd es el primer proceso iniciado en las versiones 7 y posteriores de RHEL, este paquete está protegido por /etc/yum/protected.d/systemd.conf:

[[email protected] ~]# cat /etc/yum/protected.d/systemd.conf
systemd

Cancelar la última transacción con yum history undo:

[[email protected] ~]# yum history undo last
Loaded plugins: product-id, search-disabled-repos, subscription-manager
Undoing transaction 8, from Sun Nov  1 23:10:56 2020
    Updated     NetworkManager-1:1.18.0-5.el7.x86_64                        @?rhel-7-server-rpms
    Update                     1:1.18.8-1.el7.x86_64                        @rhel-7-server-rpms
    Updated     NetworkManager-config-server-1:1.18.0-5.el7.noarch          @?rhel-7-server-rpms
    Update                                   1:1.18.8-1.el7.noarch          @rhel-7-server-rpms
    Updated     NetworkManager-libnm-1:1.18.0-5.el7.x86_64                  @?rhel-7-server-rpms
....
Resolving Dependencies
--> Running transaction check
…
--> Finished Dependency Resolution
Error: Trying to remove "systemd", which is protected

Precaución: El siguiente proceso no es compatible ni está probado. Resuelva todos los problemas de degradación recuperándose desde una copia de seguridad o reinstalando.

Muévelo yum archivo de configuración, que protege systemd:

[[email protected] ~]# mv /etc/yum/protected.d/systemd.conf /etc/yum/protected.d/systemd.conf.bak

Vuelva a ejecutar el yum history undo last pedido:

[[email protected] ~]# yum history undo last
Loaded plugins: product-id, search-disabled-repos, subscription-manager
Undoing transaction 8, from Sun Nov  1 23:10:56 2020
....
Skipping the running kernel: kernel-3.10.0-1160.2.2.el7.x86_64
....

Dependencies Re

=======================================================================================================================
 Package                                    Arch       Version                           Repository               Size
=======================================================================================================================
Installing:
 iwl7265-firmware                           noarch     22.0.7.0-72.el7                   rhel-7-server-rpms      7.3 M
Removing:
 bc                                         x86_64     1.06.95-13.el7                    @rhel-7-server-rpms     215 k
 iwl7260-firmware                           noarch     25.30.13.0-79.el7                 @rhel-7-server-rpms      87 M
 linux-firmware                             noarch     20200421-79.git78c0348.el7        @rhel-7-server-rpms     394 M
Downgrading:
 NetworkManager                             x86_64     1:1.18.0-5.el7                    rhel-7-server-rpms      1.9 M
 NetworkManager-config-server               noarch     1:1.18.0-5.el7                    rhel-7-server-rpms      149 k
 NetworkManager-libnm    
…

Transaction Summary
=======================================================================================================================
Install      1 Package
Remove       3 Packages
Downgrade  152 Packages
…
Running transaction
  Installing : libgcc-4.8.5-39.el7.x86_64                                                                        1/308
  Installing : 1:grub2-common-2.02-0.80.el7.noarch                                                               2/308
  Installing : redhat-release-server-7.7-10.el7.x86_64                                                           3/308
warning: /etc/os-release saved as /etc/os-release.rpmsave
  Installing : setup-2.8.71-10.el7.noarch                                                                        4/308
warning: /etc/shadow created as /etc/shadow.rpmnew
  Installing : 1:grub2-pc-modules-2.02-0.80.el7.noarch   
....
yum-utils.noarch 0:1.1.31-52.el7                   

Complete!

reiniciar el servidor

Compruebe la versión de RHEL y kernel:

[[email protected] ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.7 (Maipo)

[[email protected] ~]# rpm -q kernel
kernel-3.10.0-1062.el7.x86_64
kernel-3.10.0-1160.2.2.el7.x86_64

[[email protected] ~]# uname -r
3.10.0-1160.2.2.el7.x86_64

El servidor está utilizando la última versión del kernel RHEL 7.9. Puede cambiar el kernel predeterminado usando grub2-set-default pedido.

Aplique el parche en subconjuntos para ganar más flexibilidad en la restauración

Anclar RHEL a una versión específica es una forma de evitar la actualización del sistema a la última versión secundaria. El administrador de suscripciones se puede usar para configurar la versión de RHEL:

[[email protected] ~]# subscription-manager release --list
+-------------------------------------------+
          Available Releases
+-------------------------------------------+
7.0
7.1
7.2
7.3
7.4
7.5
7.6
7.7
7.8
7.9
7Server

Compruebe las actualizaciones disponibles y el estado del repositorio antes de fijar la versión:

[[email protected] ~]# yum update
...
Transaction Summary
=======================================================================================================================
Install    2 Packages (+2 Dependent packages)
Upgrade  152 Packages


[[email protected] ~]# subscription-manager repos --list-enabled
Repo ID:   rhel-7-server-rpms
Repo Name: Red Hat Enterprise Linux 7 Server (RPMs)
Repo URL:  https://cdn.tipstecnologicos.es/content/dist/rhel/server/7/latest/$basearch/os
Enabled:   1

Fije la versión a RHEL 7.8, elimínela yum caché y verifique los repositorios habilitados:

[[email protected] ~]# subscription-manager release --set=7.8

[[email protected] ~]# yum clean all

[[email protected] ~]# subscription-manager repos --list-enabled
Repo ID:   rhel-7-server-rpms
Repo Name: Red Hat Enterprise Linux 7 Server (RPMs)
Repo URL:  https://cdn.tipstecnologicos.es/content/dist/rhel/server/7/7.8/$basearch/os
Enabled:   1

Es evidente a partir de la salida anterior que ahora está usando 7.8 y latest.

Correr yum update y verifique si se realizan cambios en las actualizaciones disponibles:

[[email protected] ~]# yum update
....
Transaction Summary
=======================================================================================================================
Install    2 Packages (+1 Dependent package)
Upgrade  136 Packages

Parche en subconjuntos

el la historia opción con yum utiliza la transacción para cancelar / cancelar la transacción. Así, actualizar paquetes como subconjuntos da la posibilidad de cancelarlos. Este es un mejor enfoque que actualizar el sistema como un todo.

Actualice el paquete 'device-mapper' con update device-mapper.

[[email protected] ~]# yum update device-mapper

Loaded plugins: product-id, search-disabled-repos, subscription-manager
Resolving Dependencies
--> Running transaction check
---> Package device-mapper.x86_64 7:1.02.158-2.el7 will be updated
--> Processing Dependency: device-mapper = 7:1.02.158-2.el7 for package: 7:device-mapper-libs-1.02.158-2.el7.x86_64
---> Package device-mapper.x86_64 7:1.02.170-6.el7 will be an update
--> Running transaction check
---> Package device-mapper-libs.x86_64 7:1.02.158-2.el7 will be updated
---> Package device-mapper-libs.x86_64 7:1.02.170-6.el7 will be an update
--> Finished Dependency Resolution

Dependencies Re

=======================================================================================================================
 Package                        Arch               Version                        Repository                      Size
=======================================================================================================================
Updating:
 device-mapper                  x86_64             7:1.02.170-6.el7               rhel-7-server-rpms             297 k
Updating for dependencies:
 device-mapper-libs             x86_64             7:1.02.170-6.el7               rhel-7-server-rpms             325 k

Transaction Summary
=======================================================================================================================
Upgrade  1 Package (+1 Dependent package)

Total download size: 621 k
Is this ok [y/d/N]:

Consultar la historia con yum history.

[[email protected] ~]# yum history
Loaded plugins: product-id, search-disabled-repos, subscription-manager
ID     | Login user               | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
     2 | root <root>              | 2020-11-02 15:25 | Update         |    2   
     1 | System <unset>           | 2020-09-14 04:25 | Erase          |    1 EE
history list

Obtenga detalles más específicos sobre la Transacción ID 2 usando yum history info 2.

[[email protected] ~]# yum history info 2
Loaded plugins: product-id, search-disabled-repos, subscription-manager
Transaction ID : 2
Begin time     : Mon Nov  2 15:25:12 2020
Begin rpmdb    : 345:fc299a705f95203fda639ed1153803ad6771d7fb
End time       :            15:25:14 2020 (2 seconds)
End rpmdb      : 345:f8faef254573c0653a624c30ee393b08bb365ab2
User           : root <root>
Return-Code    : Success
Command Line   : update device-mapper
Transaction performed with:
    Installed     rpm-4.11.3-40.el7.x86_64                  installed
    Installed     subscription-manager-1.24.13-1.el7.x86_64 installed
    Installed     yum-3.4.3-163.el7.noarch                  installed
Packages Altered:
    Updated device-mapper-7:1.02.158-2.el7.x86_64      @?rhel-7-server-rpms
    Update                7:1.02.170-6.el7.x86_64      @rhel-7-server-rpms
    Updated device-mapper-libs-7:1.02.158-2.el7.x86_64 @?rhel-7-server-rpms
    Update                     7:1.02.170-6.el7.x86_64 @rhel-7-server-rpms
history info

Finalmente, invierta la última transacción usando yum history undo last.

[[email protected] ~]# yum history undo last

Loaded plugins: product-id, search-disabled-repos, subscription-manager
Undoing transaction 2, from Mon Nov  2 15:25:12 2020
    Updated device-mapper-7:1.02.158-2.el7.x86_64      @?rhel-7-server-rpms
    Update                7:1.02.170-6.el7.x86_64      @rhel-7-server-rpms
    Updated device-mapper-libs-7:1.02.158-2.el7.x86_64 @?rhel-7-server-rpms
    Update                     7:1.02.170-6.el7.x86_64 @rhel-7-server-rpms
Resolving Dependencies
--> Running transaction check
---> Package device-mapper.x86_64 7:1.02.158-2.el7 will be a downgrade
---> Package device-mapper.x86_64 7:1.02.170-6.el7 will be erased
---> Package device-mapper-libs.x86_64 7:1.02.158-2.el7 will be a downgrade
---> Package device-mapper-libs.x86_64 7:1.02.170-6.el7 will be erased
--> Finished Dependency Resolution

Dependencies Re

=======================================================================================================================
 Package                        Arch               Version                        Repository                      Size
=======================================================================================================================
Downgrading:
 device-mapper                  x86_64             7:1.02.158-2.el7               rhel-7-server-rpms             294 k
 device-mapper-libs             x86_64             7:1.02.158-2.el7               rhel-7-server-rpms             322 k

Transaction Summary
=======================================================================================================================
Downgrade  2 Packages

Total download size: 616 k
Is this ok [y/d/N]:

Este no es el fin

Ser proactivo es la mejor manera de evitar revertir un parche fallido. Realizar copias de seguridad periódicas a nivel del sistema operativo y de la aplicación es la forma recomendada de revertir los cambios con confianza. Lea mi artículo Habilitar Sysadmin sobre cómo usar ReaR para copia de seguridad y restauración basadas en imágenes.

Para obtener más información sobre cómo revertir las actualizaciones en Red Hat Enterprise Linux, asegúrese de revisar el Portal de clientes de Red Hat.

Artículos de interés

Subir