Usar módulos en Fedora

Los Módulos son grupos especiales de paquetes que normalmente representan a una aplicación, un tiempo de ejecución de lenguaje o un conjunto de herramientas. Están disponibles en una o varios flujos que generalmente representan una versión principal de un software, dándole a usted la opción de elegir que versiones de los paquetes desea consumir.

Para simplificar la instalación, los módulos normalmente definen uno o más perfiles de instalación que representan un caso de uso específico. Por ejemplo un perfil server (servidor) o un perfil client (cliente) en un módulo de base de datos.

Esto es un rápida visión general de como usar los módulos y las secuencias de módulos con el administrador de paquetes DNF.

Instalación y descubrimiento de flujos de módulos

Listar paquetes

Los paquetes disponibles al sistema se pueden descubrir con los comandos usuales como dnf search NAME, dnf list NAME o usando el comando dnf repoquery QUERY para consultas más complejas. Sin embargo, es importante tener en cuenta que estos comandos solo listarán, aparte de los paquetes tradicionales, paquetes modulares que vengan de un flujo de módulo ya habilitado.

Listar módulos

Para listar los módulos disponibles en su sistema y ver que flujos son predeterminados o han sido habilitados, utilice el siguiente comando:

    $ dnf module list

Instalar paquetes

Los paquetes se pueden instalar del modo habitual ejecutando el comando dnf install NAME. Cualquier paquete tradicional o un paquete modular que venga de un módulo habilitado puede ser instalado de este modo.

Los paquetes de otros flujos de módulos pueden ser consumidos habilitando el flujo de módulo y después instalando los paquetes individuales o instalando un módulo directamente.

Habilitar módulos

Para habilitar un flujo de módulo y hacer sus paquetes disponibles para su instalación, ejecute el siguiente comando:

    $ dnf module enable NAME:STREAM

Por ejemplo, para hacer los paquetes Node.js 8 disponibles para su instalación, ejecute:

    $ dnf module enable nodejs:8

Los paquetes de los flujos de módulo habilitados pueden ser instalados entonces con el comando dnf install NAME.

Instalar módulos

Para instalar un módulo, use uno de los siguientes comandos. Al no especificar un flujo o un perfil se provoca que DNF elija el predeterminado. Sin embargo, no todos los módulos tienen un flujo predeterminado o un perfil predeterminado. En estos casos usted necesita especificar el flujo o el perfil explícitamente.

    $ dnf module install NAME
    $ dnf module install NAME:STREAM
    $ dnf module install NAME/PROFILE
    $ dnf module install NAME:STREAM/PROFILE

Por ejemplo, para instalar el tiempo de ejecución de Node.js 8 y las herramientas del cliente del flujo predeterminado de MongoDB, ejecute:

    $ dnf module install nodejs:8
    $ dnf module install mongodb/client

Cambio de flujos de módulos

El cambio de flujos puede ser una operación arriesgada que puede no estar admitida en los paquetes, especialmente las degradaciones.

Cambiar a un flujo diferente de uno que está instalado en el sistema se hace con el argumento switch-to.

    $ dnf module switch-to NAME:STREAM

Un ejemplo, para cambiar de Node.js 8 a Node.js 10, ejecute:

    $ dnf module switch-to nodejs:10

Un ejemplo, para cambiar de Node.js 10 a Node.js 8, ejecute:

    $ dnf module switch-to nodejs:8
El argumento switch-to es la manera preferida y recomendada de cambiar flujos.

El argumento switch-to incluye múltiples acciones que necesitan ser ejecutadas para cambiar de forma segura a otro flujo de módulo.

En este ejemplo mostramos un cambio manual de Node.js 8 a Node.js 10 sin ejecutar el argumento switch-to:

    $ dnf remove nodejs
    $ dnf module reset nodejs:8
    $ dnf module enable nodejs:10
    $ dnf install nodejs
El comando dnf module info NAME:STREAM es útil para comprobar los RPMs en un flujo de módulo.

Actualizar el sistema

Actualizar un sistema ejecutando el comando dnf update origina que todos los paquetes sean actualizados a la última versión proporcionada por su flujo de módulo.

Eliminar módulos

En general, para eliminar un módulo instalado en su sistema, use el siguiente comando:

    $ dnf module remove MODULE:STREAM/PROFILE

Avanzado

Hay una situación cuando un paquete específico ha sido instalado primero y un módulo se ha instalado después de eso. Ejemplo:

    $ dnf install ruby
    $ dnf module install ruby:2.6/default

En este caso, ejecutar el comando dnf module remove no eliminaría el paquete ruby, ya que DNF recuerda que el paquete ha sido instalado explícitamente.

Para hacer que el paquete ruby se desinstale con el comando dnf module remove, ejecute lo siguiente:

    $ dnf mark group ruby
    $ dnf module remove ruby:2.6/default

