☰
openEuler 22.03 LTS SP3内网离线升级包制作与实操指南
2026/9/26 11:35:02 网站建设 项目流程

简介:面向 openEuler 22.03 LTS 系列运维与升级场景,这份离线升级包专注于解决从 SP1 升级到 SP3 时依赖项难以收集的痛点。包内依赖已预先处理完毕,并在全新安装的 openEuler-22.03-LTS-SP1 系统上完成验证,适合内网隔离、无法访问外部仓库的服务器环境。压缩包总计 508 个文件,大小约 389MB,其中包含 501 个 rpm 软件包,以及 sqlite 元数据库、xml 元数据等仓库索引文件,可配合 dnf/yum 直接搭建本地离线源。配套升级步骤说明与仓库结构相结合,使管理员能按批次完成内核、固件及基础组件的更新。目前已有 906 人学习,下载前可参考社区验证情况。整个包覆盖 kernel、linux-firmware、libicu、桌面图标主题等关键组件,升级后可获得 SP3 版本的内核与系统库支持,显著降低逐一下载依赖的运维成本。 前一阵有个客户找到我,机房里有几台运行openEuler 22.03 LTS SP2的服务器,需要升级到SP3版本,但整个内网完全隔离,不能访问外网镜像源。这种离线环境下的系统升级,听起来不算难,但真做起来坑不少。最核心的问题就是:在没有外网的情况下,怎么把几十个依赖包安全、完整地装上去。这篇文章就围绕openEuler-22.03-LTS-SP3离线升级包这件事,把从环境检查、仓库配置到执行升级、排错收尾的完整流程捋一遍,希望对同样在做内网运维的朋友有帮助。

1. 项目背景:为什么一定要做离线升级包

1.1 离线场景的典型画像

需要用到离线升级包的环境,一般有三个典型特征:

  • 网络隔离严格:服务器所在网段不能访问公网,甚至连内网软件源都没有建立,生产环境默认断外网。
  • 安全合规要求高:银行、政务、电力这些行业,对变更操作有严格审批流程,系统补丁必须走离线导入流程。
  • 版本迭代有硬性要求:openEuler 22.03 LTS是长期支持版本,SP3这个服务增强版包含安全补丁、bug修复和部分新硬件支持。从SP2升到SP3并不是简单的小版本交替,它涉及内核、glibc、systemd等底层组件的整体更新,在线下用dnf一条命令就能搞定的事,离线环境就必须把整条依赖链都考虑清楚。

1.2 离线升级包到底解决什么问题

离线升级包本质上是把在线仓库“搬”到内网。具体来说,你要先在一个能联网的机器(或者直接从官方镜像站)下载好SP3对应的全部rpm包和仓库元数据,然后刻盘或者拷贝到内网服务器上,再通过本地仓库方式让dnf完成升级。

这样做的好处有三个:

  • 不依赖外网,一次性把升级所需的rpm包全部准备好。
  • 可审计,每个包都是手工下载并校验过的,满足变更审批要求。
  • 可重复,同一套离线包可以在多台同架构服务器上复现升级过程,不用每台都单独处理网络问题。

但它的麻烦也很明显:依赖关系完全靠人工整理,漏一个包就会导致升级失败。所以后面要讲的目录组织和仓库配置步骤,才是整个离线升级的核心。

2. 动手前的环境盘点与准备工作

先说一句:在真正执行升级前,信息收集越充分,后期踩的坑越少。我见过太多人拿到升级包就往上冲,结果升到一半发现架构不对、磁盘空间不够,甚至系统直接起不来。

2.1 确认当前系统版本与架构

执行升级前,先确认目标机器的现状:

# 查看当前系统版本 cat /etc/openEuler-release # 查看内核版本 uname -r # 查看系统架构 uname -m

确认输出结果是openEuler 22.03 LTS SP2、架构是x86_64还是aarch64。这一步非常关键,升级包的rpm包是按架构区分的,x86_64的包不能装在aarch64机器上,下载时一定要选对架构。

2.2 升级前必须做的检查清单

离线升级比在线升级危险,因为一旦依赖断掉,系统可能停留在中间状态。我建议按照这个清单逐项检查:

