先把当时的情况摆出来。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 逐项对比,比事后救火省太多。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