Esto se debe a que DNF recuerda el motivo por el cual se instaló el paquete. Hay tres, ordenados desde el más fuerte:

  • usuario

  • grupo

  • dependencia

Puesto que los módulos usan la razón grupo, que es más débil que el usuario usado por el comando dnf install, el paquete se mantiene en el sistema después de ejecutar el comando dnf module remove. "Degradarlo" a grupo, sin embargo, hace que dnf module remove lo elimine también.

Filtrado modular y conflictos

Cuando se consumen flujos de módulos se están ejecutando gran cantidad de operaciones. Un flujo de módulo contiene paquetes modulares alternativos que pueden tener el mismo nombre que paquetes RPM no modulares ya existentes, pueden surgir cantidad de conflictos. En los próximos ejemplos le mostraremos algunos de los conflictos.

Cambiar un flujo de módulo sin eliminar los paquetes RPM del flujo de módulo anterior

Example 1. dependencias rotas cuando se cambia el flujo de módulo sin eliminar el contenido instalado
[root@5e7d134a8883 /]# dnf module install nodejs:14/common
Last metadata expiration check: 0:02:38 ago on Thu Mar  3 08:57:00 2022.
Dependencies resolved.

 Problem 1: cannot install the best candidate for the job
  - nothing provides /usr/bin/pwsh needed by nodejs-1:14.19.0-2.module_f35+13766+ad18d3e5.x86_64
 Problem 2: package npm-1:6.14.16-1.14.19.0.2.module_f35+13766+ad18d3e5.x86_64 requires nodejs = 1:14.19.0-2.module_f35+13766+ad18d3e5, but none of the providers can be installed
  - cannot install the best candidate for the job
  - nothing provides /usr/bin/pwsh needed by nodejs-1:14.19.0-2.module_f35+13766+ad18d3e5.x86_64
===========================================================================================================================================================================
 Package                             Architecture              Version                                                            Repository                          Size
===========================================================================================================================================================================
Upgrading:
 nodejs                              x86_64                    1:14.17.2-2.module_f35+12348+fe4be0bd                              fedora-modular                      93 k
 nodejs-docs                         noarch                    1:14.17.2-2.module_f35+12348+fe4be0bd                              fedora-modular                     6.0 M
 nodejs-full-i18n                    x86_64                    1:14.17.2-2.module_f35+12348+fe4be0bd                              fedora-modular                     7.8 M
 nodejs-libs                         x86_64                    1:14.17.2-2.module_f35+12348+fe4be0bd                              fedora-modular                      13 M
Downgrading:
 npm                                 x86_64                    1:6.14.13-1.14.17.2.2.module_f35+12348+fe4be0bd                    fedora-modular                     3.3 M
Installing module profiles:
 nodejs/common
Skipping packages with broken dependencies:
 nodejs                              x86_64                    1:14.19.0-2.module_f35+13766+ad18d3e5                              updates-modular                    199 k
 npm                                 x86_64                    1:6.14.16-1.14.19.0.2.module_f35+13766+ad18d3e5                    updates-modular                    3.3 M

Transaction Summary
===========================================================================================================================================================================
Upgrade    4 Packages
Downgrade  1 Package
Skip       2 Packages

Total download size: 30 M
Is this ok [y/N]:

En esta situación habilitamos e instalamos el flujo de módulo nodejs:12 en Fedora 35. Luego reiniciamos el flujo 12 y habilitamos el flujo 14. después de eso queremos instalar el flujo de módulo nodejs:14.

Primero DNF está intentando actualizar o degradar el software instalado existente. No eliminará el software existente durante la ejecución del argumento reset. reset solo deshabilita el flujo de un módulo deshabilitado. Los NEVRAs de los archivos RPM en el flujo de módulo pueden tener diferentes versiones del software instalado (más nueva o más antigua) y también de otros flujos del mismo módulo. Las dependencias en tiempo de ejecución pueden ser diferentes entre los paquetes RPM de diferentes flujos de módulo.

Este conflicto es correcto y no es un error. Puesto que está intentando actualizar paquetes RPM instalados del flujo 12 con paquetes RPM del flujo 14. Los flujos de módulo del mismo módulo son excluyente mutuamente y solo un flujo a la vez debería ser habilitado e instalado.

Si usted está cambiando flujos y no está seguro sobre el proceso manual, utilice el argumento switch-to que es la manera recomendada.

Instalar un paquete RPM desde un flujo de módulo equivocado.

Example 2. de un paquete RPM solicitado para ser instalado desde un flujo de módulo equivocado
[root@bdaeaab947e6 /]# dnf module enable perl:5.30
Fedora 35 - x86_64                                                                                                                         6.8 MB/s |  79 MB     00:11
Fedora 35 openh264 (From Cisco) - x86_64                                                                                                   3.1 kB/s | 2.5 kB     00:00
Fedora Modular 35 - x86_64                                                                                                                 2.8 MB/s | 3.3 MB     00:01
Fedora 35 - x86_64 - Updates                                                                                                               7.3 MB/s |  27 MB     00:03
Fedora Modular 35 - x86_64 - Updates                                                                                                       2.3 MB/s | 2.8 MB     00:01
Dependencies resolved.
===========================================================================================================================================================================
 Package                                  Architecture                            Version                                   Repository                                Size