检查项操作命令说明
当前版本cat /etc/openEuler-release确认基线是SP2
架构uname -mx86_64 / aarch64
磁盘空间df -h / /boot /var/boot至少预留200MB,/var预留5GB以上
内存free -h建议不低于2GB,dnf事务需要内存
SELinux状态getenforce记录当前状态,升级后可能变化
是否已配置其他源ls /etc/yum.repos.d/防止多个源冲突

特别强调两个点:

  • /boot空间。内核升级会在/boot写入vmlinuz和initramfs文件,SP3升级后一般会装新内核,旧内核保留。如果/boot分区只有一两百兆,很容易写满导致grub生成失败。建议提前用du -sh /boot看下,紧张就先清掉旧的kernel。
  • dnf历史记录。升级前执行dnf history list看一下有没有之前的手动装包记录,这些包如果没有在官方仓库里,升级时可能触发依赖冲突。

2.3 工具准备

离线升级包的制作和使用过程,主要依赖两类工具:

工具用途在哪执行
dnf执行升级事务、做依赖检查目标服务器
createrepo_c生成本地仓库元数据离线包制作机
wget / curl下载rpm包有外网的机器
rsync / scp拷贝离线包到内网传输通道
rpm -ivh极特殊情况下手动装包目标服务器

如果离线包里已经带了repodata目录,那目标服务器上就不需要createrepo,直接配repo文件就能用。如果包是自己用rpm -qa拉出来的,没有repodata,那就得在目标机上装createrepo并重新生成仓库元数据。

3. 离线升级包的目录结构与仓库配置

3.1 包内到底有什么

一份标准的openEuler 22.03 LTS SP3离线升级包,通常包含如下目录结构:

openEuler-22.03-LTS-SP3-x86_64-offline/ ├── BaseOS/ │ ├── Packages/ │ │ ├── kernel-5.10.0-...rpm │ │ ├── glibc-2.34-...rpm │ │ └── ... │ └── repodata/ │ ├── repomd.xml │ ├── filelists.xml.gz │ └── primary.xml.gz ├── EPOL/ │ ├── Packages/ │ └── repodata/ ├── update/ │ ├── Packages/ │ └── repodata/ └── README.md

这里最核心的是repodata目录。dnf解析仓库时,会先读repomd.xml获取元数据文件列表,再解析primary.xml.gz获取每个包的名字、版本、依赖关系。可以说repodata就是仓库的“索引”,没它dnf根本不认这个目录。

如果你下载的是官方everything ISO,里面已经带了完整的BaseOS和EPOL仓库;如果是自己拼的离线包,就需要用createrepo生成repodata:

# 在离线包根目录执行 createrepo_c --workers 4 --outputdir ./BaseOS/repodata ./BaseOS/Packages createrepo_c --workers 4 --outputdir ./update/repodata ./update/Packages

在执行createrepo之前,要注意Packages目录下只放官方rpm包,不能用rpmbuild打出来的私有包混进去,否则依赖解析会出问题。

3.2 配置本地repo源

离线包拷贝到内网机器后,我们用一个统一目录放它,比如/opt/openeuler-offline。然后在/etc/yum.repos.d/下新建独立的repo文件,避免跟系统自带的源混在一起:

vim /etc/yum.repos.d/openEuler-offline.repo

内容如下:

[offline-BaseOS] name=openEuler 22.03 SP3 BaseOS Offline baseurl=file:///opt/openeuler-offline/BaseOS enabled=1 gpgcheck=0 [offline-update] name=openEuler 22.03 SP3 Update Offline baseurl=file:///opt/openeuler-offline/update enabled=1 gpgcheck=0

这里有个细节:gpgcheck=0在离线内网环境是常用的做法,因为rpm包的GPG公钥不一定提前导入。如果你们安全基线要求必须校验签名,那可以先把openEuler公钥导入到RPM数据库:

rpm --import /opt/openeuler-offline/RPM-GPG-KEY-openEuler

然后把repo配置改成gpgcheck=1。

源配好后,执行dnf clean all && dnf makecache验证仓库可用性。如果执行完能看到仓库元数据缓存成功,说明离线包结构没问题。

