安装librdkafka-devel 遇到的yum源优先级问题

安装librdkafka-devel 遇到的yum源优先级问题

事情起因

公司有个golang项目依赖confluent-kafka-go

这个包是 librdkafka(c++) 项目的golang绑定,所以需要在机器上安装正确的librdkafka包项目才能编译成功

我们服务是aws linux 2的机器,相当于centos7。按照文档说明配置yum 源:

sudo rpm --import https://packages.confluent.io/rpm/7.2/archive.key

#创建/etc/yum.repo.d/confluent.repo,内容如下:
[Confluent]
name=Confluent repository
baseurl=https://packages.confluent.io/rpm/7.2
gpgcheck=1
gpgkey=https://packages.confluent.io/rpm/7.2/archive.key
enabled=1

[Confluent-Clients]
name=Confluent Clients repository
baseurl=https://packages.confluent.io/clients/rpm/centos/$releasever/$basearch
gpgcheck=1
gpgkey=https://packages.confluent.io/clients/rpm/archive.key
enabled=1

aws linux 2 的 $releasever 是2,需要手动改为7(centos7)

配置好后,执行yum list librdkafka-devel 没有发现最新的1.9.0的包,很疑惑。

confluent-kafka-go的依赖是1.9.0,必须安装librdkafka-devel 1.9.0才能编译成功。aws 自带的librdkafka-devel 版本太低

