释放小七猫的分享欲

Linux 系统维护启示录:一次 Neovim 配置引发的启动故障

tags: NAS
@ 09/07/2026

Linux 系统维护启示录:一次 Neovim 配置引发的启动故障

在 Linux 的使用过程中,我们常常追求极致的个性化配置。然而,一次看似简单的编辑器替换,却可能导致系统无法启动的严重后果。这里记录了一次因将系统默认编辑器替换为 Neovim 而引发的内核更新故障,希望能为大家提供一些有价值的经验教训。

故障现象

在 Fedora Server 系统上执行内核更新后,重启时 GRUB 报错:

error: .././grub-core/fs/btrfs.c:find_path:2153:file
`/boot/initramfs-7.1.3-200.fc44.x86_64.img' not found.

Failed to boot both default and fallback entries.

新内核的 initramfs 文件缺失,导致系统无法启动。虽然旧内核仍可进入系统,但新内核完全不可用。

问题根源剖析

表面原因:initramfs 文件缺失

内核更新时,RPM 包虽然解压了内核文件(vmlinuz),但在执行安装后脚本(post-install script)生成 initramfs 时失败,且该失败并未导致 RPM 安装过程回滚,最终留下了不完整的系统状态。

大白话说,就是即便出现 ERROR,dnf 的安装过程也能够走完,但生成的 initramfs 是不可用的。

根本原因:/bin/vi 被替换引发的依赖链断裂

根本原因在于我在安装系统之后,卸载了 vim-common 和 vim-minimal 包,将所有的编辑器替换为了 neovim。

然后我将系统默认编辑器/bin/vi软链接到了/bin/nvim(Neovim),同时移除了vim-minimal包,从而实现整个系统编辑器的替换。

这导致:

  1. dracut 的打包逻辑:dracut 在构建 initramfs 时,会打包/bin/vi及其所有动态库依赖,以确保救援模式下有编辑器可用。

  2. 绝对路径依赖问题:Neovim 编译时,对lpeg.so使用了绝对路径依赖(/usr/lib64/lua/5.1/lpeg.so)。dracut 在处理这种绝对路径依赖时解析失败,直接终止 initramfs 生成过程。

  3. 设计冲突:dracut 要求 initramfs 必须完全自包含,宁可构建失败也不生成不完整的镜像。而 Neovim 的复杂依赖链与这一要求产生冲突。

  4. 错误不会滚:即便内核安装过程中已经报错,但 dnf 仍然在 grub 中新增了内核启动选项并有可能成为默认,导致无法开机。

dracut扫描/bin/vi → 发现指向nvim → 解析nvim依赖 → 遇到绝对路径lpeg.so → 解析失败 → 终止构建

initramfs 的角色理解

initramfs 不仅是存放硬件驱动的压缩包,更是一个微型根文件系统,包含:

  • 存储驱动和文件系统模块
  • LVM/RAID工具
  • 基础用户态环境(shell、mount、vi 编辑器等)

当系统启动失败时,initramfs 会提供一个救援 Shell 环境,允许管理员手动修复系统。这就是为什么 dracut 如此坚持要打包/bin/vi——救援模式下没有编辑器将寸步难行。

解决方案

首先在 Grub 界面选择旧内核启动进入系统,删除原本的vi、vim软链接:

rm -rf /bin/vi /bin/vim

最佳方案:恢复 vim-minimal

这是最安全、最符合 Linux 设计的方案:

# 1. 安装vim-minimal(轻量级,无lua依赖)
dnf install vim-minimal

# 2. 恢复/bin/vi指向vim-minimal(一般安装后自动完成)
# 确认指向正确
which vi  # 应显示/usr/bin/vi

# 3. 重新生成initramfs
dracut --force /boot/initramfs-内核版本号.img 内核版本号

# 4. 更新GRUB配置
grub2-mkconfig -o /boot/grub2/grub.cfg

# 5. 重启验证
reboot

优势:

  • /bin/vi → vim-minimal(系统级,供 dracut 和救援模式使用)
  • nvim 命令独立存在(用户级,供日常开发使用)
  • 两者互不干扰,各司其职

替代方案:重装内核

如果只是安装脚本执行不完整:

dnf reinstall kernel-core-内核版本号

经验教训:Linux 核心工具管理原则

核心思想:区分"基础设施"与"应用软件"

  • 基础设施:/bin/、/sbin/、/etc/、/usr/lib/下的系统核心文件,如/bin/vi、/bin/sh、glibc 库等。
  • 应用软件:通过包管理器安装的普通应用,如 Neovim、VSCode、Chrome 等。

原则:基础设施像大楼的承重墙,应用软件像家具——你可以随意更换家具,但绝不能为了美观去敲承重墙。

对于本次踩坑的需求,安装 neovim 后用nvim命令启动;应当将alias vi=nvim写在~/.bashrc(仅对当前用户生效),不应当直接修改/bin/vi软链接指向/bin/nvim(全局修改)

总结

Linux 系统的魅力在于高度的可定制性,但这种自由也伴随着责任。系统核心工具就像一个精密的钟表内部齿轮——每个零件都有其存在的理由,随意替换可能引发连锁故障。

个人习惯(如偏好 Neovim)应隔离在用户空间(~/.bashrc、容器、虚拟环境),而不是侵入系统空间。当需要修改系统级配置时,优先使用官方提供的机制(如 alternatives、sysctl、systemd 配置),而不是手动覆盖文件。