uos20本地源安装nginx、redis报“没有可用的模块元数据,它将不能被安装至此系统上”解决办法。

  • 系统版本信息

[root@localhost ~]# cat /etc/os-version

[Version]

SystemName=UOS Server

SystemName[zh_CN]=统信服务器操作系统

ProductType=Server

ProductType[zh_CN]=服务器

EditionName=a

EditionName[zh_CN]=a

MajorVersion=20

MinorVersion=1060

OsBuild=12028.101.100

  • 问题描述

根据centos7本地源安装经验,从官方repo源下载了rpm包(nginx-1.14.1-9.0.1.module+uelc20+1068+d8d73bf1.2.x86_64.rpm、redis-5.0.3-5.module+uelc20+1170+e8d8a018.01.x86_64.rpm)到本地,使用createrepo创建本地repo源,配置本地repo源后使用dnf install nginx redis安装,报错:“对于模块软件包 'nginx-1.14.1-9.0.1.module+uelc20+1068+d8d73bf1.2.x86_64' 没有可用的模块元数据,它将不能被安装至此系统上                       错误:对于模块软件包没有可用的模块元数据”

  • 问题分析

对于使用module类型的rpm包,需要在repo中创建模块元数据,才能使用dnf进行正常安装。

  • 解决办法:
  • DNF Module 简介

DNF Module 是一种管理软件包集合的方法,允许用户选择、安装和使用特定版本的软件或一组软件包。它解决了传统软件包管理系统中难以同时维护多个版本软件的问题。每个模块定义了一个或多个“流”(streams),每个流代表了该软件的不同版本或变体。用户可以选择启用特定的流来安装对应的软件版本。

  • modulemd-tools工具介绍

模块元数据通过特定格式的xml文件,利用”createrepo_c --compress-type="xz" -g comps.xml . “命令创建,但xml文件较复杂,不易维护。于是就有了“为模块化内容创建者提供的工具集合”项目,即modulemd-tools工具,它简化了dnf module管理。

  • modulemd-tools安装

在Fedora(epel)官方repo或者RHEL 8.5及以上版本repo源已有modulemd-tools安装包,uos20-1060也有,可直接dnf安装,低版本或者发行版本可以需要下载源码编译。https://github.com/rpm-software-management/modulemd-tools

dnf install modulemd-tools
  • 在已经创建存储库repodata的环境下创建模块元数据

进入到本地repo目录执行以下命令

repo2module . --module-name drs --module-stream env --module-version 001 --module-context "system environment"

选项说明:

module-name: 模块名称

module-stream:模块流,即版本或者变体等

module-version:模块版本

module-context:模块说明内容

以上命令在当前目录创建了1个modules.yaml文件,该文件描述了模块元数据内容。

createrepo_mod .

使用以上命令创建模块元数据,在repodata目录下生成了***********-modules.yaml.gz元数据文件。

在/etc/yum.repos.d/创建本地repo源文件,并更新dnf本地缓存,即可查看module

dnf makecache
#更新dnf缓存
dnf module list
#显示所有module
dnf module info drs:env
#查看上面创建的drs:env模块详细信息
dnf module install drs:env
#安装模块drs:env,这将会把模块中包含的所有rpm包安装到本地
dnf install nginx
#单独安装模块中的某个rpm
  • 在只有rpm包的目录下创建模块元数据

上面实例中将repo目录中的所有rpm都加到了module元数据中,造成module的软件列表(Artifacts)非常烦复,为了精减列表或者只想关联相关软件,需要将module类型的rpm包单独分离出来。

mkdir module
mv *module* module/
cd module/
dir2module mod:env:001:drsmod:amd64 -m "drs module env v1" --dir .
# 根据当前目录创建模块元数据yaml文件,创建后会生成2个yaml文件。
# mod:env:001:drsmod:amd64  模块名:流:版本:说明:架构 -m 提交说明
# 如果当前目录有非module类型的rpm包
# 会报“Error: All packages need to contain the `modularitylabel` header.
# To suppress this constraint, use `--force` parameter”错误,这是因为普通rpm不包含
# module标签头,可使用--force忽略。
createrepo_mod .
# 创建模块元数据。

创建当前源的repo文件,更新dnf缓存,即可在module中查看到mod:env模块信息。

  • 总结:

module可以用来进行版本管理,像python一样,在同一环境可部署多个版本并进行隔离。

也可以将相关软件环境通过module进行组织,方便管理。

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值