先把当时的情况摆出来。CentOS 7 从 3.10.0-957 换成自己编译的 4.19 内核,重启后 docker 起不来,日志是 failed to load nf_conntrack: unknown symbol,所有容器网络不通,宿主机 iptables 也加载失败。

这类报错背后常见的原因有几处,逐个排除就行。自编译内核时没开 CONFIG_NF_CONNTRACK,模块文件根本没生成。少数情况下是modules.dep 还是旧内核的,modprobe 按旧索引找不到模块。

还有一种情况,docker 依赖 nat 表与 xt 系列匹配模块,内核里只编了 basic netfilter。

动手时先确认模块在不在

modinfo nf_conntrack; modprobe -v nf_conntrack

急需恢复就先回旧内核

grub2-set-default 0 && reboot

接着重编时打开相关选项

在 menuconfig 里启用 NF_CONNTRACK 与 NETFILTER_XT_MATCH 系列后 make modules_install

剩下的就是重建依赖并重启 docker

depmod -a $(uname -r) && systemctl restart docker

这类问题以前遇到过,但这次的触发条件和上次不一样。

这类改动我都写进变更记录,过两周再出问题时能对上号。

怎么算真的好了,看的是同一批现象。lsmod 里能看到 nf_conntrack,iptables -t nat -L 无报错,docker run –rm alpine ping -c1 8.8.8.8 能通。

这里还有个坑。自编译内核最容易漏的就是 netfilter 这一组,升内核前先照着旧内核的 /boot/config 逐项对比,比事后救火省太多。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189