简介:面向 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 -m | x86_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-kernel | grubby --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生成一份校验清单,拷贝到内网后先校验一次再使用,防止传输过程中文件损坏。这个习惯帮我避免过好几次“拷贝损坏导致升级失败”的低级事故。
本文还有配套的精品资源,点击获取