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 版本暂时追不上太新的内核。数据本身没坏,池只是"没有驱动去认它”。
分步解决
- 先走退路:重启进启动菜单,选升级前的旧内核启动——旧内核的 zfs 模块还在,起来后
zpool status一般就能看到池全部在线。先保证业务,再修新内核。 - 确认现场:
uname -r看当前内核版本;dkms status看有没有 zfs 模块、是给哪个内核版本编的——列表里没有当前内核版本,问题就坐实了。 - 补齐编译条件:安装与当前内核匹配的头文件包,确认 zfs 的 dkms 包已安装(发行版不同包名略有差异,以所用发行版文档为准)。
- 触发编译:执行 DKMS 的自动安装命令为当前内核编译并安装 zfs 模块,盯输出有没有报错;编译失败且提示版本不支持,说明 ZFS 还没适配这个内核——短期内留在旧内核,等上游更新。
- 验证并固化:
modprobe zfs加载成功后zpool status确认所有池健康;开启 DKMS 的自动安装服务并确认每次内核更新会自动带上头文件,下次升级就不会再中招。
预防
跑 ZFS 的机器把内核升级当成"变更"来管:升级前确认 DKMS 服务正常、头文件源可用,升级后先 dkms status 核一眼再重启;系统里至少保留一两个旧内核当退路,别让自动清理把救命的旧内核删掉。存储服务器的内核求稳不求新,例行升级安排在能接受停机排查的时间窗里做。