openEuler 22.03 LTS SP3离线升级包制作与使用全攻略 简介openEuler 22.03 LTS SP1 用户在离线或内网环境下完成到 SP3 的升级往往受制于依赖包缺失与联网限制。这套离线升级包正是为此封装面向系统管理员和运维工程师已由作者在新装 SP1 系统上验证通过依赖关系提前处理完毕可直接作为本地软件仓库使用免去手动解析 rpm 依赖的环节。压缩包共 508 个文件其中 501 个 rpm 覆盖内核、linux-firmware、libicu 等关键组件另有 gz/bz2 格式的仓库元数据与 xml 文件用于搭建 yum/dnf 本地源整体大小 389.15MB目录结构清晰便于核对和批量部署。目前已有 906 人学习下载常被内网运维和系统升级人群用作参考。拿到这份包后可按提示在 SP1 环境中执行升级完整替换内核与系统组件并借助内置元数据核实包完整性避免下载遗漏或依赖冲突。对需要离线批量升级 openEuler 的团队而言是一份可直接落地的升级素材。 做离线升级包这件事说到底就是给隔离网络里的 openEuler 系统准备一份“找齐了所有依赖的软件包集合”。之前我在一个不能连外网的生产环境里维护过一批 openEuler 22.03 LTS 的机器系统版本停留在 SP1安全漏洞公告发了一堆却装不上补丁那叫一个难受。后来专门搭了一套离线升级方案把 SP3 的升级包整体制作、分发、应用跑通之后整个运维节奏才顺过来。这篇东西不聊虚的直接讲清楚 openEuler-22.03-LTS-SP3 离线升级包怎么做、怎么用、踩过哪些坑。不管你是给华为服务器批量升级还是在 VMware 虚拟机里测试这套思路都能直接复刻。1. 离线升级的整体方案为什么不能直接拷贝 RPM很多新手第一次做离线升级想法都很简单找一台能联网的机器把 RPM 包下载下来拷贝到内网机器上一个个 rpm -ivh 装。实际一操作就翻车最典型的问题是依赖缺失——你要升级的包依赖另外五个包那五个包又依赖别的包手拉手能拉出一长串光靠肉眼根本找不全。所以离线升级包的核心不是“下载 RPM”而是“把所有依赖关系一起打包”。完整方案分三步先在联网机器上把目标版本的全量依赖拉下来再用 createrepo 生成仓库元数据最后拷贝到内网机器配置成本地 yum 源让系统自己处理依赖关系。这样一来内网机器上的 yum/dnf 会像访问在线源一样工作只是数据源从网络换成了本地目录。这个方案有个前提条件需要注意制作离线升级包的机器其系统版本、架构必须和目标机保持一致。比如目标机是 x86_64 架构的 openEuler 22.03 LTS SP3那包也要在 x86_64 的 22.03 环境里下载不能拿 aarch64 的包直接混用不然装的时候会报架构不匹配白折腾一趟。1.1 离线升级包的适用场景离线升级包主要面向三类场景第一类是严格的内网隔离环境。研发网、生产网这些区域通常只有少数跳板机有外网权限其余服务器全部物理隔离或者逻辑隔离系统补丁、安全更新只能靠人工导入。第二类是等保合规要求高的项目。客户现场不允许服务器直连公网但安全扫描又催着修复漏洞这时离线升级包是标准交付物。第三类是批量部署场景。比如一次性给 30 台机器升级与其每台都联网下载不如做一份离线包拷到内网后每台机器本地安装速度反而更快还不占用外网带宽。1.2 制作与使用的整体流程图借用一张内心的流程图纯文字版动手的时候按这个顺序来联网中转机配置 yum 源 → 下载全部依赖 RPM → createrepo 生成元数据 → tar 打包 目标内网机解压 tar → 配置本地 repo → yum makecache → yum update整个链条里最关键的一步是“下载全部依赖 RPM”这一步做扎实了后面所有环节都顺。2. 动手前的准备版本核对与中转机搭建在开始制作离线升级包之前有两件事必须提前确认不然很容易白忙一场。先看目标机的版本和架构。登录目标机执行cat /etc/openEuler-release uname -m第一行会输出系统版本比如 openEuler release 22.03 (LTS-SP3)第二行输出硬件架构x86_64 就是 64 位 Intel/AMDaarch64 就是 ARM 平台。这两个信息决定了中转机上要用哪套仓库和哪套包。接着准备中转机。中转机可以是 VMware 里的一台虚拟机也可以是实体服务器。系统必须装 openEuler 22.03 LTS版本建议跟目标机一致架构必须一致。中转机需要能访问公网至少能访问 openEuler 官方软件源。2.1 中转机的系统与网络要求中转机的系统建议直接安装 openEuler 22.03 LTS SP3装好之后先确认源可用yum repolist能看到 openEuler 官方源、EPOL 源等输出就说明网络和仓库都正常。如果一条记录都没有检查 /etc/yum.repos.d/openEuler.repo 里的 baseurl 是否指向正确镜像或者清理一下 yum 缓存yum clean all yum makecache中转机磁盘空间要留够。openEuler 的基础升级包可能不大但如果你打算做全量升级把所有需要更新的包都拉下来可能需要 5~10GB 甚至更多空间。建议中转机数据盘留 20GB 空间比较稳妥。2.2 确认目标机的实际升级需求不是所有机器都需要把系统升到最新做离线升级包前先明确这次要升什么只修复某个安全漏洞下载对应的补丁包及其依赖即可从 SP2 升到 SP3需要完整的升级包集合内核安全更新下载新内核相关 RPM我建议在中转机上先把要升级的包列表列出来方法很简单——直接对比当前版本和仓库里的最新版本yum list updates执行后系统会把中转机上所有可升级的包列出来这就是离线包的基本范围。如果目标机和中转机装的软件不完全一样你还需要根据目标机的 rpm -qa 输出手工补充升级项。不过一般情况下的做法是中转机装的东西比目标机更全这样拉下来的包覆盖范围更广到目标机上基本都能命中。3. 核心实操离线升级包的三个制作方法制作离线升级包有几种常见方法我分别说一下各自的适用场景和操作步骤。3.1 方法一yum install --downloadonly 下载指定包如果你只需要升级某一个或几个确定的包用 yum 自带的 downloadonly 参数最方便yum install --downloadonly --downloaddir/data/upgrade-packages 包名比如要升级内核yum install --downloadonly --downloaddir/data/upgrade-packages kernel这个命令会把包和它依赖的所有包都下载到指定目录但不会安装。注意 openEuler 22.03 默认的包管理器是 dnf但保留了 yum 命令兼容所以 yum 和 dnf 都可以用。如果执行后提示未知参数用 dnf 命令代替dnf install --downloadonly --downloaddir/data/upgrade-packages kernel这个方法的局限是一次只能处理你指定的包。要做全量升级需要把所有可升级的包名都带上命令行会变得很冗长。3.2 方法二repotrack 全量依赖下载做全量升级包更推荐用 repotrack 命令它来自 yum-utils 工具包。先安装yum install -y yum-utils然后下载所有可升级的包repotrack -p /data/upgrade-packages $(yum list updates | awk NR3 {print $1})这条命令的意思是把 yum list updates 列出来所有可升级的包名逐个用 repotrack 下载每个包都会把它的全部依赖一起拉下来。-p 参数指定输出目录。repotrack 比 downloadonly 强的地方在于它会把指定包的所有依赖包括运行时依赖、库依赖全部递归下载不会漏。对于做系统级升级这是最可靠的方法。如果你只想升级内核和驱动相关的包也可以这样repotrack -p /data/upgrade-packages kernel kernel-core kernel-modules注意repotrack 下载的包数量可能非常庞大而且包含大量重复依赖。下载完成后检查一下目录大小心里有个数。3.3 方法三利用 ISO 镜像自带的升级包openEuler 官方发布了完整的光盘镜像SP3 的 everything ISO 里包含所有官方 RPM 包。如果内网机器可以直接挂载 ISO这个方案更省事——不用下载直接拷贝。把 ISO 上传到内网挂载mount -o loop openEuler-22.03-LTS-SP3-everything-x86_64.iso /mnt/openEuler-isoISO 里的 Packages 目录就是所有 RPM 的集合直接把它作为本地源使用即可。这个方法适合做全新安装或者基础系统的离线升级但如果你的软件是从 EPOL 或者第三方源装的ISO 里可能没有对应包还是要走前面的 repotrack 方法。3.4 用 createrepo 生成本地仓库元数据无论用哪种方法下载完 RPM下一步都是把它变成可以被 yum 识别的仓库。这一步靠 createrepo 命令完成yum install -y createrepo cd /data/upgrade-packages createrepo .执行成功后目录下会生成一个 repodata 子目录里面有仓库的元数据文件。这一步非常关键——有了 repodata目标机才能用 yum 自动解析依赖没有 repodatayum 找不到本地源。createrepo 完成后还可以验证一下仓库是否有效yum repolist如果能看到以 /data/upgrade-packages 为 baseurl 的仓库出现在列表里说明仓库制作成功。3.5 打包分发与传输方式仓库制作完成后进行打包cd /data tar czvf openEuler-22.03-SP3-upgrade.tar.gz upgrade-packages/然后通过 scp、移动硬盘或者受控通道把这个 tar 包传到内网目标机。需要注意包较大时建议用 tar 而不是直接拷目录因为 tar 能减少文件数量、保持软链接关系内网批量分发时可以把 tar 包放到一台内网服务器上目标机用 wget 或 scp 下载拷到目标机后先解压解压目录需要有可执行权限4. 目标机的离线升级执行步骤离线包做好只是第一步真正的考验在内网机器上执行升级。目标机上操作请按照以下流程每一步都有它的理由。4.1 升级前备份别嫌麻烦这一步坚决不能省。执行升级之前建议对系统关键数据进行备份/etc 配置目录升级过程中配置文件可能会被覆盖或迁移数据库和应用数据如果要升级内核可能需要重启确保数据落盘安全系统引导配置把 /boot 下的内核文件列表记录下来没有外接备份设备的话至少也要用 tar 备份一份tar czvf /root/etc-backup-$(date %F).tar.gz /etc另一个推荐操作是使用 yum history 记录当前状态。升级前执行yum history list可以看到当前事务列表。后面如果升级出问题可以通过 yum history undo 事务ID 回滚这是 yum 自带的最强保险。4.2 上传解压并配置本地 repo在目标机上执行mkdir -p /data/upgrade-packages tar xzvf openEuler-22.03-SP3-upgrade.tar.gz -C /data/然后新建一个本地仓库配置文件vi /etc/yum.repos.d/local.repo写入以下内容[local-upgrade] nameLocal Upgrade Repository baseurlfile:///data/upgrade-packages enabled1 gpgcheck0这里 gpgcheck 设置为 0 是因为从官网镜像下载的 RPM 包已经是可信来源且离线环境也没法在线拉取公钥。如果目标机上有 GPG 公钥也可以改为 gpgcheck1 并配置 gpgkey 路径会更严谨但增加了配置复杂度。安全要求严格的场景建议把公钥文件一并打包导入。配置完成后清理缓存并生成新缓存yum clean all yum makecache4.3 执行升级与内核更新缓存生成好后先看一下有哪些包可以升级yum list updates如果列出的包和你在中转机上下载的一致说明仓库配置无误。接下来准备升级推荐先做软件包升级再单独处理内核升级。要注意 openEuler 22.03 的内核包更新默认会有多个内核版本共存不会自动删旧内核这是设计上的安全策略。执行普通软件包升级yum update -y注意这条命令会把所有可升级的包都更新到仓库里的最新版本。如果你的离线包里只包含了部分包而其它包在本地源里没有对应更新yum 只会处理源里能匹配到的部分不会报错。后面的正常流程是更新内核yum update kernel -y升级完成后确认新内核是否已经写入引导配置。openEuler 使用 GRUB2 作为引导程序新内核安装后会自动修改 grub.cfg但为了保险起见可以执行grub2-mkconfig -o /boot/grub2/grub.cfg在部分 UEFI 环境路径可能是 /boot/efi/EFI/openEuler/grub.cfg用 ls 确认即可。4.4 升级后验证重启前先检查当前系统版本与内核版本cat /etc/openEuler-release uname -r然后重启系统reboot重启后再次执行 uname -r看内核版本是否为升级后的版本。如果启动后系统启动异常GRUB 引导菜单里有 previous 选项可以选择旧内核进入这就是前面说的多内核共存策略的价值。再检查关键服务是否正常systemctl status sshd如果 sshd 状态正常说明系统核心服务没有受到升级影响离线升级基本成功。5. 离线升级中踩过的坑与排查技巧离线升级看着流程简单实际操作中踩坑概率相当高。我把这几年遇到的高频问题整理成一份速查表方便后面真遇到了直接对照排查。5.1 高频问题对照表现象可能原因解决方法yum makecache 报错repo 路径写错或 repodata 不存在检查 local.repo 的 baseurl 是否指向 repodata 所在目录依赖解析失败下载包时没有用 repotrack漏了依赖回到中转机用 repotrack 重新下载对应包安装时报错 GPG 签名校验失败gpgcheck 未设置或公钥缺失临时将 gpgcheck 置 0或导入公钥文件重启后内核版本没变新内核未写入 grub 配置执行 grub2-mkconfig 重新生成 grub.cfg升级后某个服务起不来配置文件被新版本覆盖从备份的 /etc 目录恢复该服务配置yum update 找不到任何更新包缓存未刷新或仓库未启用yum clean all 后重新 makecache检查 local.repo 是否有 enabled1包下载了但安装时提示依赖不满足目标机上缺失底层的库或工具在中转机上再下载缺失依赖的包补充进仓库5.2 几个容易忽略的细节内核升级时的 RPM 版本匹配问题值得单独提一下。如果我们下载的 kernel 包和当前系统上的 kernel-devel 版本不匹配编译第三方驱动比如网卡驱动、GPU 驱动时会报错。解决方法是把 kernel-devel、kernel-headers 和 kernel 一起打包下载保持版本一致。另一个容易踩的坑是 dnf 和 yum 的混用。openEuler 22.03 虽然提供 yum 命令但底层调用的是 dnf。在制作离线包时如果你用了 yum 命令的某些自定义插件可能在中转机上正常但目标机上由于没有装对应插件导致仓库解析失败。建议所有操作统一用 yum 或统一用 dnf不要混着来。5.3 不同架构包混用的问题前面反复强调 x86_64 和 aarch64 的包不能混用。实际遇到过的情况是客户给了台 aarch64 的 TAISHAN 服务器我没注意直接把 x86_64 中转机上做的包拷过去了结果 yum 安装时大量报错。虽然 rpm 安装时会提示架构不匹配但 yum 在解析依赖阶段就已经开始混乱了。判断方法很简单rpm -qp --qf %{ARCH}\n 包名.rpm如果目标机是 aarch64这个包输出必须包含 aarch64 或 noarch出现 x86_64 的包就是搞错了。6. 把离线升级包推广到更多场景做完一次 openEuler 22.03 LTS SP3 的离线升级包你会发现这套方案不只是“升级一次”这么简单它还可以延伸出很多用途。批量同版本机器的部署可以用这个思路把 ISO 镜像 离线升级包组合起来先装基础系统再统一更新到目标版本整个过程全内网操作不依赖任何外部网络。升级之后还可以把 yum history 里的变更记录导出成报告作为等保整改的材料提交。离线升级带来一个额外好处——因为每次升级都经过中转机中转所有变更历史都有据可查这块在审计的时候很有价值。另外如果你需要在离线环境里安装 Docker、Miniconda 或者 VSFTPD 这类常见软件操作手法完全一样在中转机上用 repotrack 下载软件包然后做成本地源内网机器通过 yum install 安装。这个思路一旦打通离线环境下的软件安装和维护就都不是问题了。# 以离线安装 Docker 为例中转机上执行 repotrack -p /data/docker-packages docker-ce docker-ce-cli containerd.io反正记住一个核心逻辑在线机器负责解决依赖离线机器只是搬运工。这个模式适用于所有基于 RPM 的 Linux 发行版不只是 openEuler。最后分享一个我自己的习惯每次制作完成离线升级包我都会在 /data/upgrade-packages 目录下放一个 README写清楚这个包的制作时间、源系统版本、包含的更新内容、校验值。隔了半年后再看到这个目录你依然能快速知道这份离线包是干什么的、能不能复用到新场景。细节做扎实了运维工作才会真正轻松起来。本文还有配套的精品资源点击获取