核查时间:2026 年 9 月 9 日凌晨(北京时间)
本次已在 x86_64 和 aarch64 两个架构上复现:从 openEuler 22.03 LTS SP4 官方预装系统出发,正常执行 dnf -y update,事务成功后直接重启,默认新内核无法完成启动。
故障来自当前 Update 仓库提供的 dracut-055-20.oe2203sp4。内核更新过程中自动生成的 initramfs 带入了该包中有语法错误的公共启动脚本。上游已经合并修复并构建 Release 21,但本次核查的官方源和镜像入口仍提供 Release 20。
近期更新过内核或重建过 initramfs 的用户,建议在重启前检查。应重点检查由 dracut 055-20 生成的启动镜像,并保留已知可启动的旧内核及其 initramfs。
实际重启时的控制台错误
两个架构初始均为 216 内核、dracut 055-13,能够正常启动。完整更新后均为 331 内核、dracut 055-20,DNF 返回 0,事务历史记录 Return-Code: Success。正常重启后,串口出现以下错误,摘录自 x86_64 的实际启动日志:
[ 0.972613] dracut-cmdline[266]: /lib/dracut-lib.sh: line 460: unexpected EOF while looking for matching `)'
[ 0.975256] dracut-cmdline[266]: /lib/dracut-lib.sh: line 1158: syntax error: unexpected end of file
[ 1.000416] dracut-cmdline[307]: /bin/dracut-cmdline: line 45: make_trace_mem: command not found
[ 1.038025] dracut-cmdline[347]: /bin/dracut-cmdline: line 54: label_uuid_to_dev: command not found
[ 1.155914] dracut-initqueue[413]: /lib/dracut-lib.sh: line 460: unexpected EOF while looking for matching `)'
约 193 秒后,x86_64 继续输出:
[ 193.355870] dracut-initqueue[413]: Warning: dracut-initqueue: timeout, still waiting for following initqueue hooks:
[ 193.358684] dracut-initqueue[413]: Warning: /lib/dracut/hooks/initqueue/finished/devexists-.sh: "if ! grep -q After=remote-fs-pre.target /run/systemd/generator/systemd-cryptsetup@*.service 2>/dev/null; then
[ 193.363391] dracut-initqueue[413]: [ -e "" ]
[ 193.364633] dracut-initqueue[413]: fi"
[ 193.367791] dracut-initqueue[3590]: /bin/dracut-initqueue: line 111: emergency_shell: command not found
[ 193.370254] dracut-initqueue[413]: Warning: Not all disks have been found.
[ 193.372043] dracut-initqueue[413]: Warning: You might want to regenerate your initramfs.
aarch64 出现同样的解析错误、缺失函数及空设备路径等待,并在约 203 秒后报告 emergency_shell: command not found 和 Not all disks have been found。两个系统均未恢复正常登录。
问题在哪里
错误位于 /usr/lib/dracut/modules.d/99base/dracut-lib.sh,是 CVE-2026-15816 修复补丁适配时引入的引号错误。仍在运行的系统可以先做只读检查:
rpm -q dracut
bash -n /usr/lib/dracut/modules.d/99base/dracut-lib.sh
在 openEuler 实验机的 Release 20 上,检查返回非零状态,输出包括:
line 460: unexpected EOF while looking for matching `)'
line 1158: syntax error: unexpected end of file
不同 Bash 版本报告的行号和未闭合字符可能不同。Release 21 的同一文件通过语法检查。
dracut 的 99base 模块会把该文件复制为 initramfs 中的 /lib/dracut-lib.sh,正常启动路径中的脚本会加载它。当前发布的 kernel RPM 在事务后脚本中调用 new-kernel-pkg --mkinitrd --dracut,因此包含内核更新的 DNF 事务会自动生成 initramfs,并将这个错误带入启动过程。
官方修复与仓库现状
时间线如下:
- 8 月 24 日,相关安全修复进入 22.03 LTS SP4 分支,包版本为
055-20.oe2203sp4 - 8 月 25 日,上游提交修正引号,并将 Release 提升为 21;见修复提交和合并请求 !217
- 8 月 26 日,官方 EulerMaker 已有两个架构的 Release 21 构建产物
- 8 月 30 日,官方发布的 openEuler-SA-2026-3501 数据仍将
055-20.oe2203sp4列为 CVE 修复版本;Update 20260824 发布公告也包含该安全修复 - 9 月 9 日凌晨,本次检查的 12 个入口、两个架构,共 24 组 Update 元数据,最新 dracut 均仍是 Release 20
检查范围包括 repo.openeuler.org、OpenAtom CDN 入口、CERNET 联合镜像,以及阿里云、腾讯云、华为云、清华、中科大、南京大学、哈工大、ISRC、PS.kz 镜像。CERNET 本次重定向至南京大学镜像。
检查时逐个读取 repomd.xml 和 primary 元数据,再下载对应 RPM 核对校验值。两个架构的 Release 20 主包均通过官方签名验证,同架构各入口下载的文件一致。因此,当前仅更换这些镜像站不能解决问题。
重启前还应检查什么
bash -n 检查的是系统中的源文件。若曾在 Release 20 下更新内核或重建 initramfs,还应检查准备启动的那份镜像中的脚本。
先查看当前运行内核和默认启动项:
uname -r
sudo grubby --default-kernel
ls /boot/initramfs-*.img
以默认启动项对应的 initramfs 为检查目标,可以这样提取脚本并做语法检查;将第一行替换为实际文件名:
image=/boot/initramfs-实际内核版本.img
check_dir=$(mktemp -d)
if sudo lsinitrd -f lib/dracut-lib.sh "$image" > "$check_dir/dracut-lib.sh" \
&& test -s "$check_dir/dracut-lib.sh"; then
bash -n "$check_dir/dracut-lib.sh"
else
echo '未能提取到脚本,请检查镜像路径、内容和 lsinitrd 的报错'
fi
上述代码在提取成功且文件非空时进行语法检查。确认目标镜像中的脚本已修复,并保留可用的旧启动项,再安排重启。
修复与恢复建议
优先使用包含修复的官方 dracut 包,并同步更新已经安装的 dracut-network、dracut-squash 等同源子包。检查时官方 Update 尚未提供 Release 21,但官方 EulerMaker 已有签名构建产物:
同一构建目录下有对应子包。这些官方构建产物尚待纳入 Update 发布,建议社区尽快完成正式发布并提供统一修复指引。安装时保留签名校验。
修复系统中的 dracut 后,还需为受影响的目标内核重新生成 initramfs,检查其中的脚本,再安排启动验收。操作前应备份目标 initramfs,并保留已知可用的旧内核及其启动镜像。
已经无法启动的机器,可以先尝试保有原始 initramfs 的旧内核启动项。若备用启动镜像也受影响,应使用救援介质或挂载系统盘修复。
已有实验与需要社区确认的事项
本轮使用官方预装盘的独立克隆做了正常更新、重启验证,两个架构均直接复现上述故障。另设同源修复对照,先装官方 dracut 21 及匹配子包,再执行同一条全量更新命令和重启。两个架构的修复对照均正常进入相同 331 内核、恢复 SSH,systemctl is-system-running 返回 running,失败单元均为 0;各架构对照间的完整软件包清单仅有三个 dracut 同源包的 20/21 版本差异。
目前受影响机器数量仍待统计。
希望社区尽快确认:Release 21 为什么尚未进入 Update;是否需要撤回或替换 Release 20;如何提醒已经安装该包、尤其已经重建 initramfs 的用户;是否将更新内核后的启动测试及启动脚本语法检查纳入回归验证。