CentOS7更新CPU微码引发系统卡死与YUM缓存损坏问题复盘
· 开发
适用环境
- CentOS 7.x (x86_64)
- 执行
yum update时包含microcode_ctl包
问题现象
2019 年底,大量 CentOS 7 运维人员在执行 yum update -y 时,系统在更新 microcode_ctl 固件包的中途完全卡死,键盘/网络均无响应。强制断电重启后,系统虽然能启动,但执行任何 yum 命令均报错:
Error: Cannot retrieve repository metadata (repomd.xml) for repository: base. Please verify its path and try again
或
Could not open/read repomd.xml
排查过程
- 检查
/var/log/messages,发现有微码更新失败的记录。 - 执行
yum clean all清理缓存,问题依旧。 - 手动删除
/var/cache/yum/*后执行yum makecache,仍然报错。 - 检查
/etc/yum.repos.d/下 repo 文件,元数据 URL 访问正常,问题出在本地缓存写入环节。
根本原因
microcode_ctl 包用于更新CPU微码,更新过程会向 /dev/cpu/*/msr 写入数据。部分旧款CPU(例如 Intel Haswell 特定步进)与新版微码不兼容,直接触发内核卡死(kernel hang)。
强制重启后 YUM 事务没有正常结束,repomd.xml 缓存文件损坏,同时缓存锁文件未释放,最终导致 YUM 包管理器完全不可用。
解决方案
抢救修复 YUM
rm -rf /var/cache/yum/*
rm -rf /var/lib/yum/*
rpm --rebuilddb
yum clean all
yum makecache
屏蔽 microcode_ctl 包更新
编辑 /etc/yum.conf,增加排除配置:
exclude=microcode_ctl
微码模块异常恢复
如果 /dev/cpu/*/msr 设备节点缺失,加载 msr 内核模块:
modprobe msr
预防措施
- 业务服务器尽量避开生产高峰执行系统更新。
kernel、microcode_ctl这类高危包,务必先在测试环境验证,再灰度上线。- 更新时临时跳过该包:
yum --exclude=microcode_ctl update
相关 Issue
- Red Hat Bugzilla – Bug 1764074:microcode_ctl 更新导致系统冻结