排查过程

  • • 打开 (https://packages.confluent.io/clients/rpm/centos/7/x86_64/)[] 是可以找到librdkafka-devel-1.9.0-1.cflt.el7.x86_64.rpmrpm包,说明yum repo的地址没问题。

  • • 下载librdkafka-devel-1.9.0-1.cflt.el7.x86_64.rpm rpm文件,手动 安装rpm -i librdkafka-devel-1.9.0-1.cflt.el7.x86_64.rpm 提示缺少另外的依赖rpm。rpm 安装需要自己维护依赖,放弃rpm 安装。

  • • 在google搜这个问题关键词,找的内容都不匹配,随后放弃直接搜索关键词,准备全面学一下yum的基础知识

  • • 在redhat官网文档中找到了一个全面的yum命令文档,每个命令都有简单的介绍:yum 命令备忘录。

  • • 看文档后尝试并发现yum localinstall librdkafka-devel-1.9.0-1.cflt.el7.x86_64.rpm 可以安装本地rpm并自动下载依赖。(localinstall 后面可以指定url 安装)

成功,悲喜交加,搞了2个小时解决了。

但yum list 或 yum search 为什么没找到 librdkafka-devel 包的问题还是找到

追查问题并找到原因

看着yum备忘录上的命令,尝试执行yum repoinfo Confluent-Clients/x86_64命令查看repo的信息。

突然注意到了提示信息:yum 68 packages excluded due to repository priority protections

在google搜了这个报错,找到了问题的原因: yum源的优先级 —— 如果yum中多个源都包含同一个包时,它只会取最高优先级的源的包

/etc/yum.repo.d/confluent.repo添加 priority=1,设置第一优先级(priority N越大优先级越小,取值1到100)

执行 yum list librdkafka-devel-1.9.0-1.cflt.el7.x86_64.rpm1.9.0-1 版本可以找到了

.修改priorities的配置文件/etc/yum/pluginconf.d/priorities.conf,enabled=0 可以禁用priorities插件。也可以解决优先级问题 (不过我没试过)

<think> 我们想要将使用yum安装的软件包及其依赖打包成离线安装包,以便在没有互联网连接的其他机器上安装。主要步骤包括: 1. 在一台有互联网连接的机器(相同操作系统版本)上安装这些软件包,并下载所有依赖。 2. 将下载的rpm包保存到本地目录。 3. 将这个目录打包成离线包(如tar.gz)。 4. 将离线包复制到目标机器,并创建本地yum仓库。 5. 在目标机器上使用yum命令从本地仓库安装。 具体步骤如下: ### 步骤1:在有网络的机器上下载rpm包 使用`yum install`命令的`--downloadonly`和`--downloaddir`选项来下载软件包及其依赖。 ```bash # 创建目录来存储rpm包 mkdir -p /tmp/offline_packages # 使用yum下载指定软件包及其依赖(不安装yum install --downloadonly --downloaddir=/tmp/offline_packages \ readline-devel zlib-devel openssl-devel libaio-devel gcc gcc-c++ cmake ncurses-devel ``` 注意:如果提示`--downloadonly`需要插件,则先安装`yum-plugin-downloadonly`: ```bash yum install -y yum-plugin-downloadonly ``` ### 步骤2:将下载的rpm包打包 ```bash tar -zcvf offline_packages.tar.gz -C /tmp/offline_packages . ``` ### 步骤3:将打包文件复制到目标机器 使用U盘、scp或其他方式将`offline_packages.tar.gz`复制到目标机器。 ### 步骤4:在目标机器上解压并创建本地仓库 ```bash # 创建目录 mkdir -p /opt/offline_packages # 解压 tar -zxvf offline_packages.tar.gz -C /opt/offline_packages # 安装createrepo工具(如果目标机器没有网络,需要提前下载createrepo及其依赖并复制过来) # 这里假设目标机器可以临时联网,如果不能,则需要在打包时也把createrepo及其依赖打包进去。 # 注意:如果目标机器完全离线,我们需要在有网络的机器上同样下载createrepo及其依赖,并复制到目标机器安装。 # 因此,我们最好在第一步也下载createrepo的rpm包。 # 我们在第一步的机器上再下载createrepo及其依赖(如果之前没有下载): mkdir -p /tmp/offline_packages_createrepo yum install --downloadonly --downloaddir=/tmp/offline_packages_createrepo createrepo # 将createrepo目录下的rpm包也复制到/tmp/offline_packages中,然后重新打包,这样离线包中就包含了createrepo。 cp /tmp/offline_packages_createrepo/*.rpm /tmp/offline_packages/ # 重新打包 tar -zcvf offline_packages.tar.gz -C /tmp/offline_packages . # 再次复制到目标机器,并解压到/opt/offline_packages # 在目标机器上,先安装createrepo(注意:需要解决依赖,我们可以手动安装依赖,或者使用rpm命令强制安装,但推荐按顺序安装依赖) # 进入解压目录 cd /opt/offline_packages # 使用rpm安装createrepo及其依赖(注意:依赖关系可能需要手动处理,这里我们使用yum localinstall也可以,但目标机器没有yum仓库,所以使用rpm) # 我们可以使用以下命令安装所有rpm(不处理依赖,因为依赖已经下载): # 但是更好的方式是使用yum安装,因为yum可以处理本地目录的依赖关系。 # 首先,创建本地仓库 createrepo /opt/offline_packages # 如果createrepo还没有安装,那么我们需要先安装它。由于createrepo有依赖,我们可以先手动安装它的依赖,或者使用rpm命令按顺序安装(注意依赖顺序)。但是更简单的方法是,我们提前在目标机器上配置一个指向这个目录的本地yum仓库,然后使用yum安装。 # 配置本地yum仓库 cat > /etc/yum.repos.d/offline.repo <<EOF [offline] name=Offline Repository baseurl=file:///opt/offline_packages enabled=1 gpgcheck=0 EOF # 现在,我们可以使用yum安装createrepo(注意:此时yum仓库已经指向本地目录,但需要更新元数据) yum clean all yum makecache # 安装createrepo yum install -y createrepo --disablerepo=* --enablerepo=offline # 然后,重新生成仓库元数据(因为上一步安装createrepo后,才能正确执行createrepo命令) createrepo --update /opt/offline_packages # 现在,可以安装我们需要的软件包了 yum install -y readline-devel zlib-devel openssl-devel libaio-devel gcc gcc-c++ cmake ncurses-devel --disablerepo=* --enablerepo=offline ``` ### 注意事项 1. 确保打包机器和目标机器的操作系统版本和架构(如CentOS 7 x86_64)一致,否则可能不兼容。 2. 如果目标机器上已经安装了一些依赖包,可能会跳过安装,但不会影响。 3. 如果遇到依赖问题,可以在目标机器上使用`yum`命令时加上`--nogpgcheck`选项。 ### 简化步骤(如果目标机器无法安装createrepo) 如果目标机器无法安装createrepo(例如没有网络且无法通过上述方法安装),我们可以在一台相同环境的机器上创建好仓库(包括repodata目录),然后将整个目录复制到目标机器,并配置本地仓库。 具体步骤: 1. 在打包机器上,下载所有软件包(包括createrepo)到`/tmp/offline_packages`。 2. 在打包机器上安装createrepo(联网安装),然后使用`createrepo`命令生成仓库元数据: ```bash createrepo /tmp/offline_packages ``` 3. 将整个目录打包(包括repodata目录): ```bash tar -zcvf offline_packages.tar.gz -C /tmp/offline_packages . ``` 4. 复制到目标机器,解压到`/opt/offline_packages`。 5. 在目标机器上配置本地仓库(如上述`/etc/yum.repos.d/offline.repo`)。 6. 然后直接安装软件包(无需再安装createrepo): ```bash yum install -y readline-devel zlib-devel openssl-devel libaio-devel gcc gcc-c++ cmake ncurses-devel --disablerepo=* --enablerepo=offline ``` 这样,目标机器无需安装createrepo,因为仓库元数据已经在打包机器上生成好了。 ### 验证 在目标机器上执行安装命令后,可以通过`rpm -qa`查看是否安装成功。 ### 总结 以上方法将yum安装的软件及其依赖打包成离线仓库,适用于内网环境的批量部署。 §§相关问题§§ 1. 如何在没有yum的情况下安装rpm包并解决依赖? 2. 如何为不同的Linux发行版(如Ubuntu)制作离线安装包? 3. 如何更新离线仓库中的软件包? </think>要将通过 `yum install` 安装的软件打包成离线安装包并部署到其他机器,需经过以下步骤: --- ### 一、在联网机器创建离线包 #### 1. 下载所有依赖的 RPM 包 ```bash # 创建存放目录 mkdir -p /tmp/offline_packages # 下载软件及所有依赖(不安装yum install --downloadonly --downloaddir=/tmp/offline_packages \ readline-devel zlib-devel openssl-devel libaio-devel \ gcc gcc-c++ cmake ncurses-devel ``` #### 2. 生成仓库元数据 ```bash # 安装createrepo工具 yum install -y createrepo # 生成仓库元数据 createrepo /tmp/offline_packages ``` 此时目录结构如下: ``` /tmp/offline_packages ├── *.rpm # 所有RPM包 └── repodata # 元数据目录 ├── repomd.xml └── ...其他元数据文件 ``` #### 3. 打包离线仓库 ```bash tar -czvf offline_repo.tar.gz -C /tmp/offline_packages . ``` --- ### 二、在离线机器安装 #### 1. 传输并解压离线包 ```bash # 复制离线包到目标机器 scp offline_repo.tar.gz user@offline-machine:/tmp # 在目标机器解压 mkdir -p /opt/local_repo tar -xzvf /tmp/offline_repo.tar.gz -C /opt/local_repo ``` #### 2. 配置本地YUM仓库 ```bash cat > /etc/yum.repos.d/local.repo <<EOF [local-repo] name=Local Offline Repository baseurl=file:///opt/local_repo enabled=1 gpgcheck=0 EOF ``` #### 3. 清理缓存并安装 ```bash # 清理旧缓存 yum clean all # 安装软件包 yum install -y --disablerepo=* --enablerepo=local-repo \ readline-devel zlib-devel openssl-devel libaio-devel \ gcc gcc-c++ cmake ncurses-devel ``` --- ### 关键注意事项 1. **系统一致性** 打包机器和目标机器必须使用**相同操作系统版本和架构**(如 CentOS 7 x86_64),否则会出现兼容性问题[^1]。 2. **依赖完整性** 使用 `yum deplist <package>` 验证依赖: ```bash yum deplist gcc-c++ | grep provider ``` 3. **安装验证** 检查是否安装成功: ```bash rpm -qa | grep -E 'gcc-c++|cmake|openssl-devel' ``` --- ### 常见问题解决 - **报错:`No package available`** 检查 `local.repo` 中路径是否正确,确保 `file://` 后跟**绝对路径**。 - **报错:`Error: Unable to find a match`** 确认打包机器已包含所有依赖,可通过以下命令补全: ```bash yum reinstall --downloadonly --downloaddir=/tmp/offline_packages \ $(ls /tmp/offline_packages/*.rpm | xargs rpm -qp --requires | awk '{print $1}' | sort -u) ``` > **效率提示**:对于多台机器部署,可将 `/opt/local_repo` 设为NFS共享目录,避免重复复制离线包[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值