我有一个场景,需要在没有网络连接的服务器上安装任意列表的 RPM 软件包(通常大约 5-10 个软件包)。有些软件包来自 EPEL,我想避免同步所有存储库,因为我需要经常这样做。
我已经通过执行以下操作解决了 RHEL/CentOS 7 的问题:
$ yum -y install epel-release createrepo
$ repotrack $PACKAGE_NAME
$ createrepo --database .
然后,我只需使用 USB 驱动器将此文件夹移动到服务器上,并在 中创建一个存储库文件/etc/yum.repos.d
,这样我就可以使用yum --disablerepo="*" --enablerepo="my-custom-repo" install $PACKAGE_NAME
.
dnf install
现在我将其移至 RHEL/CentOS 8,虽然它适用于我的一半软件包,但当我在隔离服务器上执行另一半软件包时,我收到以下错误:
模块化包“podman-1.6.4-2.module_el8.1.0+272+3e64ee36.x86_64”没有可用的模块化元数据,无法安装在系统上
我认为这是由于新的模块化系统而我的存储库没有所有必要的信息。我尝试阅读两者的手册repotrack
,createrepo
但似乎都没有提到模块。在互联网上搜索只给了我 7 的解决方案,我已经有了,但我没有找到 8 的任何内容以及特别属于模块的包。
那么,如何将属于模块的 RHEL/CentOS 8 软件包及其所有依赖项提取到磁盘,以便我可以将它们移动到另一台服务器并安装在那里?
谢谢!
答案1
看看modulemd 工具项目。你可以找到EPEL 中的预编译二进制文件。
假设您有几个模块化 rpm ./my-custom-repo/Packages
:
模块化 rpm 名称,例如 python36-3.6.8-2。模块_el8.1.0+245+c39af44f.x86_64.rpm
跑步:
cd my-custom-repo
# create traditional rpm repo
createrepo_c .
# generate modules meta info
repo2module -s stable -d . modules.yaml
# adjust modules meta info to traditional rpm repo
modifyrepo_c --mdtype=modules modules.yaml repodata/
完成所有这些工作后,您可以在 repodata 目录中找到类似 xxxx-modules.yaml.gz 的文件名。
回购协议现在应该可以工作了。
答案2
yum 仍然可以在 RHEL 8 上运行。此外,还有 DNF 和 yum 的仅下载选项。
--downloadonly 下载已解析的软件包集而不执行任何 rpm 事务(安装/升级/擦除)。
yum 安装 httpd --downloadonly
下载文件并将其复制到您想要的位置,然后执行
dnf localinstall packagename