Skip to content

一次真实生产事故复盘:LD_LIBRARY_PATH 污染导致 dracut 失败、XFS 无法挂载

摘要

在一台 GPU / HPC 服务器上,系统在一次重启后直接进入 emergency mode,并报错:

bash
mount: unknown filesystem type 'xfs'
Failed to mount /sysroot

表面看是 XFS 文件系统异常,但最终确认:文件系统与磁盘完全正常,真正的根因是系统环境变量污染,导致 initramfs 生成阶段失败。


一、问题现象

系统启动阶段失败,进入 emergency shell,关键日志如下:

bash
Failed to mount /sysroot
Dependency failed for Initrd Root File System

直觉上很容易误判为:XFS 损坏、磁盘/RAID 异常或 initramfs 本身损坏。但后续检查发现,//boot 分区在系统启动后手动挂载完全正常。


二、异常线索:blkid 行为严重异常

在系统中执行:

bash
blkid -V

得到的结果却是:blkid 1.0.0 (12-Feb-2003)。 而系统实际安装的是 util-linux-2.23.x (CentOS 7)

进一步表现为:

  • blkid -u / -kinvalid option
  • dracut -f 过程中反复报 blkid 参数错误。
  • initramfs 中 缺失 xfs.ko

三、关键机制:dracut 为什么依赖 blkid?

dracut 在生成 initramfs 时,会调用 blkid 识别根分区类型,决定是否打包 xfs.ko。当 blkid 行为异常(版本退化)时,dracut 无法识别 XFS,导致生成的启动镜像缺失 XFS 支持,启动阶段自然报 unknown filesystem type 'xfs'


四、真正根因:系统级 LD_LIBRARY_PATH 污染

最终回溯发现,/etc/profile 或 root 的 .bashrc 中存在:

bash
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/home/software/openmpi-4.0.5/lib:$LD_LIBRARY_PATH

问题本质: LD_LIBRARY_PATH 污染了系统工具链。blkid / dracut / mount / systemd 在运行时加载了非系统版本的动态库,导致行为直接退化到“2003 年接口语义”。


五、修复步骤

  1. 强制恢复系统工具一致性
    bash
    rpm -Uvh --force --replacepkgs e2fsprogs-libs-*.rpm e2fsprogs-*.rpm util-linux-*.rpm
  2. 重建 initramfs
    bash
    dracut -f -v
    lsinitrd /boot/initramfs-$(uname -r).img | grep xfs
  3. 更新 grub 并重启
    bash
    grub2-mkconfig -o /boot/grub2/grub.cfg && reboot

六、结构性整改(生产级建议)

  • ❌ 错误做法:在 /etc/profile 中全局设置 LD_LIBRARY_PATH
  • ✅ 正确做法:使用 ldconfig 管理库路径,或通过 Environment Modules / Lmod 按需加载。
    bash
    echo "/usr/local/cuda/lib64" > /etc/ld.so.conf.d/cuda.conf
    ldconfig

七、总结

凡是会影响 blkid / dracut / systemd 的环境变量,都不应出现在系统全局环境中。 区分“系统环境”与“计算环境”是 HPC 基础设施稳定的前提。

AI-HPC Organization