我想要做的是制作一个带有本地存储库/目录的 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 无法正常工作(它不能解决所有依赖关系)。
我使用的程序是:
- 将我实际安装的软件包连接到互联网
- 如果我打算升级,那么我会从互联网上升级这台机器
使用 yum 进行实际升级有两个作用
i) 更新我的所有 rpm 版本,并且
ii)解决所有包依赖关系
然后
yumdownloader
rpm -qa
--destdir=/路径/rpm_updates
我无法在目录中创建基于本地文件的 repo /path/rpm_updates
,将其放在 USB 上并从该 rpm 列表中升级机器(离线)。