Cómo lograr una funcionalidad equivalente a "dnf swap" con rpm-ostree

Si está ejecutando una de las variantes estándar de Fedora Linux, como Fedora Workstation o una de las otras variantes que no son ostree, es posible que haya utilizado el comando dnf swap en algún momento para reemplazar un paquete por otro. Este artículo describirá una técnica para realizar una operación similar en unostreinstalación usando el comando rpm-ostree.

El comando dnf swap evita conflictos cuando dos paquetes contienen archivos con el mismo nombre y ruta del sistema de archivos. Es necesario cuando otros paquetes del sistema dependen de un paquete que desea reemplazar (“intercambiar”) con una versión alternativa, pero desinstalar completamente los paquetes dependientes y luego reinstalar todo con la alternativa no es práctico.

Sin embargo, eso no funciona muy bien con Fedora Silverblue y las variantes ostree. No tienen un comando de intercambio rpm-ostree. Afortunadamente, existe una manera de lograr una funcionalidad similar. ¡Solo necesitamos desinstalar el paquete antiguo e instalar el nuevo paquete en la misma transacción!

Utilice rpm-ostree para reemplazar paquetes en la imagen base

El escenario más común, especialmente cuando no se superponen muchos paquetes o ninguno, es reemplazar paquetes en la imagen base.

Un buen ejemplo de esto es reemplazar nano-default-editor, que se estableció como predeterminado en Fedora Linux 33, con vim-default-editor. Algunos usuarios preferirían usar vim, pero dnf swap nano-default-editor vim-default-editor no funcionará en sistemas basados en ostree.

Si usa dnf, al intentar instalar vim-default-editor, lo más probable es que se produzcan conflictos de dependencia y la transacción falle. El resultado a continuación es lo que obtendría y efectivamente significa que tanto nano-default-editor como vim-default-editor proporcionan el editor predeterminado del sistema, pero solo se puede instalar un proveedor de editor predeterminado del sistema a la vez. (Se pueden instalar vim-default-editor o nano-default-editor, pero ambos no se pueden instalar al mismo tiempo).

$ sudo dnf install vim-default-editor
...
Error: 
 Problem: problem with installed package nano-default-editor-7.2-4.fc39.noarch
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.0.1927-1.fc39.noarch from fedora
  - package vim-default-editor-2:9.0.1927-1.fc39.noarch from fedora conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from fedora conflicts with system-default-editor provided by vim-default-editor-2:9.0.1927-1.fc39.noarch from fedora
  - package vim-default-editor-2:9.0.1927-1.fc39.noarch from fedora conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from fedora
  - conflicting requests
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.1.016-1.fc39.noarch from updates
  - package vim-default-editor-2:9.1.016-1.fc39.noarch from updates conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from fedora conflicts with system-default-editor provided by vim-default-editor-2:9.1.016-1.fc39.noarch from updates
  - package vim-default-editor-2:9.1.016-1.fc39.noarch from updates conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from fedora
(try to add '--allowerasing' to command line to replace conflicting packages or '--skip-broken' to skip uninstallable packages)

Si intenta hacer lo mismo en rpm-ostree, aparece un mensaje de error similar, que efectivamente tiene el mismo significado.

$ rpm-ostree install vim-default-editor
...
Resolving dependencies... done
error: Could not depsolve transaction; 1 problem detected:
 Problem: conflicting requests
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.1.016-1.fc39.noarch from updates
  - package vim-default-editor-2:9.1.016-1.fc39.noarch from updates conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.0.1927-1.fc39.noarch from fedora
  - package vim-default-editor-2:9.0.1927-1.fc39.noarch from fedora conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.0.2048-1.fc39.noarch from updates-archive
  - package vim-default-editor-2:9.0.2048-1.fc39.noarch from updates-archive conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.0.2081-1.fc39.noarch from updates-archive
  - package vim-default-editor-2:9.0.2081-1.fc39.noarch from updates-archive conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.0.2105-1.fc39.noarch from updates-archive
  - package vim-default-editor-2:9.0.2105-1.fc39.noarch from updates-archive conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.0.2120-1.fc39.noarch from updates-archive
  - package vim-default-editor-2:9.0.2120-1.fc39.noarch from updates-archive conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.0.2153-1.fc39.noarch from updates-archive
  - package vim-default-editor-2:9.0.2153-1.fc39.noarch from updates-archive conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.0.2167-1.fc39.noarch from updates-archive
  - package vim-default-editor-2:9.0.2167-1.fc39.noarch from updates-archive conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.0.2190-1.fc39.noarch from updates-archive
  - package vim-default-editor-2:9.0.2190-1.fc39.noarch from updates-archive conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System
  - package nano-default-editor-7.2-4.fc39.noarch from @System conflicts with system-default-editor provided by vim-default-editor-2:9.1.016-1.fc39.noarch from updates-archive
  - package vim-default-editor-2:9.1.016-1.fc39.noarch from updates-archive conflicts with system-default-editor provided by nano-default-editor-7.2-4.fc39.noarch from @System

