- 系统版本信息
[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进行组织,方便管理。