ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CentOS 6.5 用 createrepo 搭建本地 yum 源:离线环境依赖安装的完整配置

CentOS 6.5 用 createrepo 搭建本地 yum 源:离线环境依赖安装的完整配置 1. CentOS 6.5 离线装依赖为什么总卡在 yum 上如果你手里有一台 CentOS 6.5 的机器跑在内网或者虚拟机里没有外网出口那么你大概率遇到过这个场景想装一个 gcc、想补一个 libaio、想装个 lrzsz 传文件结果yum install一敲下去屏幕上转半天最后甩给你一句Could not retrieve mirrorlist或者Cannot find a valid baseurl for repo: base。这不是你命令写错了而是 CentOS 6.5 默认的 yum 源指向的是公网 mirrorlist机器出不去自然什么都拉不到。CentOS 6.5 这个版本比较特殊它自带的 yum 源配置里用的是mirrorlist而不是固定的baseurl而且 6.x 系列早已停止维护公网上的 mirror 地址很多已经失效。所以哪怕你临时能连外网也可能因为 mirror 列表过期而失败。真正稳妥的做法是把 CentOS 6.5 的安装 DVD 镜像挂载到本地用里面的 rpm 包自己建一个本地 yum 源让 yum 从本地目录读取元数据。这样无论机器是否联网依赖安装都能正常走完。createrepo 就是干这件事的核心工具。它的作用是扫描一个装满 rpm 包的目录为这些包生成 repodata 元数据包括 primary、filelists、other 以及 sqlite 数据库yum 读取这些元数据后就能像访问远程仓库一样在本地完成依赖解析和安装。简单说createrepo 把一堆散落的 rpm 文件变成了一个「yum 认识的仓库」。这套方案适合谁适合所有在隔离网络里维护 CentOS 6.5 机器的运维和开发尤其是那些还在跑老业务、不能随便升级系统的环境。下面我从头到尾把整个流程拆开每一步都给可复制的命令最后用yum list和一次真实的离线安装来验证。2. 前置准备createrepo 从哪来、目录怎么规划在动手之前先把两件事理清楚createrepo 这个工具本身怎么装以及 rpm 包放在哪个目录。CentOS 6.5 默认是不带 createrepo 的你直接敲createrepo会提示 command not found。但好消息是CentOS 6.5 的安装 DVD 里已经集成了 createrepo 的 rpm 包就在 Packages 目录下。所以整个流程是自洽的先用 DVD 里的 createrepo 包手动 rpm 安装再用它去给 DVD 里的其他包建仓库。先确认系统版本和架构这一步别省因为 32 位和 64 位的包不能混用uname -m cat /etc/centos-release输出应该是i686或x86_64以及CentOS release 6.5 (Final)。记住你的架构后面拷包和选 comps 文件都要对应。配置本地源要改/etc下的文件、要在根目录建目录所以切到 rootsu -接下来规划目录。我习惯在根下建一个专门放 rpm 的目录你也可以自定义但后面 baseurl 要跟着改。这里用/yumloadmkdir /yumload cd /yumload pwd然后把安装介质挂载上。CentOS 6.5 通常是两张 DVDDVD1 和 DVD2。挂载命令mkdir -p /media/CentOS_6.5_Final mount -o loop /path/to/CentOS-6.5-x86_64-bin-DVD1.iso /media/CentOS_6.5_FinalDVD2 同理挂到另一个目录比如/media/CentOS_6.5_Final_DVD2。挂载好之后把两张盘 Packages 目录下的 rpm 全部拷到/yumloadcp /media/CentOS_6.5_Final/Packages/*.rpm /yumload/ cp /media/CentOS_6.5_Final_DVD2/Packages/*.rpm /yumload/拷完数一下数量两张 DVD 加起来大概 4800 多个包ls /yumload/*.rpm | wc -l这里有个坑要提前说DVD1 和 DVD2 里可能有同名但不同版本的包直接cp会提示是否覆盖。如果你确定要保留哪张盘的版本加-n跳过已存在的或者干脆分目录存放再合并。我一般直接覆盖因为 DVD2 通常是补充包同名情况不多。createrepo 的 rpm 包就在 DVD1 的 Packages 里先把它单独找出来装上rpm -ivh /yumload/createrepo-0.9.9-18.el6.noarch.rpm如果提示缺少依赖比如python-deltarpm、deltarpm之类就从/yumload里把对应包找出来依次装上顺序是底层依赖在前。装完后which createrepo能定位到路径就说明成功了。3. 可复制配置生成 repodata 并写 yum 源文件工具就位、包也拷齐了现在进入核心步骤用 createrepo 生成元数据然后写 yum 的 repo 配置文件。生成仓库元数据createrepo /yumload/这个过程会扫描全部 rpm包多的时候要等一会儿。想看到进度可以加-vcreaterepo -v /yumload/执行完你会看到类似这样的输出Spawning worker 0 with 4802 pkgs Workers Finished Gathering worker results Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete看到Sqlite DBs complete就说明 repodata 生成好了。此时/yumload/repodata/目录下会出现repomd.xml、primary.xml.gz、filelists.xml.gz、other.xml.gz以及对应的 sqlite 数据库文件。这些就是 yum 要读的元数据。接下来写 yum 源文件。在/etc/yum.repos.d/下新建一个以.repo结尾的文件名字随意比如local.repovi /etc/yum.repos.d/local.repo内容如下[local-centos65] nameCentOS 6.5 Local Repo baseurlfile:///yumload/ enabled1 gpgcheck0这里几个关键点baseurl用的是file://协议后面跟绝对路径注意是三个斜杠——file://加/yumload/少一个斜杠 yum 会报 URL 解析错误。gpgcheck0是因为本地自建源没有导入 GPG 公钥关掉校验避免报错如果你有官方 key 也可以设成 1 并配gpgkey。enabled1表示启用。如果你还想让yum grouplist能列出软件包组比如「Development tools」这种需要把 DVD1 里 repodata 目录下的 comps 文件加载进来。先找到这个文件ls /media/CentOS_6.5_Final/repodata/*comps*.xmlCentOS 6.5 的 comps 文件名类似c6-x86_64-comps.xml架构部分要和你的系统对应。然后用-g参数重新生成仓库createrepo -g /media/CentOS_6.5_Final/repodata/c6-x86_64-comps.xml /yumload/注意这一步会重新生成 repodata覆盖之前的。执行完 group 信息就写进去了。最后清理并重建 yum 缓存让新源生效yum clean all yum makecacheyum clean all会清掉旧的缓存和元数据yum makecache会从本地源重新下载其实是读取元数据并缓存。看到Metadata Cache Created就说明缓存建好了。4. 验证请求yum list 与一次真实离线安装配置写完不算完必须验证。验证分两层先确认 yum 能识别本地源再实际装一个包看依赖能不能解析。第一层列出仓库和可用包yum repolist正常输出里应该能看到local-centos65这个仓库并且包数量是几千。如果 repolist 里没有你的仓库或者包数量是 0说明 repo 文件或 baseurl 有问题。再列一下具体包yum list | head -20 yum list available | wc -lyum list能输出内容说明 yum 已经成功读取了本地 repodata。如果这里报Cannot find a valid baseurl回去检查file:///yumload/的斜杠数量和目录权限。验证 group 信息yum grouplist只要有输出比如列出Development tools、Base等组名就说明 comps 加载成功。第二层做一次真实的离线安装。挑一个体积小、依赖清晰的包比如lrzsz提供 sz/rz 传文件命令或者treeyum install -y lrzsz观察输出yum 会先从local-centos65仓库解析依赖列出要安装的包和依赖包然后从本地读取 rpm 安装。整个过程不需要任何网络请求。装完验证which sz rpm -q lrzsz能定位到命令、rpm 查询有版本号就说明离线安装链路完全打通了。如果你想更彻底地验证依赖解析能力可以装一个依赖稍多的包比如gccyum install -y gccgcc 会拉入cpp、glibc-devel、kernel-headers等一串依赖如果这些都能从本地源自动解析并安装成功说明你的本地 yum 源已经可以承担日常离线装依赖的任务了。5. 本篇常见错排查401、local proxy failed、reading choices 等搭建过程中最容易撞上的几个报错我按实际遇到的频率列一下对照着排查。报错一Cannot find a valid baseurl for repo: local-centos65这是最常见的。原因通常是 baseurl 写错。检查三点协议是不是file://路径是不是绝对路径斜杠是不是三个。正确写法file:///yumload/错误写法file://yumload/两个斜杠会被当成主机名、file:/yumload/一个斜杠协议不完整。另外确认/yumload/repodata/repomd.xml这个文件真实存在。报错二Error: Cannot retrieve repository metadata (repomd.xml) for repository说明 yum 找到了仓库地址但读不到 repomd.xml。要么是 createrepo 没跑成功要么是 repodata 目录权限不对。先ls /yumload/repodata/看文件在不在再chmod -R 755 /yumload放开权限。报错三local proxy failed或Couldnt resolve proxy这个通常出现在你之前配过全局代理yum 继承了代理设置。检查/etc/yum.conf里有没有proxy行有就注释掉。同时检查环境变量env | grep -i proxy如果有http_proxy、https_proxy临时 unset 掉再试。本地 file 源根本不需要代理代理反而会拦截请求。报错四Error: rpmdb open failed或reading choices相关错误rpmdb open failed一般是 rpm 数据库被锁或损坏先确认没有其他 yum/rpm 进程在跑ps aux | grep -E yum|rpm有就等它结束或杀掉。如果数据库损坏可以rm -f /var/lib/rpm/__db*后rpm --rebuilddb重建。至于reading choices这类提示多半是 comps 文件架构不匹配比如你系统是 x86_64 却加载了 i386 的 comps回去用uname -m确认架构选对 comps 文件重新createrepo -g。报错五Package xxx already installed但你想重装这不是错误是 yum 的正常提示。想强制重装用yum reinstall -y xxx或者先rpm -e卸载再装。报错六createrepo 执行到一半卡住或报Worker failed包数量太多、内存不够时可能发生。可以分批建仓或者加--workers 1降低并发createrepo --workers 1 /yumload/排查完这些基本没有过不去的坎。核心思路就一条yum 读不到东西先看 repodata 在不在、baseurl 对不对、权限够不够。6. 后续维护与扩展让本地源长期可用本地源建好只是开始后面还有几件事值得做能让它长期稳定服务。第一把挂载和建仓做成脚本。每次重启后 loop 挂载会失效但/yumload里的 rpm 和 repodata 是持久的所以其实不需要重新挂载也能用。但如果你要更新包就得重新挂载 DVD、拷新包、重新 createrepo。写个脚本#!/bin/bash set -e mount -o loop /path/to/DVD1.iso /media/CentOS_6.5_Final cp -n /media/CentOS_6.5_Final/Packages/*.rpm /yumload/ createrepo -g /media/CentOS_6.5_Final/repodata/c6-x86_64-comps.xml /yumload/ yum clean all yum makecache echo local repo updated第二如果你有多台 CentOS 6.5 机器不必每台都拷一份 rpm。可以在其中一台上把/yumload通过 HTTP 暴露出去其他机器用baseurlhttp://内网IP/yumload/指向它。用 Python 自带的 http.server 就能起cd /yumload python -m SimpleHTTPServer 80注意 CentOS 6.5 的 Python 是 2.x模块名是SimpleHTTPServer。其他机器的 repo 文件改成 HTTP 地址即可这样一台机器维护源多台共享。第三定期检查 repodata 和 rpm 是否一致。如果你手动往/yumload里加了新 rpm必须重新跑createrepo /yumload/否则 yum 看不到新包。可以加--update参数做增量更新速度快很多createrepo --update /yumload/第四关于 gpgcheck。生产环境如果在意包完整性建议导入 CentOS 6.5 的 GPG key 并开启校验。key 在 DVD 的RPM-GPG-KEY-CentOS-6文件里导入命令rpm --import /media/CentOS_6.5_Final/RPM-GPG-KEY-CentOS-6然后 repo 文件里gpgcheck1、gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6。不过内网自建源通常关掉校验图省事看你的安全要求。这套本地源方案我在好几台隔离环境的 CentOS 6.5 上用过从建仓到装 gcc、装 Python 开发头文件全程不碰外网。唯一要注意的是 CentOS 6.5 太老新一点的软件包 DVD 里没有需要你自己找 rpm 丢进/yumload再createrepo --update。把这一步跑通离线装依赖就不再是问题了。
返回列表