Linux升级内核后ZFS模块加载不起来怎么办

Linux 服务器例行升级,重启之后 ZFS 存储池集体失联,执行命令报错 “The ZFS modules are not loaded, try running ‘/sbin/modprobe zfs’ “,按提示敲 modprobe 也无效。池里的数据还在不在?服务器还能不能救回来?

原因

ZFS 在 Linux 上是树外内核模块——它的开源协议与内核主线的 GPL 不兼容,没法随内核一起发行,各发行版靠 DKMS 这套机制在每装一个新内核时现场编译一份 ZFS 模块。内核升级后出问题,几乎都是 DKMS 没有为新内核编译出对应的 zfs 模块:常见原因是新内核的头文件(linux-headers)没装、DKMS 自动安装服务没开,或者 ZFS 版本暂时追不上太新的内核。数据本身没坏,池只是"没有驱动去认它”。

分步解决

  1. 先走退路:重启进启动菜单,选升级前的旧内核启动——旧内核的 zfs 模块还在,起来后 zpool status 一般就能看到池全部在线。先保证业务,再修新内核。
  2. 确认现场uname -r 看当前内核版本;dkms status 看有没有 zfs 模块、是给哪个内核版本编的——列表里没有当前内核版本,问题就坐实了。
  3. 补齐编译条件:安装与当前内核匹配的头文件包,确认 zfs 的 dkms 包已安装(发行版不同包名略有差异,以所用发行版文档为准)。
  4. 触发编译:执行 DKMS 的自动安装命令为当前内核编译并安装 zfs 模块,盯输出有没有报错;编译失败且提示版本不支持,说明 ZFS 还没适配这个内核——短期内留在旧内核,等上游更新。
  5. 验证并固化modprobe zfs 加载成功后 zpool status 确认所有池健康;开启 DKMS 的自动安装服务并确认每次内核更新会自动带上头文件,下次升级就不会再中招。

预防

跑 ZFS 的机器把内核升级当成"变更"来管:升级前确认 DKMS 服务正常、头文件源可用,升级后先 dkms status 核一眼再重启;系统里至少保留一两个旧内核当退路,别让自动清理把救命的旧内核删掉。存储服务器的内核求稳不求新,例行升级安排在能接受停机排查的时间窗里做。