我安装了以下内核:
[root@localhost ~]# uname -r
2.6.32-573.el6.x86_64
以及以下内核源代码:
linux-2.6.32-573.1.1.el6.x86_64
我正在尝试使用该内核源代码为我自己的内核编译内核模块。
在内核源代码的 Makefile 中,我编辑了 EXTRAVERSION 设置:
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# cat Makefile | grep "EXTRAVERSION ="
EXTRAVERSION = 2.6.32-573.el6.x86_64
并使用以下命令来编译模块:
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# make M=~/hw/
LD /root/hw/built-in.o
CC [M] /root/hw/hello_world.o
Building modules, stage 2.
MODPOST 1 modules
CC /root/hw/hello_world.mod.o
LD [M] /root/hw/hello_world.ko.unsigned
NO SIGN [M] /root/hw/hello_world.ko
但是当我尝试安装它时,我收到以下错误:
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# insmod ~/hw/hello_world.ko
insmod: error inserting '/root/hw/hello_world.ko': -1 Invalid module format
modinfo 的输出是:
[root@localhost linux-2.6.32-573.1.1.el6.x86_64]# modinfo ~/hw/hello_world.ko
filename: /root/hw/hello_world.ko
license: GPL
srcversion: A8BB878B88F36D3A046026C
depends:
vermagic: 2.6.32-573.el6.x86_64 SMP mod_unload modversions
我可以为当前内核编译模块而无需安装其内核源吗?
附加信息:
操作系统:最低 CentOS 6.7。分发二进制文件。
遵循本指南:http://wiki.centos.org/HowTos/I_need_the_Kernel_Source
并从这里下载了 linux-2.6.32-573.1.1.el6.x86_64 的源代码:
http://vault.centos.org/6.7/updates/Source/SPackages
我知道我可以下载特定内核的源代码,但最终我实际上想为我找不到源代码的内核版本构建模块(仍然是 2.6.32),所以这就是我想要的原因这样做。
答案1
其实这里有两点需要关心:
正在运行的内核版本是否与我们正在使用的源相同。由于先前编译的内核可能不具有最新版本中可能使用的所有依赖项,而使用最新内核源编译外部模块可能依赖于代码的任何部分,这些部分仅存在于最新版本中。因此,建议使用我们使用外部模块的最新版本内核。
二、用于内核编译的.config 文件 您可以将其从文件系统的/boot/config(current-version)* 复制到内核源代码顶层目录中的.config。当前版本我们可以从 uname -r 获取它
因此,如果运行版本(使用命令 uname -r 检查)不等于下载的源代码,那么您需要编译并使用新内核,或者下载与运行内核相同版本的内核。对于内核编译,请使用引导目录中存在的配置文件,按照上述方式复制它。
然后您可以继续以正常方式编译外部模块并加载正在运行的内核,没有任何问题。