最近在做OVS相关的工作,安装完OVS后,没啥大问题,基本上也都可以按照流程走下去,但是重启机器后,当我重新启动OVS的时候,就出现了问题:
openvswitch-not-loaded
大意就是说我在启动ovs-vswitchd进程的时候,没有提前加载Open vSwtich的内核模块。网上有人和我有类似的问题,按照别人的解决方案执行sudo modprobe openvswitch之后,重新启动ovsdb-serverovs-vswitchdOVS就可以正常使用了,但是也引发我开始考虑modprobe与之前了解过的insmod有什么区别

modprobeinsmod的区别

在Linux系统中,modprobe和insmod都可以用来加载module,不过现在一般都是推荐modprobe而不是insmod。modprobe和insmod的区别在于
1.modprobe可以解决module加载过程中依赖关系问题,而insmod不行。举个例子,比如load moduleA,而moduleA依赖moduleB,那么这时候如果要使用insmod就得手动先去load moduleB,再去load moduleA.而用modprobe来load moduleA的话,modprobe会自动读取/lib/modules/<kernel-version>/modules.dep文件来自动查找moduleA依赖那些模块,先加载依赖模块moduleB,在加载moduleA.
比如我们可以手动到modules.dep文件中查看下openvswtich的依赖项

1
2
3
$ cat /lib/modules/`uname -r`/modules.dep|grep openvswitch

kernel/net/openvswitch/openvswitch.ko: kernel/net/ipv4/gre.ko kernel/drivers/net/vxlan.ko kernel/net/ipv4/ip_tunnel.ko kernel/lib/libcrc32c.ko

这里可以看出openvswitch.ko依赖vxlan.koip_tunnel.kolibcrc32c.ko,modprobe会自动读取这些依赖,并加载

2.modprobe与inmod查找的目录不一样。modprobe默认去/lib/modules/<kernel-version>下面查找module,而insmod只在给它的参数中去找module(默认情况在当前目录下查找)。
不过insmod也有它的有用之处,比如我们在/home/caffee/目录下有一个my-mod.ko这个module,如果我们这个cd到/home/caffee,执行inmod my-mod.ko就可以插入这个module,但是如果用modprobe my-mod.ko却会提示FATAL:Module my-mod,ko not found,这就是应为modprobe此时是到/lib/module/<kernel-version>下面去找module,没有找到就报错了

ps:对于modprobe modulename 而言,modulename参数中_-是不区分的。