===========================================================================================================================================================================
Enabling module streams:
 perl                                                                             5.30

Transaction Summary
===========================================================================================================================================================================

Is this ok [y/N]: y
Complete!
[root@bdaeaab947e6 /]# dnf install perl-Tie-RefHash
Last metadata expiration check: 0:00:22 ago on Thu Mar  3 09:41:23 2022.
Error:
 Problem: package perl-Tie-RefHash-1.40-478.fc35.noarch requires perl(:MODULE_COMPAT_5.34.0), but none of the providers can be installed
  - conflicting requests
  - package perl-libs-4:5.34.0-481.fc35.i686 is filtered out by modular filtering
  - package perl-libs-4:5.34.0-481.fc35.x86_64 is filtered out by modular filtering
  - package perl-libs-4:5.34.0-482.fc35.i686 is filtered out by modular filtering
  - package perl-libs-4:5.34.0-482.fc35.x86_64 is filtered out by modular filtering
(try to add '--skip-broken' to skip uninstallable packages)
[root@bdaeaab947e6 /]#

El ejemplo describe una situación cuando usted intenta instalar un paquete RPM que no se proporciona desde el flujo de módulo perl:5.30 habilitado. Primero habilitamos el flujo de módulo perl:5.30. Después estamos intentando instalar el paquete perl-Tie-RefHash. El administrador de paquete DNF está intentando decirle que perl-Tie-RefHash no puede ser instalado porque no está proporcionado por ninguno de los flujos de módulo habilitados. El filtrado modular filtrará automáticamente todos los paquetes RPM que no están proporcionados por los flujos de módulo realmente habilitados.

Para corregir este conflicto usted tiene que habilitar el flujo de módulo correcto. En nuestro caso es el flujo de módulo perl:5.32.

Instalar un paquete RPM sin habilitar el flujo de módulo que lo proporciona.

Example 3. de un conflicto de instalación cuando se instala un paquete sin habilitar el flujo de módulo correcto
[root@bdaeaab947e6 /]# dnf install perl-DBI
Last metadata expiration check: 3:13:30 ago on Thu Mar  3 09:41:23 2022.
Error:
 Problem: package perl-DBI-1.643-10.fc35.x86_64 requires libperl.so.5.34()(64bit), but none of the providers can be installed
  - conflicting requests
  - package perl-libs-4:5.34.0-481.fc35.x86_64 is filtered out by modular filtering
  - package perl-libs-4:5.34.0-482.fc35.x86_64 is filtered out by modular filtering
(try to add '--skip-broken' to skip uninstallable packages)
[root@bdaeaab947e6 /]# dnf module enable perl-DBI
Last metadata expiration check: 3:14:38 ago on Thu Mar  3 09:41:23 2022.
Dependencies resolved.
===========================================================================================================================================================================
 Package                                  Architecture                            Version                                   Repository                                Size
===========================================================================================================================================================================
Enabling module streams:
 perl-DBI                                                                         1.643

Transaction Summary
===========================================================================================================================================================================

Is this ok [y/N]: y
Complete!
[root@bdaeaab947e6 /]# dnf install perl-DBI
Last metadata expiration check: 3:14:46 ago on Thu Mar  3 09:41:23 2022.
Dependencies resolved.
===========================================================================================================================================================================
 Package                          Architecture                   Version                                                      Repository                              Size
===========================================================================================================================================================================
Installing:
 perl-DBI                         x86_64                         1.643-7.module_f35+12493+425c54a8                            fedora-modular                         700 k

Transaction Summary
===========================================================================================================================================================================
Install  1 Package

Total download size: 700 k
Installed size: 1.9 M
Is this ok [y/N]:

En este ejemplo estamos intentando instalar el paquete perl-DBI. En nuestro sistema, previamente, hemos habilitado e instalado el flujo de módulo perl:5.32. El conflicto nos dice que estamos intentando instalar perl-DBI no modular que depende de perl no modular pero el paquete perl`no modular no está disponible debido al filtrado modular. Los únicos paquetes RPM que están disponibles para la resolución de dependencia son los paquetes RPM del flujo `5.32.

Los paquetes no modulares no pueden depender de un contenido modular. Si su paquete no modular necesita un dependencia modular, debe hacer modular su contenido.

Para corregir esto necesitamos habilitar el flujo de módulo perl-DBI:1.643`3. Cuando habilitamos `perl-DBI:1.643 estamos satisfaciendo la dependencia modular para el módulo perl. El paquete RPM no modular `perl-DBI RPM está filtrado ahora por un filtrado modular y no se considera en la resolución de dependencias y la creación de conjuntos de contenido.