3.3 升级前依赖预检

我强烈建议,正式升级前先做一次模拟升级。dnf提供了--downloadonly和--assumeno两个特别好用的参数:

# 模拟升级,只做测试不实际安装 dnf check-update --disablerepo='*' --enablerepo='offline-*' # 执行升级但自动回答否,只看事务 dnf update --disablerepo='*' --enablerepo='offline-*' --assumeno

--assumeno会完整解析依赖,列出要安装、要升级的所有包,但不会真的执行。如果这一关报依赖错误,千万不要往下走,先解决依赖问题。

常见的依赖错误就两类:一是离线包里的包版本不全,二是系统里有第三方源装过的包版本比仓库里的更高。第一类问题要回到制作机上补包,第二类问题可以考虑调整升级策略,比如--setopt=offline-BaseOS.exclude=xxx排除冲突包,但这属于应急手段,不建议常规使用。

4. 核心升级实操:从repo配置到系统重启

4.1 执行离线升级命令

预检通过后,正式执行升级:

dnf update --disablerepo='*' --enablerepo='offline-*' -y

--disablerepo='*'先禁用所有仓库,再单独启用离线仓库,确保dnf只从离线包取包。如果你机器上保留了在线源配置,这一步能防止dnf偷偷去外网抓依赖。

整个升级过程可能持续十几分钟到半小时,取决于机器性能和需要更新的包数量。执行期间不建议中断,实在要停就按Ctrl+C,但dnf事务是原子性的,中断后重新执行一般能恢复,不放心就查一下dnf history list。

升级完成后,建议再执行一次:

dnf update --disablerepo='*' --enablerepo='offline-*' -y

确认输出“No packages to update”才算真正升完。

4.2 内核与引导:重启前必须检查的事情

SP2升SP3最大的变化就是内核版本更新。升级过程中如果提示kernel包被更新,那么重启前有几个点必须检查:

  • grub默认启动项。查看/boot/grub2/grubenv里的saved_entry,确保指向新内核。可以执行grub2-editenv list查看:
grub2-editenv list # 输出类似 saved_entry=openEuler (5.10.0-xxx) 22.03 LTS SP3
  • 默认内核版本。用grubby --default-kernel查看,手动改默认内核用grubby --set-default=/boot/vmlinuz-5.10.0-xxx。

  • initramfs是否生成。正常情况下安装kernel包时mkinitrd会自动跑,但如果/boot空间不足或脚本出错,可能没有生成initramfs。检查一下/boot/下是否有对应新内核的initramfs文件,没有就手动执行:

dracut -f /boot/initramfs-$(uname -r).img $(uname -r)

检查完毕再重启服务器。如果用的VMware虚拟机,重启前建议先做一次快照,物理机则确认BMC/IPMI可用,方便出问题时远程介入。

4.3 升级后的验证与收尾

重启完成后,第一件事就是验证版本:

cat /etc/openEuler-release # 应输出 openEuler 22.03 (LTS-SP3) uname -r # 内核版本应与升级包内kernel版本一致

然后检查几个关键服务状态:

systemctl status sshd network NetworkManager

网络服务在升级后偶尔会出问题,因为net-tools或NetworkManager的版本变化可能导致配置兼容性问题。确认网络正常后,再检查核心库和工具链:

ldd --version | head -1 # glibc版本应与SP3一致 dnf repolist # 确认离线源状态正常

最后是收尾工作:

  • 清理旧内核(可选但建议)。用package-cleanup --oldkernels --count=2(如果没有这个命令就dnf remove指定旧内核包),保留两个最近的内核用于回滚。
  • 确认升级包可以卸载:离线升级后,所有rpm包都进了系统rpm数据库,离线包目录本身不影响运行,可以留着做备用源,也可以删掉腾空间。
  • 写变更记录:记下升级时间、升级前版本、升级后版本、更新的内核包号、是否有异常。

5. 常见问题与排错思路

5.1 升级中途依赖冲突

这是离线升级碰到的最高频问题。典型表现是:

Error: package kernel-5.10.0-xxx requires xxx, but none of the providers can be installed

这个报错说明离线包里缺包,或者包版本不对。处理方式:

