1.背景
虚拟机kernal版本号:linux 3.10.0-
编译kernal版本号:linux 3.10.68
2.问题描述
make install时出现:
depmod: ERROR: could not open directory /lib/modules/3.10.68: No such file or directory
3.问题解决
mkdir -p /lib/modules/3.10.68
再次make install出现:
depmod: WARNING: could not open /lib/modules/3.10.68/modules.order: No such file or directory
depmod: WARNING: could not open /lib/modules/3.10.68/modules.builtin: No such file or directory
解决办法:拷贝源码目录下的modules.order和modules.builtin到/lib/modules/3.10.68下
再次make install 问题解决。
4.出现新问题
到/lib/modules/3.10.68/kernel/drivers/char/ipmi
insmod XXX.KO时提示:
insmod: ERROR: could not insert module ipmi_msghandler.ko: Invalid module format
使用dmesg | grep module查看:
3595.639247] ipmi_msghandler: module_layout: kernel tainted.
ipmi_msghandler: version magic '3.10.68 SMP mod_unload ' should be '3.10.0-957.el7.x86_64 SMP mod_unload modversions '
4.1 由于运行内核和编译内核不同造成的,暂且使用如下解决方法。
4.1.1 更新内核相同/接近的源码,和内核一起编译,编译后make install和make module_install。虚拟机重启后选择自己刚刚编译的内核版本启动.
下载3.10.0-957.el7.x86_64源码:kernel-3.10.0-957.el7.src.rpm
Index of /7.6.1810/os/Source/SPackages (centos.org)https://vault.centos.org/7.6.1810/os/Source/SPackages/
解压 rpm2cpio
kernel-3.10.0-957.el7.src.rpm | cpio -idmv
tar -xf linux-3.10.0-957.el7.tar.xz
//此处如果使用arch/x86/下default_config会有编译错误,所以使用外面的config
cp -r -f kernel-3.10.0-x86_64.config linux-3.10.0-957.el7/.config
make all
make modules_install
重启虚拟机后并选择自己刚刚编译的内核版本。
再insmod xxx.ko问题解决
4.1.2 使用和当前运行版本相同的源码做module编译,不需要重新编译内核和重启。
yum install kernel-devel
当前源码默认下载解压到 /usr/src目录下(/usr/src/kernels)。
修改自己新增模块的Makefile,将内核目录指定到/usr/src/kernels下源码目录,如下图:
在内核源码目录下新增kconfig和make menuconfig勾选新增的ko选项形成新的.config。
然后在自己的module目录下编译make clean,然后make all。
在当前.ko目录下,insmod xxx.ko。
问题解决.
4.1.2.1 在ipmi基础上新增一个KO
有两种方法:新增源码路径下的kconfig和强制编译(该方法比较省事)
4.1.2.1.1.kconfig
/usr/src目录下新增Kconfig选项
并make menuconfig选中。
修改自己模块中的Makefile:
最后在自己模块目录下make all即可.
4.1.2.1.2 强制编译
如果项目简单不需要新增Kconfig,直接强制编译.该方法比较省事,不用再修改下载源码路径中的kconfig和menuconfig.
最后在自己模块目录下make all即可.