如何在Linux利用Yum History Rollback实现一键回滚错误升级的核心系统底层组件包

大瑶君_7971

大瑶君_7971

2026-06-04

363人浏览

原创

yum history rollback 无法安全回滚 glibc、kernel、systemd、selinux-policy 等核心包,因设计限制:glibc 是 yum 运行基础,内核升级为追加式,systemd/SELinux 升级涉及不可逆状态变更;官方明确声明其为 non-rollbackable。

如何在linux利用yum history rollback实现一键回滚错误升级的核心系统底层组件包

Linux 中 yum history rollback 并不能安全回滚核心系统底层组件包,比如 glibc、kernel、systemd、selinux-policy 等。这不是操作不熟练的问题,而是 设计限制——YUM 明确将这些包列为“不可回滚”(non-rollbackable)。

你看到的“一键回滚”错觉,往往出现在普通应用包(如 httpd、git)上;一旦涉及底层运行时环境,yum history rollback 会跳过、报错,甚至引发更严重故障。


为什么 yum history rollback 对核心包无效?

  • glibc 是所有用户态程序的基础依赖,YUM 自身也依赖它。回滚过程中若 glibc 版本不匹配,YUM 进程可能直接崩溃或静默失败。
  • 内核(kernel)不是普通软件包:安装新内核是 追加,卸载旧内核需手动清理 /boot 和 GRUB 配置,rollback 不处理这些。
  • systemd 升级常伴随 unit 文件、目录结构、ABI 变更,历史事务无法还原文件级兼容性。
  • SELinux 策略包(selinux-policy-*)升级后策略数据库已重建,rollback 无法倒回二进制策略状态。

✅ 官方文档明确说明:
"The yum history rollback command does not support rolling back the kernel, glibc, or selinux-policy packages."
(来源:RHEL 8/9 System Administrator’s Guide)


那出问题了怎么办?分场景应对

✅ 场景一:还能进系统,只是功能异常(如网络断、服务起不来)

  • 先确认是否是单个包导致:
    rpm -Va | grep '^..5' 检查关键文件校验和变化
    journalctl -b -p 3 查看启动期错误
  • 若确定是某次 yum update 引发,且该事务 ID 可见:
    sudo yum history list → 找到对应 ID → 尝试 sudo yum history undo
    ⚠️ 注意:这是 undo(撤销单次事务),不是 rollback;它比 rollback 更可控,但仍会跳过 glibc 等包。

✅ 场景二:系统卡在启动、命令失效、连 ls 都报错(典型 glibc/systemd 崩溃)

必须用 Live 环境干预:

Obsidian (Linux)
Obsidian (Linux)

操作 Obsidian 库(纯 Markdown 笔记),并通过 notesmd-cli 实现自动化。

下载
  • 启动 Live USB(同版本 RHEL/CentOS 镜像优先)
  • 挂载原根分区:
    sudo mount /dev/sda2 /mnt
  • 绑定虚拟文件系统:
    sudo mount --bind /dev /mnt/dev && sudo mount --bind /proc /mnt/proc && sudo mount --bind /sys /mnt/sys
  • 进入原系统:
    sudo chroot /mnt
  • 手动降级(以 CentOS 7 的 glibc 为例):
    yum downgrade glibc-2.17-325.el7_9.x86_64
    (版本号需从 yum --showduplicates list glibc 中确认可用项)
  • 关键一步:重建 initramfs
    dracut -f
    否则重启仍卡在 initramfs 阶段

✅ 场景三:内核升级失败,黑屏/panic

  • 不要碰 yum rollback —— 直接进 GRUB:
    开机长按 Shift(BIOS)或 Esc(UEFI)→ 选 “Advanced options” → 选旧内核启动
  • 进系统后永久设为默认:
    sudo grub2-set-default "CentOS Linux (4.18.0-305.el8.x86_64) 8"
    sudo grub2-mkconfig -o /boot/grub2/grub.cfg
  • 如需清理坏内核:
    sudo yum remove kernel-(先确保旧版仍在且可启动)

替代方案:真正能覆盖核心包的“回滚”机制

方式 是否支持核心包 前提条件 备注
Btrfs + snapper(RHEL 9/Rocky 9+) ✅ 是 文件系统为 Btrfs,且 snapper 已启用并创建过快照 快照含 /usr /lib/modules 等,可整体还原 glibc/kernel/systemd 状态
Timeshift + RSYNC(CentOS Stream/Ubi) ❌ 否 支持 ext4,但只备份 /etc /boot /usr 等子集,不含 /lib/modules 完整内核树 对 glibc 降级有限支持,但不如 Btrfs 快照可靠
Kdump + crashkernel 回滚脚本 ⚠️ 实验性 需提前配置 kdump,捕获 panic 上下文并触发预置降级流程 企业级定制方案,非标准发行版内置

最务实建议:别等出事才想回滚

  • 升级前执行:
    sudo yum history new(显式开启新事务标记)
    sudo yum install yum-plugin-changelog(便于追溯变更细节)
  • 对 glibc、kernel、systemd 类包,永远手动验证再批量更新:
    sudo yum update --assumeno glibc kernel systemd 先预览
    成功后再 sudo yum update glibc kernel systemd
  • 生产环境强制启用:
    sudo yum install yum-cron + 配置仅自动更新 security 级别补丁
    避免非必要 yum update 全量升级

不复杂但容易忽略。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

3469

3

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

2023.07.25

2408

9

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

2023.08.02

1340

5

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.09

1278

4

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

2023.09.05

1396

5

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2298

7

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

2023.09.20

3760

8

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

2023.09.22

17515

6

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

2023.09.22

549

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习