ARTICLE DETAIL

资讯详情

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

Ubuntu安装yum与本地yum源搭建:apt换源到RPM仓库实践

Ubuntu安装yum与本地yum源搭建:apt换源到RPM仓库实践 1. 先搞清楚 Ubuntu 与 yum 的关系Ubuntu 装 yum 这件事第一次听的人多半会皱眉头——apt 用得好好的为什么非要塞一个 RPM 体系的东西进来。但实际工作中确实会碰到这种需求比如内网里要搭一个给 CentOS 7、Rocky 9 用的本地 centos7本地yum源手边只有 Ubuntu 机器又或者交接过来的运维脚本里写死了yum install你想在本机先跑通逻辑再或者纯粹是想搞明白 Linux 两大包管理体系的边界在哪。所以下面这套流程我会把yum 的安装、Ubuntu 源的更新、本地 yum 源的搭建三条线放在一起讲透从原理到命令一条条来。这篇文章面向的是用过几天 Linux、能自己敲命令但没深究过包管理机制的人也兼顾刚接触 ubuntu安装教程 的新手。需要提前说明的是Ubuntu 上装 yum 能用但它不是让你拿来当主力包管理器的真正有价值的场景是把它当成一个「RPM 生态的客户端工具」来用。我把话说在前面省得你装完发现yum install httpd报一堆依赖错回头骂我。1.1 两套包管理体系到底差在哪要解释为什么会有「在 Ubuntu 上装 yum」这种看起来拧巴的操作得先把底层差异掰开。Linux 发行版按包格式分成两大阵营Debian/Ubuntu 系走.deb用 dpkg 作为底层工具、apt 作为上层管理器RHEL/CentOS/Rocky/AlmaLinux/Fedora 系走.rpm底层是 rpm上层早期是 yum、现在是 dnf。apt 和 yum 解决的是同一类问题——自动处理依赖、从远程仓库拉包、维护本地已安装包的数据库——只是各自的实现和配置方式完全不同。用一个生活化的类比.deb和.rpm就像两种不同规格的插头肉眼看功能一样插上去就是不通电。包管理器就是帮你找插头、配转接头的那个师傅师傅手艺再好也不会改变插座本身的物理规格。这里有个关键点容易被忽略包管理器只管「装、查、卸」这个动作真正决定能装什么的是背后的软件源仓库。仓库里放的是一堆包文件加上一份描述依赖关系的元数据metadata。yum 干活之前会先把元数据下载到本地缓存再根据元数据算出你要装的包需要哪些依赖最后按顺序下载安装。理解了这一点后面所有的报错排查就都有方向了——大部分 yum 报错是元数据拿不到或者对不上而不是包本身有问题。对比维度aptUbuntu/Debianyum / dnfRHEL 系包文件格式.deb.rpm元数据缓存位置/var/lib/apt/lists/var/cache/yum 或 /var/cache/dnf源配置文件/etc/apt/sources.list 及 sources.list.d/etc/yum.repos.d/*.repo更新元数据apt updateyum makecache安装软件apt install 包名yum install 包名查依赖关系apt-cache dependsyum deplist清理缓存apt cleanyum clean all已装包数据库dpkg 状态库 /var/lib/dpkgrpm 数据库 /var/lib/rpm这张表建议存下来两边命令在记忆里混成一团的时候拿出来对一下比瞎猜快得多。1.2 什么情况下在 Ubuntu 上折腾 yum 才有意义我把实际遇到过的需求归成三类你可以对号入座。第一类是内网仓库服务端。公司内网有二十台 Rocky 9.2 需要统一从内部源装包不允许连外网。你手里只有一台 Ubuntu 服务器当跳板那就用它来存放 RPM 包、生成元数据、用 HTTP(这里指普通的网页文件服务) 对外发布。这个场景里 Ubuntu 只是「仓库的宿主」yum 在服务端基本不参与客户端才是真正跑 yum 的机器。这也是我认为最值得学的用法第 4 章会详细展开。第二类是跨发行版脚本调试。有些自动化脚本或者 CI 流程原本是给 RHEL 系写的里面全是 yum 命令。你想在本地 Ubuntu 环境里先把脚本逻辑跑通就需要一个 yum 命令存在。这种情况下装个 yum 只为满足「命令能执行」实际执行到下载安装环节还是会断所以要配合 dry-run 或者参数校验来用。第三类是纯学习。想搞明白 rpm 包的内部结构、元数据长什么样、repoquery 怎么用那装一个来当实验工具是合适的。Ubuntu 的官方仓库里确实提供了 yum 包直接 apt 装就行不用去编译。需要泼冷水的是第四类想法——「我想在 Ubuntu 上用 yum 装 CentOS 的软件」。这个基本走不通原因在 2.3 节展开。1.3 动手前的环境确认清单在敲任何命令之前先花两分钟做几项确认能省掉后面一堆莫名其妙的报错。第一项是系统版本和代号。执行下面这条把VERSION_CODENAME和VERSION_ID记下来换源的时候要用cat /etc/os-releaseUbuntu 22.04 的代号是 jammy24.04 是 noble20.04 是 focal。源地址里写错代号apt update一定报 404这是最高频的低级错误。第二项是权限。所有涉及系统目录的操作都要 sudo建议直接sudo -i切到 root 会话里做完再退出比每条命令前面加 sudo 清爽。但要注意别养成长期挂在 root 的习惯尤其是有图形界面的机器。第三项是网络连通性。ping -c 3 mirrors.aliyun.com能通不代表 HTTP 能通更靠谱的验证是用 curl 直接拉一个文件头curl -I https://mirrors.aliyun.com/ubuntu/dists/jammy/Release返回HTTP/1.1 200 OK说明这条链路没问题。如果这里就卡住别急着改源先解决网络和 DNS(域名解析) 的问题改源只会让问题看起来更复杂。第四项是磁盘空间。本地仓库动辄几十 GBdf -h看一下 /var 或者你打算放仓库的挂载点还剩多少。注意任何修改 /etc/apt/ 下配置的动作之前先做备份。这条规则没有例外我在第 3 章会给出具体的备份命令。2. Ubuntu 上安装 yum 的完整流程2.1 启用 universe 仓库与依赖梳理yum 这个包在 Ubuntu 里不属于核心组件它躺在 universe 仓库里。绝大多数桌面版和服务器版默认是启用 universe 的但如果你拿到的是一台被精简过的镜像或者有人手动改过源配置就得先确认。sudo apt update apt-cache policy yumapt-cache policy这条命令比apt search有用得多它会直接告诉你这个包有没有候选版本、候选版本号是多少、来自哪个源。如果输出里Candidate:显示的是(none)说明当前启用的源里找不到 yum这时候去检查 /etc/apt/sources.list 里有没有universe这个字段。以 Ubuntu 22.04 为例一行完整的源配置长这样deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse方括号里那四个词是组件名main和restricted是官方支持的自由与非自由软件universe是社区维护的开源软件yum 就在这里面。缺了 universe你搜什么都搜不到。依赖方面不用太操心apt 会自动带出python3、rpm等包。这里有个细节值得说明Ubuntu 的 yum 包依赖rpm也就是它会把 RPM 的命令行工具一起装上。这个 rpm 命令本身在 Ubuntu 上是能用的可以查看.rpm包的头部信息、解压内容但不要用它往系统里安装 RPM 包它会把文件直接铺到系统目录下绕过 dpkg 的记录后续 apt 完全不知道这些文件的存在清理起来非常痛苦。这个坑我在早期踩过一次只能靠rpm -ql列出文件列表再手工删。2.2 分步安装与结果验证确认候选版本存在之后安装本身很简单sudo apt install -y yum加-y是为了跳过确认提示在脚本里用很方便但手工操作时我建议不加先看一眼 apt 打算装什么、卸什么。Ubuntu 的依赖求解器偶尔会给出一些意料之外的方案比如为了满足依赖卸掉你正在用的某个包看清楚了再回车。装完之后立刻验证三件事。第一件命令是否可用yum --version正常会输出类似3.4.3或4.x的版本号同时可能带出 Python 的版本信息。如果提示command not found八成是当前 shell 的 PATH 有问题which yum看一下通常应该在/usr/bin/yum。第二件配置文件在不在。yum 的主配置是/etc/yum.conf仓库目录是/etc/yum.repos.d/。刚装完这两处都是空的或者只有默认内容目录里没有任何.repo文件所以yum repolist会告诉你repolist: 0这是正常的不是装坏了。第三件rpm 命令的状态rpm --version rpm -qa | head在 Ubuntu 上rpm -qa基本查不到东西因为系统的软件包记录都在 dpkg 那边。这也是正常的。yum repolist看到repolist: 0别慌接下来配源就能用。2.3 装完之后能干什么、不能干什么这一节是全文最需要你认真读的部分因为它决定了你对这套工具的预期。能干的yum repolist列出已配置的仓库yum repoquery查询某个包的信息和依赖需要配好源yumdownloader从源里把 RPM 包下载到本地而不安装yum makecache生成元数据缓存yum clean all清理缓存。这几个都是只读或者下载类操作在 Ubuntu 上跑起来没有障碍。特别是yumdownloader在做离线交付的时候非常好用可以把一个包连同它的全部依赖一起拉到本地目录再拷到没有外网的机器上。yumdownloader --resolve --destdir/data/rpms httpd--resolve表示把依赖一起下--destdir指定输出目录。这条命令在你需要给一批内网机器准备离线包的时候效率比手工一个个找高太多。不能干的直接yum install一个 RPM 包。原因不是 yum 本身不行而是 Ubuntu 系统的 rpm 数据库里没有基线包记录。RPM 包的依赖通常写成Requires: glibc 2.17这种形式yum 会去 rpm 数据库里查 glibc 装没装、版本够不够。Ubuntu 的这台机器上是空的所以任何依赖都会被判定为缺失然后 yum 开始尝试从源里补依赖——可你的源里全是 RPM装上去又会和 dpkg 管理的文件打架。所以正确的做法是Ubuntu 上的 yum 当作查询和下载工具真正的安装动作放到目标发行版或者容器里做。需要完整环境的话用容器跑一个 CentOS 或 Rocky 是最省事的docker run -it --rm rockylinux:9 /bin/bash进去之后 yum 就是原生工具配源、装包都符合官方文档的描述不会出现任何稀奇古怪的问题。这一招在本地验证仓库配置是否正确时特别有用。3. Ubuntu 的软件源更新从备份到验证3.1 sources.list 与 deb822 两种格式的识别源的更新这块首先得知道你的系统用的是哪种配置格式因为 Ubuntu 24.04 之后默认换成了新的 deb822 格式网上大量老教程的 sed 命令在新系统上直接失效。老格式在/etc/apt/sources.list一行一个源长这样deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ jammy-updates main restricted universe multiverse deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse新格式在/etc/apt/sources.list.d/ubuntu.sources用的是类似 INI 的分段写法Types: deb URIs: http://archive.ubuntu.com/ubuntu/ Suites: noble noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg怎么判断直接ls /etc/apt/sources.list.d/看一眼再head /etc/apt/sources.list。如果 sources.list 里只有几行注释说明「文件已迁移」那你的系统就是新格式。两种格式的替换方式完全不同。老格式用 sed 按行替换就行新格式需要改URIs那一行用 sed 的时候要针对字段名匹配不能盲目替换域名否则可能把Signed-By里的路径也改掉。注意不要为了图省事直接把旧教程里的整份 sources.list 覆盖到 24.04 上。新系统同时存在两套配置时会同时生效可能出现同一个源被加载两次、或者版本代号不匹配导致的报错。先确认格式再动手。3.2 换源实操备份、替换、更新缓存整个流程分四步我按顺序写你照着敲就行。这里用国内常用的镜像站举例具体选哪家看你的网络环境各家同步频率和带宽不一样我一般优先选同步快的那家。第一步备份。备份文件名带上日期方便回滚时对照sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak.$(date %F)如果是新格式把ubuntu.sources也备份一份。第二步确认代号。再次强调别硬编码source /etc/os-release echo $VERSION_CODENAME第三步替换。老格式的 sed 写法sudo sed -i s//.*archive.ubuntu.com//mirrors.aliyun.comg /etc/apt/sources.list sudo sed -i s//security.ubuntu.com//mirrors.aliyun.comg /etc/apt/sources.list用当分隔符是因为地址里有斜杠用/当分隔符要转义写起来很丑。新格式的写法sudo sed -i shttp://archive.ubuntu.com/ubuntu/https://mirrors.aliyun.com/ubuntu/g /etc/apt/sources.list.d/ubuntu.sources改完grep -n URIs /etc/apt/sources.list.d/ubuntu.sources确认一下替换结果再往下走。第四步更新缓存并验证。sudo apt update apt-cache policy | head -20第二条命令会列出所有已启用源的优先级和地址你能直观看到源是不是真的换过来了。如果apt update的过程里有几个源报错但其他源正常通常是那家的同步还没完成等一会再试或者换一家。换完源之后第一次apt update会比平时慢因为本地缓存是空的要全量拉元数据。之后再更新就是增量对比速度快很多。3.3 update、upgrade、dist-upgrade 的执行节奏这三个命令很多人混着用其实职责完全不同。apt update只做一件事从各个源把元数据下载到/var/lib/apt/lists更新本地对「仓库里有哪些包、都是什么版本」的认知。它不改变系统上任何一个已安装的包。这一步必须最先做因为后面所有安装和升级动作都依赖这份元数据。apt upgrade做的是在不删除任何现有包的前提下把所有能升级的包升到最新版本。这条约束很关键遇到需要卸载旧包才能升级的情况它会选择跳过而不是强行处理。apt dist-upgrade新版本里等价于apt full-upgrade则允许为了完成升级而安装新包或移除已有包。内核大版本变化、依赖结构调整的时候只有它能处理干净。我的习惯是日常维护用apt update apt upgrade看到有大量包因为依赖关系被 hold 住不升再考虑 dist-upgrade。执行 dist-upgrade 之前一定先看一眼它打算删除什么sudo apt -s dist-upgrade-s是模拟执行只输出计划不实际动手。这个习惯帮我躲过好几次「升级顺手把某个关键服务卸掉」的事故。sudo apt update sudo apt -s upgrade sudo apt upgrade排成三行依次执行比一口气连起来更可控中间出错你能及时发现。3.4 源更新失败后的回滚方案改完源之后如果出现大面积报错别在原地反复折腾直接回滚到备份最省时间sudo cp /etc/apt/sources.list.bak.2025-01-01 /etc/apt/sources.list sudo rm -rf /var/lib/apt/lists/* sudo apt update第三步那个rm -rf是删本地元数据缓存不是删源配置可以放心执行。缓存里如果有半截下载失败的索引文件不清掉的话apt update会一直复用坏数据报一些看起来很莫名的错。如果回滚之后还是报错那问题就不在源上了往网络层查见第 5 章。4. 在 Ubuntu 上搭一套本地 yum 源4.1 为什么这件事反而更常用把 Ubuntu 当 RPM 仓库的宿主这个组合在内网环境里相当普遍因为仓库服务端本身对发行版没有要求——它只需要做三件事存文件、生成元数据、通过 HTTP 提供服务。这三件事 Ubuntu 做得一点也不差。方案上有几个选择。最轻的是直接用 Python 自带的 HTTP 服务临时顶一下python3 -m http.server 8000 --directory /data/yumrepo几行就能跑起来调试阶段够用。但它是单线程的并发一上来就卡而且没有断点续传、没有访问日志的细粒度控制生产环境不能用。正经做法是上 nginx。Ubuntu 装 nginx 一条命令的事配置也简单支持多进程、断点续传、目录索引还能配访问控制。下面这个配置片段可以直接改改就用server { listen 80; server_name _; root /data/yumrepo; autoindex on; autoindex_exact_size off; autoindex_localtime on; location / { try_files $uri $uri/ 404; } }autoindex on打开目录浏览方便你用浏览器直接确认文件在不在。放到/etc/nginx/conf.d/yumrepo.conf里nginx -t检查语法systemctl reload nginx生效。注意如果内网客户端用的是 http 而仓库是 https 且证书是自签的yum 默认会校验失败。要么给客户端配上对应证书要么仓库只走 http。内网环境下走 http 是最常见的选择。4.2 RPM 目录组织与元数据生成仓库目录的组织方式直接影响后面好不好维护。我推荐按发行版和版本分目录而不是一股脑全塞在一起/data/yumrepo/ ├── rocky9/ │ └── BaseOS/ │ ├── Packages/ # 所有 .rpm 文件 │ └── repodata/ # 生成的元数据 └── centos7/ └── os/ ├── Packages/ └── repodata/为什么不混放因为 CentOS 7 和 Rocky 9 的 glibc、openssl 版本差了好几个大版本混在一个仓库里yum 在算依赖的时候会把两个版本都算进去可能出现「为了装 A 顺手升级了 glibc 导致一堆服务崩掉」的连锁反应。物理隔离是最省心的做法。元数据生成用createrepo_cUbuntu 上的包名就是它sudo apt install -y createrepo-c createrepo_c /data/yumrepo/rocky9/BaseOS执行完去看一眼Packages同级会多出一个repodata目录里面有repomd.xml、primary.xml.gz、filelists.xml.gz、other.xml.gz等文件。repomd.xml是入口客户端第一件事就是拉它里面记着其他几个文件的名字和校验值。这也是为什么报错经常是repomd.xml相关——入口都拿不到后面就无从谈起。后续往 Packages 里加了新包不用重新生成全部元数据加--update参数做增量createrepo_c --update /data/yumrepo/rocky9/BaseOS包数量上千的时候全量生成要跑好几分钟增量只要几秒。这个参数值得记住。如果要支持yum groupinstall这类按组安装的功能还需要一份 comps.xml 描述包组生成时用-g指定createrepo_c -g /data/comps.xml /data/yumrepo/rocky9/BaseOScomps.xml 可以从对应发行版的 ISO 镜像里提取里面定义了「开发工具」「最小安装」这类包组包含哪些包。4.3 发布与客户端 repo 文件配置服务端搞定之后客户端那边基本就是复制粘贴。以 Rocky 9 为例在/etc/yum.repos.d/下新建一个local.repo[local-baseos] nameLocal BaseOS Repository baseurlhttp://192.168.10.20/rocky9/BaseOS enabled1 gpgcheck0 metadata_expire3600逐行解释一下。baseurl必须指向包含 repodata 目录的那一级也就是仓库根目录指向 Packages 或者 repodata 本身都会报 404这是新手最常犯的错。gpgcheck0表示跳过包签名校验内网自己的包一般没有签名先关掉如果你们有签名流程应该配gpgcheck1加gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-xxx安全性更好。metadata_expire设置元数据的过期时间单位是秒3600 表示一小时。默认值是 48 小时内网仓库频繁更新的话这个值太大了客户端可能拿到的还是老元数据找不到刚加进去的包。我一般设成 600 到 3600 之间。配好之后清理缓存并重建yum clean all yum makecache yum repolistrepolist输出里能看到local-baseos的包数量说明元数据解析成功了。如果包数量显示为 0 或者报错检查 baseurl 能不能用 curl 拉到 repomd.xmlcurl -I http://192.168.10.20/rocky9/BaseOS/repodata/repomd.xml这一条命令能定位九成的客户端配置问题——拉不到就是路径或权限问题能拉到就是 repo 文件写错了。5. 常见报错与排查速查5.1 apt 侧的高频报错换源之后第一批报错基本都集中在 apt 这边我把遇到频率最高的几个整理出来。404 Not Found多半是版本代号写错了或者镜像站还没同步到你这个版本。用curl -I直接访问源地址确认能拉到就是本地配置问题拉不到就是源的问题。NO_PUBKEY 或 GPG error说明缺少仓库签名公钥。老教程里会让你用apt-key add这个命令在 Ubuntu 22.04 之后已经被废弃了虽然还能用但会有警告。正确做法是把公钥放到/etc/apt/trusted.gpg.d/或者用signed-by机制指定curl -fsSL https://example.com/key.gpg | sudo tee /etc/apt/trusted.gpg.d/example.gpg /dev/nullHash Sum mismatch表示下载下来的索引文件和源里记录的校验值不一致。原因通常是中间有缓存层或者下载中断。解决方法是清掉缓存重来sudo rm -rf /var/lib/apt/lists/* sudo apt clean sudo apt updateCould not get lock /var/lib/dpkg/lock-frontend说明有另一个 apt 进程正在跑。先别急着删锁文件用ps aux | grep -i apt看看是不是有个后台的自动更新任务等它跑完就好。实在确认没有进程了再考虑手工清理锁文件顺序是先确认、后处理。报错关键词大概率原因处理动作404 Not Found代号错误 / 源未同步核对 VERSION_CODENAME换源NO_PUBKEY缺签名公钥导入公钥到 trusted.gpg.dHash Sum mismatch缓存损坏清 lists 与 archives 后重来Could not get lock并发 apt 进程等进程结束勿直接删锁Temporary failure resolvingDNS 异常检查 /etc/resolv.conf5.2 yum/repodata 侧的高频报错Cannot retrieve metalink for repository这是 CentOS 7 上最经典的报错原因是官方源已经停止维护metalink 地址失效。解决办法是把.repo文件里的metalink那一行删掉或者注释掉改用baseurl指向可用的镜像地址。Rocky、AlmaLinux 用户如果遇到同类问题思路一样。repomd.xml: [Errno 14] HTTP Error 404前面说过了baseurl 层级写错。记住要指到仓库根目录。Error: rpmdb open failedrpm 数据库文件损坏通常是并发操作或者异常断电导致的。清理一下 db 文件即可rm -f /var/lib/rpm/__db.* rpm --rebuilddb注意这条只在 RPM 系机器上执行别在 Ubuntu 上跑。元数据下载极慢甚至超时在.repo文件里加两个参数能缓解timeout60 minrate1000minrate单位是字节每秒低于这个速度就断开重试避免卡在一个半死不活的连接上。Loaded plugins 报 Python 相关的错多见于老版本 yum 和新版 Python 混用。Ubuntu 上装的 yum 是 Python 实现的如果系统里 Python 环境被改过比如自己编译装了新版本并改了默认链接yum 启动就会失败。检查head -1 $(which yum)看它用哪个解释器。5.3 网络与 DNS 层的问题定位很多看起来像包管理器的报错根子在网络。我总结一个自下而上的排查顺序从底层往上走比乱试快。第一层物理和 IP。ip a看网卡有没有拿到地址ping 网关地址看二层三层通不通。第二层DNS。ping mirrors.aliyun.com如果提示Temporary failure in name resolution说明域名解析失败。看/etc/resolv.conf里的 nameserver 配置。这里有个 Ubuntu 特有的坑如果你用 netplan 或者桌面版的 NetworkManager 管理网络手工改/etc/resolv.conf会在重启或者网络重连后被覆盖回去。正确的做法是改 netplan 的 yaml 文件sudo nano /etc/netplan/01-netcfg.yaml在对应网卡下加 nameservers 字段然后sudo netplan apply。桌面版则在网络设置界面里改。这一点在排查「改完 DNS 过一会儿又失效」的问题时特别关键。第三层HTTP 可达性。用 curl 带-v参数看完整的握手过程curl -v http://192.168.10.20/rocky9/BaseOS/repodata/repomd.xml能看到请求发出、响应返回就说明链路畅通。如果卡在Trying 192.168.10.20...是防火墙把端口挡了服务端执行sudo ufw status或者sudo iptables -L -n看一下 80 端口是否放行。第四层才是包管理器自己的配置。前三层都确认没问题了再回去看.repo或者 sources.list 的内容这时候错误范围已经缩得很小了。提示排查顺序永远是从底层往上不要在配置文件里反复猜。我见过太多人一个字符一个字符对比 .repo 文件结果根本是防火墙没开端口。6. 踩坑之后的几点体会做完几轮内网仓库之后有几个习惯我固定下来了分享给你。第一个习惯是所有改动都留备份和时间戳。源配置文件、repo 文件、甚至 createrepo 的命令行我都会扔进一个deploy.md里记下来。原因很实际这种环境半年才动一次下次接手的时候早就忘了当初怎么配的有份记录能省几个小时。第二个习惯是搭仓库之前先算容量。一个 Rocky 9 的完整 BaseOS 加 AppStream 差不多十几 GB如果还要放 EPEL再加几个 GB。分区别给得太紧元数据生成的时候会写临时文件空间不够会生成一半失败然后你拿到一个残缺的 repodata客户端报的错完全看不出是磁盘满了导致的。这个坑我中过一次后来养成习惯每次生成元数据之前先df -h看一眼。第三个习惯是先小范围验证再全量推。本地源配好之后先在一台测试机上yum clean all yum makecache yum install -y 某个小包走一遍完整流程确认没问题再批量改其他机器的 repo 文件。批量推送的时候我喜欢用 ansible 的 copy 模块一次改二十台也就几秒钟的事比 ssh 循环舒服得多。最后说一句关于apt update的频率。我见过有人把它写进 crontab 每天跑一次这不是个好主意——元数据每天都在变频繁拉取既占带宽又容易碰到源站同步中的中间状态反而更容易报错。手工维护的机器一周更新一次就够了真正需要及时打补丁的生产环境应该有专门的补丁管理流程而不是靠定时任务盲跑升级。
返回列表