Red Hat Enterprise Linux 8 的新玩意 第6篇 module 的简介及操作示例



1 概述

这个文档介绍了在RHEL8.x ,CentOS8.x 上面, 如何对AppStream 软件仓库中的模块进行查询,安装,等操作。适用于Linux 系统的管理人员,维护人员等。


2 软件包介绍

从RHEL8,CentOS8 开始,软件包分为两个主要的仓库,BaseOS 和 AppStream。

  • BaseOS
    提供了OS 的基础软件包,例如grub2, kernel,lib 等等。这个仓库里面的软件包是以RPM 格式直接提供的。

  • AppStream
    提供了用户应用程序,例如http, python, php, gcc 等等。这个仓库里面软件包则是通过两种格式提供,一个是RPM 格式,而另外一个就是module 了。这可能会问,为什么会使用这样的方式来管理呢? 主要是这样的:

    • 这样可以同时提供多个版本用户应用程序,具有更多灵活性
    • 这样可以方便使用到最新的用户应用程序,便于随时根据需要随时升降级
    • 应用升级,降级不会影响到基础软件包(如通过BaseOS提供的内容)
    • 这样可以把一系列相关的用户应用RPM通过module形式打包起来,通过module来是管理这一系列的应用,减少复杂性。


      3 AppStraem 中的软件包的打包方式介绍

  • 独立的RPM 格式
    这个也就是我们所熟知的传统的RPM包的格式了。

  • Modules 模块的形式
    Modules 这种方式呢,其实就是把一系列强相关的RPM组合成一个逻辑上的模块单元。 例如httpd 模块(包含了httpd,httpd-devel,mod_http,mod_ss等一系列的RPM)。它这个里面呢,所有的RPM都是同时编译,测试,以及发布的。 所以通过这样的方式,就具有了更好的兼容性,稳定性,以及灵活性。


    4 module 的详细介绍

    module 里面,包含了两个重要的概念, 一个是module的stream, 另外一个就是module的profiles了。 下面我们来仔细看一下

  • Streams
    它通过版本来进行管理的,可以理解为module 的版本,比如1.0, 2.0 等等(可以参考下面的例子 Stream的信息)。 可以理解为它是AppStream里面的一个子repo。 最小的单元一系列RPM被放入一个对应的版本的module stream里面。跟着module stream一起发布,更新。 而不同的版本的module stream 可以独立接收到更新。而我们则可以根据需要,通过命令来进行对module stream 启用和禁用或者默认。 启用则说明我们可以使用到这个module stream里面对应的RPM包;相对而言,如果禁用,我们就是无法使用这个module stream里面对应的RPM包了。这样会出现一种现象,比如我的AppStream源里面明明有其中一个版本的RPM, 但是我却无法使用它。这就是因为这个RPM版本对应的module stream被禁用了,因为这个版本的RPM是这个straem的一员,自然也就没法使用它了。而同一个module,同一时间只能有一个启用的stream。而默认情况下,会有一个默认其中的stream, 这样可以不用做任何的动作的情况下就可以使用到默认 stream的RPM包了。同样,module stream 也会与RPM类似有依赖关系。
    比如下面这个例子,我们可以看到httpd 这个module有两个stream, 2.4和1.0 两个版本。其中 2.4 是启用的stream ,并且是default的。

    1
    2
    3
    4
    5
    Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)
    Name Stream Profiles Summary
    httpd 2.4 [d][e] common [d], devel, minimal Apache HTTP Server
    httpd 1.0 common [d], devel, minimal Apache HTTP Server
    Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled
  • Profiles
    它是用过目的来进行管理的,可以理解为module的使用描述。 它描述了对应的使用范围的以及一系列的RPM包,类似development,minimal, 等等;不同的profile里面会包含不用数量的RPM包。比如development profile里面则会包含devel RPM包; 而minimal profile里面则不会包含devel 的RPM包。 所以这样客户更方便我们来根据需要来选择对应的profile 来安装对应module,这样我们安装了我们需要的RPM了。同样,我们也可以有default的profile,这样默认情况下,我们不需要做任何就可以在安装时,使用default的profile了。
    比如下面这个例子,我们可以看到http的这个module有三个profile,common,devel和minimal。 而common则是default的profile。

    1
    2
    3
    4
    5
    Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)
    Name Stream Profiles Summary
    httpd 2.4 [d][e] common [d], devel, minimal Apache HTTP Server
    httpd 2.0 common [d], devel, minimal Apache HTTP Server
    Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled



    5 module 的操作示例

    5.1 显示当前系统中可用的 module

    1
    # yum module list
  • 示例。 我们可以看到当前系统所有可用的module,它们的stream信息(d=default,e=enabled)。profile信息,描述的等等。

    1
    2
    3
    4
    5
    6
    7
    8
    Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)
    Name Stream Profiles Summary
    container-tools rhel8 [d][e] common [d] Common tools and dependencies for container runtimes
    container-tools 1.0 common [d] Common tools and dependencies for container runtimes
    container-tools 2.0 common [d] Common tools and dependencies for container runtimes
    go-toolset rhel8 [d][e] common [d] Go
    idm client [d] common [d] RHEL IdM long term support client
    ......

    5.2 显示module详细信息,可以查看模块描述,profile,提供的RPM包等等。

    1
    # yum module info module-name
  • 示例。可以看到stream版本,profile,里面包含的包,以及版本的等等。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    Name             : httpd
    Stream : 2.4 [d][e][a]
    Version : 8000020190405071959
    Context : 55190bc5
    Architecture : x86_64
    Profiles : common [d], devel, minimal
    Default profiles : common
    Repo : rhel-8-for-x86_64-appstream-rpms
    Summary : Apache HTTP Server
    Description : Apache httpd is a powerful, efficient, and extensible HTTP server.
    Requires : platform:[el8]
    Artifacts : httpd-0:2.4.37-11.module+el8.0.0+2969+90015743.src
    : httpd-0:2.4.37-11.module+el8.0.0+2969+90015743.x86_64
    : httpd-debuginfo-0:2.4.37-11.module+el8.0.0+2969+90015743.x86_64
    : httpd-debugsource-0:2.4.37-11.module+el8.0.0+2969+90015743.x86_64
    : httpd-devel-0:2.4.37-11.module+el8.0.0+2969+90015743.x86_64
    : httpd-filesystem-0:2.4.37-11.module+el8.0.0+2969+90015743.noarch
    : httpd-manual-0:2.4.37-11.module+el8.0.0+2969+90015743.noarch
    : httpd-tools-0:2.4.37-11.module+el8.0.0+2969+90015743.x86_64
    : httpd-tools-debuginfo-0:2.4.37-11.module+el8.0.0+2969+90015743.x86_64
    : mod_http2-0:1.11.3-2.module+el8.0.0+2969+90015743.src
    : mod_http2-0:1.11.3-2.module+el8.0.0+2969+90015743.x86_64
    : mod_http2-debuginfo-0:1.11.3-2.module+el8.0.0+2969+90015743.x86_64
    : mod_http2-debugsource-0:1.11.3-2.module+el8.0.0+2969+90015743.x86_64
    ......

    5.3 显示对应的profile里面的包含那些具体的包。

    1
    # yum module info --profile module-name
  • 示例 实现了module的版本,还有其中不同的profile包含了什么包。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # yum module info --profile httpd

    Name : httpd:2.4:820190206142837:9edba152:x86_64
    common : httpd
    : httpd-filesystem
    : httpd-tools
    : mod_http2
    : mod_ssl
    devel : httpd
    : httpd-devel
    : httpd-filesystem
    : httpd-tools
    minimal : httpd
    .....

    5.4 显示当前module状态,比如里面的enabled,disable等状态。

    1
    # yum module list module-name
  • 示例 模块的信息,Stream的信息,default,profile信息等。(注意,如果不在enabled状态,是yum whatprovides 是无法看到对应的rpm的)

    1
    2
    3
    4
    5
    6
    7
    # yum module list php
    Red Hat Enterprise Linux 8 for x86_64 - AppStream (RPMs)
    Name Stream Profiles Summary
    php 7.2 [d] common [d], devel, minimal PHP scripting language
    php 7.3 common [d], devel, minimal PHP scripting language
    php 7.4 common [d], devel, minimal PHP scripting language
    Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled

    5.5 查找那个模块提供了RPM

    1
    # yum module provides package
  • 示例 我们查找那个podman RPM 的详细信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # yum module provides podman
    podman-1.0.0-2.git921f98f.module+el8+2784+9a0c1dfe.x86_64
    Module : container-tools:1.0:820190220135513:20125149:x86_64
    Profiles : common
    Repo : rhel-8-for-x86_64-appstream-rpms
    Summary : Common tools and dependencies for container runtimes
    ......

    podman-1.6.4-23.module+el8.3.0+8377+eff33c85.x86_64
    Module : container-tools:2.0:8030020201008133618:830d479e:x86_64
    Profiles : common
    Repo : rhel-8-for-x86_64-appstream-rpms
    Summary : Common tools and dependencies for container runtimes
    ......

    podman-1.9.3-2.module+el8.2.1+6867+366c07d6.x86_64
    Module : container-tools:rhel8:8020120200601155013:ffd2803a:x86_64
    Profiles : common
    Repo : rhel-8-for-x86_64-appstream-rpms
    Summary : Common tools and dependencies for container runtimes

    5.6 禁用一个对应的module stream

    1
    # yum module disable module-name:stream
  • 示例 禁用stream 版本rhel8 的 “container-tools”

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # yum module disable container-tools:rhel8
    Only module name is required. Ignoring unneeded information in argument: 'container-tools:rhel8'
    Dependencies resolved.
    ======================================================================================================
    Package Architecture Version Repository Size
    =====================================================================================================
    Disabling module profiles:
    container-tools/common
    Disabling modules:
    container-tools
    Transaction Summary
    ======================================================================================================
    Is this ok [y/N]: y
    Complete!

    5.7 启用一个对应的module stream

    1
    # yum module enable module-name:stream
  • 示例 启用 stream 版本 2.0 的 “container-tools” (注意,需要先要将原来其中的其他stearm 禁用掉。)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # yum module enable container-tools:2.0
    Dependencies resolved.
    ========================================================================================================
    Package Architecture Version Repository Size
    ========================================================================================================
    Enabling module streams: container-tools 2.0

    Transaction Summary
    =========================================================================================================
    Is this ok [y/N]: y
    Complete!

    5.8 安装一个指定的模块

    1
    # yum module install module-name
  • 示例 (安装默认的container-tools module stream,如果要安装其他stream则需要将它enable才能安装)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # yum module install container-tools
    Last metadata expiration check: 2:41:25 ago on Sun 08 Nov 2020 09:10:32 AM CST.
    Dependencies resolved.
    =================================================================================================
    Package Arch Version Repository Size
    =================================================================================================
    Upgrading:
    buildah x86_64 1.15.1-2.module+el8.3.0+8221+97165c3f rhel-8-for-x86_64-appstream-rpms 8.0 M
    conmon x86_64 2:2.0.20-2.module+el8.3.0+8221+97165c3f rhel-8-for-x86_64-appstream-rpms 49 k
    .....
    Transaction Summary
    =======================================================================================================
    Install 8 Packages
    Upgrade 12 Packages

    Installed:
    ......
    toolbox-0.0.8-1.module+el8.3.0+8221+97165c3f.noarch
    Complete!

    5.9 删除一个指定的模块

    1
    # yum module remove --all module-name:stream
  • 示例 这样就可以删除之前安装的container-tools的默认的stream 版本了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # yum module remove container-tools:rhel8
    Dependencies resolved.
    ==============================================================================================
    Package Architecture Version Repository Size
    =================================================================================================

    Removed:
    cockpit-podman-18.1-2.module+el8.3.0+8221+97165c3f.noarch crun-0.14.1-2.module+el8.3.0+8221+97165c3f.x86_64
    .....

    Complete!

    到此,RHEL8.x CentOS8.x 的module 简介及操作示例就介绍完毕了。