# 查看具体冲突 dnf update --disablerepo='*' --enablerepo='offline-*' --assumeno 2>&1 | grep -A 5 "Error" # 如果是缺包,单独下载补齐 # 然后把新rpm包拷入Packages目录 cp kernel-extra.rpm /opt/openeuler-offline/update/Packages/ cd /opt/openeuler-offline/update createrepo_c --update .

createrepo_c --update可以增量更新元数据,不用重新扫全部包,速度会快很多。

5.2 /boot空间不足

前面提过一次,这里细说。报错一般是:

installing package kernel-xxx needs 110MB on the /boot filesystem

处理办法:

# 查看/boot下所有文件 ls -lh /boot/ # 删除旧内核和旧initramfs rm -f /boot/vmlinuz-5.10.0-旧版本 rm -f /boot/initramfs-5.10.0-旧版本.img rm -f /boot/System.map-5.10.0-旧版本 rm -f /boot/config-5.10.0-旧版本

删完再执行dnf update。如果/boot是独立分区且很小,建议后续做LVM扩容,否则每次内核升级都提心吊胆。

5.3 升级后网络异常

SP2升SP3后,网络服务异常大多跟NetworkManager或ifcfg文件有关。原因通常是NetworkManager版本更新后,配置文件格式或默认行为变了。

排查思路:

# 看网络服务状态 systemctl status NetworkManager journalctl -u NetworkManager -n 50

如果是NetworkManager起不来,可以临时用systemd-networkd或直接手动配置IP顶一下。对于纯静态IP场景,我的经验是升级前先把/etc/sysconfig/network-scripts/ifcfg-*备份一份,出了问题能立刻对照。

5.4 问题速查表

现象可能原因排查命令解决办法
dnf不识别离线源repodata缺失ls /opt/openeuler-offline/BaseOS/repodata执行createrepo_c生成
依赖冲突包版本不完整dnf update --assumeno补包后createrepo_c --update
/boot写满旧内核残留df -h /boot清理旧内核文件
升级后网络不通NetworkManager配置变化systemctl status NetworkManager恢复配置备份,或手动配IP
重启后内核未变grub默认项未更新grubby --default-kernelgrubby --set-default设置新内核
升级中断网络或人为中断dnf history list重新执行dnf update,dnf会接续事务

6. 离线升级包的延伸玩法

6.1 一台离线源供全网使用

手工把离线包拷贝到每台机器效率太低。实际的离线环境,我更推荐这样操作:找一台内网服务器,把离线包放到/var/www/html/openeuler-offline或用Nginx共享,然后其他机器配repo时用baseurl=http://内网IP/openeuler-offline/BaseOS。这样整个内网的机器都能同时用来升级,而且后续打补丁只需更新这一台源服务器。

6.2 顺带解决软件离线安装

离线源还可以当本地软件仓库用。比如内网机器要装Docker、Miniconda、vsftpd这类常见软件,如果离线包里没有这些包,可以在一台有外网的机器上用dnf download把包拉下来,再补充到离线源的Packages目录并更新repodata。这样整个内网就都能dnf install了,不用一台台传rpm包。

6.3 新机器离线装系统

如果你手里还有openEuler 22.03 LTS SP3的everything ISO,那配合离线包就更顺手。用VMware新建虚拟机或物理服务器安装时,直接挂载ISO完成基础系统安装,装完再用离线源执行dnf update补齐补丁。整个流程不需要外网,适合批量部署同版本系统的场景。

写在最后

做离线升级这件事,最耗费精力的不是升级动作本身,而是提前想清楚整个依赖链和回滚方案。我的习惯是:拿到任何离线升级包,先在测试环境完整走一遍流程,记录每个阶段的输出和耗时,然后再去生产环境执行。这也是为什么我整理的这套步骤看起来偏保守——因为生产环境里,稳定永远比速度重要。

最后再分享一个小建议:离线升级包一旦制作完毕,建议在源服务器上用md5sum生成一份校验清单,拷贝到内网后先校验一次再使用,防止传输过程中文件损坏。这个习惯帮我避免过好几次“拷贝损坏导致升级失败”的低级事故。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询