ARTICLE DETAIL

资讯详情

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

麒麟V10离线环境本地yum源搭建与避坑实践

麒麟V10离线环境本地yum源搭建与避坑实践 搞过Linux服务运维的人应该都懂内网环境装软件有多痛苦。尤其手里拿的是麒麟V10这种国产系统外网源连不上、光盘自带包不全、U盘拷包又老是缺依赖装个东西能折腾一下午。今天这篇直接把“本地yum源”这件事讲透从光盘挂载、repo文件编写、createrepo建索引到离线RPM包仓库搭建全部走一遍实操流程附带我踩过的坑和排查命令。不管你用的是x86服务器、ARM架构的泰山机器还是刚把麒麟V10装进虚拟机的测试环境这套方法都能直接套用。1. 内容整体设计与思路拆解1.1 为什么麒麟V10需要单独搭本地yum源先回答一个最基础的问题系统装好了为什么不能用自带的源直接装东西关键在于麒麟V10默认配置的yum源指向的是互联网仓库而实际生产环境里服务器往往放在隔离的内网区域根本访问不到外网。就算能访问麒麟V10基于上游Lance版本CentOS 8的麒麟化版本做了大量包替换和适配直接用CentOS 7的老源硬上大概率会遇到依赖不匹配、GPG密钥校验失败、包版本冲突等问题。我见过不少同事一开始图省事把CentOS 7的阿里云源替换进去结果装gcc的时候拉进来一堆旧版glibc把系统搞崩了。麒麟V10这种发行版最好的方式就是用自己的镜像包做成本地源这样RPM包的版本、依赖关系、GPG密钥全部对得上出问题的概率大幅降低。本地yum源解决的另一个问题就是依赖链断裂。在线环境装软件时yum会自动从远程仓库拉取所有依赖包。离线环境下如果你只是手动rpm -ivh一个包十有八九会提示“需要 libxxx.so.1()(64bit)”这种错误然后你就开始陷入“下依赖、装依赖、再报新依赖”的死循环。而本地yum源本身就是一个包含完整依赖关系的仓库只要DVD镜像里有的包yum就能自动处理依赖顺序一次性装完。1.2 核心原理yum、repo仓库与createrepo之间的协作关系要把本地源玩明白得先搞清楚yum这套机制到底是怎么工作的。yum在RHEL8/麒麟V10 SP3上实际是dnf后端就是包管理器前端它在安装软件前会读取/etc/yum.repos.d/目录下所有.repo配置文件这些文件告诉包管理器“仓库在哪里”。本地源就是file://协议指向的本地目录、光盘挂载点或已同步的RPM包目录。repo仓库的本质是一堆RPM包加上两个关键的元数据文件repomd.xml是仓库的“总入口”记录了文件校验和、时间戳等信息primary.xml.gz包含每个RPM包的名称、版本、依赖关系列表。这些元数据通过createreap工具生成。当你执行yum install时包管理器会先下载或读取repomd.xml解析依赖树再决定从仓库中拉取哪些包。明白这个逻辑之后搭建本地yum源其实就变成了三个步骤准备一批RPM包、用createrepo生成元数据、写好.repo配置文件指向这些包。无论是光盘仓库、目录仓库还是增量更新的临时仓库本质都是同一套流程。1.3 方案选型光盘源、目录仓库与网络内网源的适用场景在正式动手之前先梳理一下不同场景下该选什么方案。我建议你根据自己拿到的资源来定不要一上来就刻盘。方案A光盘/镜像挂载源。麒麟V10提供了完整的DVD ISO镜像里面自带的包覆盖了大部分基础需求。这个方案最省事——只需要把ISO挂载到某个目录写一个指向挂载点的.repo文件直接就能用。缺点是包数量不如完整源多且每一台上游机器都需要单独挂载。适用场景单机部署、虚拟机测试、快速应急。方案B目录树仓库Rsync/挂载后复制。如果有多台服务器要共用同一个源就不适合让每台机器都去挂光盘。可以把光盘里的Packages目录完整复制到一台文件服务器的某个路径下用createrepo建立索引再通过NFS或HTTP共享出去。适用于内网有文件服务器、多台服务器统一管理源。方案C自建RPM包目录仓库。这种方式最灵活也是我强烈推荐的一种场景化做法。你平时可能从各种渠道收集了一些RPM包U盘、同事拷贝、离线下载这些包杂七杂八地放在一个目录里没有统一的依赖关系。这时候只需要执行一次createrepo这个普通目录就“进化”成了标准yum仓库。后续往里丢新包后再执行一次createrepo --update增量更新即可。适用于开发环境积累的散装包、无法获得完整镜像时的补救。本篇以麒麟V10 SP3 Lance版本为例主要覆盖方案A和方案C并穿插方案B的简要思路。为什么用SP3因为当前新装机器多数为此版本且其dnf/yum行为与上游CentOS8更接近踩坑代码也更具参考性。2. 核心细节解析与实操要点约1400字2.1 repo文件里的关键参数逐一拆解先看一个标准的本地yum源.repo文件长什么样。以Kylin V10 SP3为例通常在/etc/yum.repos.d/目录下新建一个local.repo内容如下[kylin-local] nameKylin Linux V10 SP3 Local Repository baseurlfile:///mnt/kylin enabled1 gpgcheck0这个文件和挨个部分都要能解释清楚。[kylin-local]是仓库ID全系统必须唯一重复会导致yum源冲突name只是描述信息起什么名字随意baseurl指向仓库的实际路径注意file://后面跟绝对路径路径写错是最常见的问题enabled1表示启用该仓库如果设置成0yum就会直接忽略它。关键在gpgcheck参数。生产环境通常建议设置成1并指定gpgkey路径但在本地源场景下我建议先设成0。理由非常现实麒麟V10的光盘镜像里虽然带了RPM-GPG-KEY文件但在某些SP版本中包的GPG签名格式与导入KEY的方式存在兼容问题经常会遇到“公钥不可用”导致安装失败。在安全要求不高的内网离线环境先关闭GPG校验保证源能流畅运行后续如果强制要求审计再把gpgcheck打开并正确导入KEY两种方式都验证过触发问题的原因和判断思路会在第4节详细展开。当有多个源存在时yum会根据priority如果安装了yum-plugin-priorities优先选择数值小的仓库没有插件时按仓库ID顺序尝试。实测中系统默认自带的kylin_x86_64.repo或kylin_arm64.repo指向外网如果你不想让它干扰本地源最干净的做法是把它改名为.repo.bak这样就不会再去连外网超时了。2.2 为什么光盘挂载不能直接写进fstab就算了很多教程会把ISO挂载步骤直接写成“mount -o loop xxx.iso /mnt/kylin”这确实没错但背后有几个容易被忽略的细节。挂载前先检查系统里有没有loop设备支持。现代内核默认开启了loop设备但老内核或精简内核可能没有。如果没有你会在挂载时直接报“mount: /mnt/kylin: mount failed: Operation not permitted”。解决办法是确认内核是否加载了loop模块或换用解压ISO内容到目录的方式。另一个大坑是光盘挂载的“只读”特性。挂载点默认就是只读的你不能往里面放新包。这个问题不影响直接用光盘源因为它本身就是一个全量仓库但如果你想在光盘源基础上补充额外的软件包就必须想别的办法。一般我是把光盘里的Packages目录整个复制到本地磁盘再在磁盘上建附加仓库。这一步也顺便解决了某些老旧机器光驱读取不稳定、yum安装到一半I/O报错的问题。关于是否写入/etc/fstab实现开机自动挂载我的观点是如果这台机器是长期运行的源服务器建议写入。但如果只是临时用来装个包就不必了卸载时一条umount干干净净。fstab里写错了格式会导致开机脚本挂载失败甚至系统无法启动风险收益不划算。2.3 离线包装进目录源之后必须重新生成索引吗这一步是很多人翻车的地方。他们把一堆RPM包扔进目录直接改repo指向这个目录然后执行yum install结果报错“找不到软件包”。原因很简单这个目录还没有生成repodata目录yum根本没有可用的依赖元数据。生成元数据需要createrepo这个工具。在麒麟V10上这个工具可能预装了也可能没有。如果执行createrepo --version发现命令不存在可以先从光盘源装一次。yum install -y createrepo如果连光盘源都还没配好就用系统自带的最小化仓库临时装或者直接用rpm包手动安装。目录仓库建好索引后每次新增了RPM包必须重新执行createrepo --update否则yum读取的还是旧索引新包永远不会出现在可安装列表里。这个问题我在实践里踩过起初以为yum会像在线源一样自动刷新结果测试了很多遍都找不到新包后来查文档才知道元数据必须手动更新。2.4 麒麟V10 SP3与CentOS8在本地源配置上的差异点虽然麒麟V10 SP3整体上游对齐RHEL8/CentOS8但在本地源配置上有个显著区别dnf命令在麒麟V10上通常也能用但yum命令依然以兼容模式保留。两者共用/etc/yum.repos.d配置所以写了.repo文件后用yum和dnf效果是一样的。另一个差异点在于arch。麒麟V10同时提供x86_64和aarch64两个架构的镜像包repo文件里的baseurl路径如果写错架构目录会出现“No match for argument”的问题。比如在ARM机器上配了x86_64的路径rpm包扫描时一个也匹配不上。尤其是如果你手动复制ISO中的rpm目录务必看清楚是Packages还是Packages-aarch64之类带后缀的目录名。3. 实操过程与核心环节实现3.1 环境准备与初始检查在动手配置之前先花两分钟确认环境信息避免后续版本不匹配造成的麻烦。建议执行的检查命令如下# 检查系统版本 cat /etc/os-release # 查看内核架构 uname -m # 确认yum可用 yum --version # 查看默认仓库配置 ls /etc/yum.repos.d/如果/etc/os-release显示版本为V10 SP3架构输出是x86_64或aarch64yum命令能够正常反馈版本就可以继续了。架构检查尤其重要ARM机器和x86机器的repo配置完全不一样如果在这里就搞混了后面配出来的源很可能识别不到任何软件包。接下来是目录准备。我个人习惯统一放在/data/yum这样的独立分区下而不是/mnt下。原因很简单/mnt是临时挂载点系统重启后会被清理/data分区通常空间更大而且如果以后要扩展到几百GB的RPM包库不会受根分区容量限制。如果根分区紧张把仓库目录放到根分区会有写满/的风险。mkdir -p /data/kylin_iso mkdir -p /data/kylin_rpms mount -o loop /opt/KylinV10SP3.iso /data/kylin_iso3.2 光盘源安装过程实录拿到ISO文件后把它放到/opt目录下然后执行挂载。如果ISO是从Windows系统拷贝过来的建议先校验一下md5防止文件损坏导致挂载后包列表不完整。麒麟官方通常在下载页会附带SHA256校验值这一步别省。md5sum /opt/KylinV10SP3.iso mount -o loop /opt/KylinV10SP3.iso /data/kylin_iso ls /data/kylin_iso/Packages | head看到Packages目录里有大量rpm包文件说明挂载正常。然后备份原有仓库配置并新建local.repocd /etc/yum.repos.d/ mkdir backup mv *.repo backup/注意直接把系统自带的repo文件全部移动到了backup目录这样yum在扫描时只认我们新建的local.repo不会再花大量时间去尝试连接外网导致超时。这一步看似粗暴但在离线内网环境下是最高效的。然后写入local.repocat /etc/yum.repos.d/local.repo EOF [kylin-local] nameKylin Linux V10 SP3 Local Repo baseurlfile:///data/kylin_iso enabled1 gpgcheck0 EOF最后清理缓存并验证yum clean all yum makecache yum list | head -20如果能看到一长串软件包名称说明源已经生效了。此时安装软件就非常简单了例如安装编译器工具链yum install -y gcc make整个过程走下来唯一可能需要等待的时间就是makecache构建缓存的那一会儿。光盘源的好处就在这几百MB的元数据读一遍就完了后续安装是纯本地磁盘I/O速度飞快。3.3 新建RPM包目录仓库并生成索引散装RPM包目录仓库的搭建也是一类高频需求。比如你从内网FTP下载了一批包放入/data/kylin_rpms现在想让yum能自动处理依赖关系安装它们cd /data/kylin_rpms createrepo .如果createrepo未安装先临时用光盘源把createrepo装上。这一步生成的新目录是/data/kylin_rpms/repodata里面有repomd.xml、primary.xml.gz等文件。然后新建另外一个.repo文件比如/etc/yum.repos.d/local-rpms.repo[kylin-rpms] nameKylin Extra Local RPMs baseurlfile:///data/kylin_rpms enabled1 gpgcheck0执行yum repolist此时应该能看到两个仓库一个是光盘源kylin-local一个是自建包仓库kylin-rpms。两个源同时启用时yum会自动在两个仓库间进行依赖搜索和匹配。这个方法非常适合“离线汇总包”场景。比如同事给你拷贝了一堆rpm包你扔进目录重建索引再也不用手动rpm -ivh一个个试依赖了。后续新拿到一批包重复执行cp *.rpm /data/kylin_rpms/ createrepo --update /data/kylin_rpms即可增量更新索引不需要全量重建。这里要特别提一句--update是按目录来更新的如果当前目录就是仓库根目录直接createrepo --update .好处是速度快缺点是它只检查新增包不会重新校验旧包的校验和所以如果之前有包损坏通过--update是发现不了的。3.4 常见问题与排查技巧实录下面是长期实践遇到的高频问题速查表现象排查思路解决方案yum install报错“没有可用软件包”仓库元数据没生成或路径不对检查repodata目录是否存在执行createrepo重建索引yum一直在连接外网导致长时间卡住系统自带repo没有禁用把/etc/yum.repos.d/下其他repo文件改名.bak安装包时提示GPG公钥不可用GPG密钥未导入或时间不同步本地源可临时gpgcheck0挂载ISO时提示设备没有loop内核未加载loop模块modprobe loop后重试或使用拷贝目录方式createrepo: command not found新环境缺少工具先临时配置光盘源yum install -y createrepobaseurl路径写错导致file://目录不存在yum会报“Failed to synchronize cache”ls核对路径确保目录存在且包含Packages每个问题都建议按表格里的思路逐层排查不要一上来就怀疑是repo文件格式问题。70%的本地源故障都由路径错误、未生成索引、原repo未禁用三大原因引起。3.5 隐藏的坑多源混合时的优先级和冲突当你同时启用光盘源和目录仓库两个源时可能会遇到rpm包版本冲突。比如光盘里nginx版本是1.14自建目录仓库里有个nginx 1.20yum安装时默认会挑选版本号更高的那个包这可能不是你想装的那个。此时可以给优先级插件或者repos配置文件里手动指定仓库ID强制安装版本yum install -y nginx --disablerepokylin-rpms或者反过来如果你想装的新版只存在于自建仓库安装时把光盘源禁用yum install -y nginx --disablerepokylin-local还有一个极少被提到的坑当repo文件写完后如果发现yum makecache报错提示repomd.xml文件解析失败而你能看到这个文件确实存在大概率是文件的owner或权限不对。把仓库目录权限统一改成755文件权限644通常能解决。4. 长期维护和更新技巧源搭好不是终点后续的维护才是关键。很多人的本地源跑了一段时间后莫名其妙装不了新包原因往往是源服务器上磁盘满了导致createrepo --update执行失败但yum提示的报错信息是“仓库索引损坏”。遇到这个问题先看磁盘df -h /data清理完空间后删除repodata目录重新执行createrepo全量重建。全量重建虽然慢但能同时修复索引中所有隐藏的校验和问题。另一个维护重点是把源做成定时增量任务。比如我有一台专门存放RPM包的共享服务器每天凌晨从某个同步目录把新的rpm增量copy进去再触发一次createrepo --update。crontab里加一条就搞定30 2 * * * /usr/bin/createrepo --update /data/kylin_rpms /dev/null 21如果有多台服务器共用同一个源目录建议通过NFS或HTTP方式共享仓库目录。使用HTTP方式共享时repo文件里的baseurl就变成了http://192.168.1.10/yum/kylin_rpms。用nginx或Apache做一个静态目录映射即可。HTTP方式比NFS的优势是跨网段时更稳定而且不用在客户端做mount认证缺点是需要额外维护一个web服务进程。5. 从零到一的完整避坑路线图实战重演这部分会用一台全新的麒麟V10 SP3虚拟机回放一遍完整操作重点标注新手容易停顿的时间点。假设你刚装好系统网络是隔离的手头有一份KylinV10SP3.iso镜像x86_64版。第一步把镜像通过SCP或U盘拷贝到服务器/opt目录下校验好hash。然后mkdir -p /data/kylin_iso mount -o loop /opt/KylinV10SP3.iso /data/kylin_iso注意如果你的系统字体/终端不支持中文字符挂载ISO后看到的目录名可能是乱码这只是一个终端显示问题不影响实际使用。如果有人跟你说需要特殊编码处理那基本不靠谱直接忽略即可。接着备份默认repo写入local.repo执行makecachecd /etc/yum.repos.d/ mkdir -p backup mv *.repo backup/ cat local.repo EOF [kylin-local] nameKylin Local baseurlfile:///data/kylin_iso enabled1 gpgcheck0 EOF yum clean all yum makecache跑完makecache后务必执行一次yum list | wc -l看到返回的包数量在几千以上才说明源匹配成功。如果返回零优先检查挂载点目录下有没有Packages子目录以及目录内容是否为空。此时你已经拥有了一个完全离线的本地yum源。在此基础上安装常用工具链yum install -y vim wget net-tools lsof如果还需要安装开发工具组可以用yum groupinstall -y Development Tools整个过程一旦跑通就完全不需要外网了。这也是我搭建内网服务器环境时生产力最高的方案。如果你还需要维护自建的散装rpm目录仓库重复第3.3节的操作即可。两个仓库可以并存互不干扰。6. 最后聊聊几个实际操作中的体会6.1 能用镜像包就别手搓目录仓库我见过一些一线运维为了图方便把同事U盘里拷来的一堆rpm包直接当yum源挂了出来结果没做createrepo装包时仍然报依赖缺失。手搓目录仓库要付出额外的整理成本且依赖链可能不完整。如果有官方ISO光盘镜像优先用光盘源散装rpm仓库更适合作为补充而不是主力。6.2 不要迷信gpgcheck1尤其是离线环境有些要求严格的场合强制需要gpgcheck1那就导入官方密钥再开启。但很多时候审计只是问一句“有没有验签”并不会真的逐包验证。内网离线环境里包来源本身已被控制gpgcheck0带来的收益远大于风险。但如果你把源开放给其他同事用还是建议开启校验避免混入来源不明的包。6.3 关于“麒麟V10 sp3 lance版本服务器版本镜像包”这类搜索关键词很多人在找麒麟V10 SP3 Lance版本镜像包下载地址。我这里不推荐任何具体下载渠道但可以告诉你判断镜像是否正确的方法打开ISO后查看根目录下的.buildinfo或版本文件里面会标注版本号和Lance标识另外也可以用系统命令验证安装后的版本cat /etc/kylin-release如果系统里有Kylin Linux V10 SP3字样就能确定大版本无误。Lance属于SP3内的具体开发代号有些镜像不直接展示在release文件里但安装源不会受影响。6.4 热心提醒统一用yum还是dnf别混用麒麟V10 SP3环境下yum命令和dnf命令共用一份缓存和repo配置不会冲突。但我建议你在脚本和文档中保持统一别一会在脚本里写yum一会儿写dnf。虽然底层实际是同一个dnf代码路径混用时日志排查会绕一些弯路。我在自动化部署脚本里一直用yum因为麒麟V10里yum命令兼容层做得足够好没遇到过需要切换到dnf解决的问题。6.5 源搭好之后的性能调优如果这是台配置比较低的测试机执行yum makecache或安装大型包时CPU占用会比较高可以在repo文件里加一个minrate参数限制yum的磁盘缓存IO优先级不过实际使用中影响并不大。真正值得做的是在大批量安装前先yum makecache生成好本地缓存再yum install这样安装过程中不会因为边构建缓存边解包导致I/O抖动。最后再分享一个小技巧当你需要在内网新机器上快速复用这套配置时不要手动一步步打字直接把整个仓库目录包括repodata和local.repo文件打包用SCP拷到新机器上解包后执行yum clean all yum makecache就全部生效了。我每次批量交付服务器都用这个办法比逐台操作快得多而且仓库结构完全一致后续维护成本低不少。
返回列表