本地 rpm 存储库,包含系统上安装的所有软件包

本地 rpm 存储库,包含系统上安装的所有软件包

我想要做的是制作一个带有本地存储库/目录的 USB 磁盘,用于离线安装(或升级)Linux 服务器。为什么!?很简单,我正在维护庞大的 asterisk IP PBX-es 集群,asterisk(和 dahdi 等)是根据内核源构建的,如果内核版本发生变化(与我以前构建的版本不同),那么灾难就来了。现在,我的想法是将所有安装在一台服务器(开发)上的 rpm/srpm 放在一起,然后将所有其他服务器安装/升级到相同版本的 rpm。简单的方法是强制 YUM 将所有安装的 rpm 下载到某个目录,然后将它们复制到 usb-flash_disk 并在所有其他服务器上执行“yum install ./*.rpm”!?这样,我的所有系统都具有相同的修订版本!

问题是:如何告诉 YUM(仅)下载所有已安装的 rpm???

答案1

有 2 个选项

使用 rpm (Red Hat 软件包管理器) 或 yum (Yellowdog 更新程序/修改程序)

1)每分钟转数

rpm -qa > to_be_installed; while read -r package; do yum -y install "$package"; done < to_be_installed

2)YUM

yum list installed | awk 'NR>1{print $1}' > to_be_installed; while read -r line; do yum -y install "$line"; done < to_be_installed

希望这能给你提供一些关于如何去做的想法。

答案2

您可以使用获取已安装软件包的列表yum list installed,您可能需要使用

yum list installed | awk 'NR >2 {print $1}' >installed.pkg

获得列表后,您可以使用yum下载器下载软件包的实用程序

for file in $(cat installed.pkg)
do
    yumdownloader "$file"
done

这会将所有 rpm 下载到当前目录。

答案3

我相信上述两种答案会产生不同的结果:

情况A)【如上所示】

rpm -qa > to_be_installed; while read -r package; do yum -y install "$package"; done < to_be_installed

情况B)【如上所示】

yum list installed | awk '{print $1}' > to_be_installed; while read -r line; do yum -y install "$line"; done < to_be_installed

在情况 A) 中,rpm -qa 将返回“完整”的 rpm 名称,包括版本信息。
在情况 B) 中,软件包名称(带有架构后缀)在第一列,版本在第二列。

因此,在情况 A) 中,您将下载所有当前安装的 rpm。
在情况 B) 中,您将下载所有最新版本的软件包(针对您的发行版)。

尝试使离线升级正常工作的另一个主要问题是 yumdownloader 上的开关 --resolve 无法正常工作(它不能解决所有依赖关系)。

我使用的程序是:

  1. 将我实际安装的软件包连接到互联网
  2. 如果我打算升级,那么我会从互联网上升级这台机器
  3. 使用 yum 进行实际升级有两个作用

    i) 更新我的所有 rpm 版本,并且

    ii)解决所有包依赖关系

  4. 然后

    yumdownloader rpm -qa--destdir=/路径/rpm_updates

我无法在目录中创建基于本地文件的 repo /path/rpm_updates,将其放在 USB 上并从该 rpm 列表中升级机器(离线)。

相关内容