使用的软件依赖内核模块 openvswtich.ko
。
平常使用时都是用 modprobe openvswitch
手工加载模块。后来有比较上一段时间没有使用,内核也升级逐渐了几次。后面使用就发现 modprobe openvswitch
会提示错误:
root@u20:~# modprobe openvswitch
modprobe: FATAL: Module openvswitch not found in directory /lib/modules/5.4.0-91-generic
确认内核及相关系统软件都是 5.4.0-91
, 其他旧内核后面也删除了。
通过文件查找发现确实没有 openvswtich.ko
内核模块文件
再后来,通过各种研究,发现重装内核模块软件 linux-modules-5.4.0-91-generic
可以解决问题, openvswtich.ko
也回来了 modprobe openvswitch
也能成功。
可是,只要一重启,一切回到原样。 系统还把我重装 linux-modules-5.4.0-91-generic
补回来的文件给删了,删掉了好多文件, /lib/modules/5.4.0-91-generic/kernel/net/openvswitch/openvswitch.ko
是其中之一。 整个/lib/modules/5.4.0-91-generic/kernel/net/openvswitch/
文件夹都被删了。/lib/modules/5.4.0-91-generic/kernel/net
还有很多文件夹被删掉(重装所添加的文件夹都被删了)。
你怎么升级内核的?如果你是通过更新
linux-generic
包那你什么都不用做,因为这个包是个元数据包,会对应依赖最新版本的linux-image-generic
,传递依赖同版本的linux-modules-xxx-generic
依赖图如下:
同时apt任务会自动调用
update-initramfs -u
更新initramfs。如果你是编译安装内核更新的,那么你需要手动执行上述这些全部内容。开机自动加载的module(就是你需要执行
modprobe
的那些模块)可以写入配置文件/etc/modules-load.d/modules.conf
,开机的时候系统会帮你自动调用modprobe
加载。我的猜测是你更新内核的时候是不是还调用了诸如
autoremove
之类的命令清理掉了旧内核(或者等同的配置了/etc/apt/apt.conf.d/01autoremove-kernels
),它会删掉旧内核,于是依赖的module模块自然被一并删除了,你升级之后又降级内核回来自然不会给你再把module包装回来。EDIT:
我知道怎么回事了。无论
linux-modules-xxx-generic
还是linux-modules-extra-xxx-generic
都不包含openvswtich.ko
。因此这个模块肯定是你自己编译的,自己编译的内核模块记得一定要加到
dkms
中,这样内核更新的时候会自动调用dkms命令生成新的内核模块,否则内核每次更新你都得手工编译一次才能生成对应内核版本的模块,麻烦