Entonces, para que esto funcione, primero debemos considerar eliminar el editor nano-default. En este escenario, tenemos que analizar rpm-ostree override remove, que nos permite eliminar paquetes de la imagen base. Pero, si simplemente intentamos eliminar nano-default-editor, fallará diciendo que default-editor necesita un paquete que proporcione system-default-editor. En otras palabras, si queremos eliminar nano-default-editor necesitamos instalar vim-default-editor u otro paquete que proporcione system-default-editor. Otra posibilidad es eliminar por completo el editor predeterminado y perder esta funcionalidad:

$ rpm-ostree override remove nano-default-editor
...
Resolving dependencies... done
error: Could not depsolve transaction; 1 problem detected:
 Problem: package default-editor-7.2-4.fc39.noarch from @System requires system-default-editor, but none of the providers can be installed
  - conflicting requests

Afortunadamente, el comando rpm-ostree override remove acepta un argumento de instalación adicional que nos permite instalar también un paquete junto con la eliminación. Entonces, si también agregamos vim-default-editor, obtenemos:

$ rpm-ostree override remove nano-default-editor --install vim-default-editor
<snip>
Resolving dependencies... done
Will download: 6 packages (10,0 MB)
Downloading from 'fedora'... done
Downloading from 'updates'... done
Importing packages... done
Applying 1 override and 6 overlays
Processing packages... done
Running pre scripts... done
Running post scripts... done
Running posttrans scripts... done
Writing rpmdb... done
Writing OSTree commit... done
Staging deployment... done
Freed: 213,9 MB (pkgcache branches: 0)
Removed:
  nano-default-editor-7.2-4.fc39.noarch
Added:
  gpm-libs-1.20.7-44.fc39.x86_64
  vim-common-2:9.0.2190-1.fc39.x86_64
  vim-default-editor-2:9.0.2190-1.fc39.noarch
  vim-enhanced-2:9.0.2190-1.fc39.x86_64
  vim-filesystem-2:9.0.2190-1.fc39.noarch
  xxd-2:9.0.2190-1.fc39.x86_64
Use "rpm-ostree override reset" to undo overrides
Run "systemctl reboot" to start a reboot

Y ahora, después de reiniciar, se debe instalar vim-default-editor y vim debe ser el editor predeterminado. Puede confirmar los resultados con rpm-ostree status:

$ rpm-ostree status
State: idle
Deployments:
● fedora:fedora/39/x86_64/silverblue
                  Version: 39.20240106.0 (2024-01-06T01:35:56Z)
               BaseCommit: 2d052ca5e08b07406612e68cbb4ec67e86d733dba5e458234ad65bc5a4ad5b51
             GPGSignature: Valid signature by E8F23996F23218640CB44CBE75CF5AC418B8E74C
      RemovedBasePackages: nano-default-editor 7.2-4.fc39
          LayeredPackages: vim-default-editor

El comando para deshacer dicha transacción sería rpm-ostree override reset nano-default-editor ‐‐uninstall vim-default-editor.

Reemplazo de paquetes superpuestos

Al reemplazar paquetes superpuestos, el proceso es considerablemente más sencillo. Hay tres comandos a considerar: instalación rpm-ostree, desinstalación rpm-ostree y actualización rpm-ostree.

rpm-ostree install recibe una lista de paquetes a instalar, pero también admite un parámetro ‐uninstall para eliminar paquetes en la misma transacción. rpm-ostree uninstall recibe una lista de paquetes a desinstalar, pero también admite un parámetro ‐‐install para instalar paquetes en la misma transacción.

rpm-ostree update actualiza el sistema, pero también admite los parámetros ‐‐install y ‐‐uninstall para instalar o desinstalar paquetes en la misma transacción.

En última instancia, para los paquetes superpuestos, se trata principalmente de elegir si actualizar también el sistema y luego elegir el comando más conveniente.

Conclusión

Si bien, debido a la naturaleza de rpm-ostree, puede que no parezca que se pueda lograr una funcionalidad tipo dnf swap, una mirada más cercana a sus comandos muestra una flexibilidad similar, incluso si usa ropa diferente.