我正在尝试构建和加载一个简单的内核模块。我能够构建模块,但无法加载它。
skm.c
#include <linux/module.h>
#include <linux/version.h>
#include <linux/kernel.h>
static int __init skm_init(void)
{
printk(KERN_INFO "Hello");
return 0;
}
static void __exit skm_exit(void)
{
printk(KERN_INFO "Good Bye");
}
module_init(skm_init);
module_exit(skm_exit);
生成文件
KERNEL_SOURCE := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
obj-m += skm.o
all:
make -C $(KERNEL_SOURCE) M=$(PWD) modules
clean:
make -C $(KERNEL_SOURCE) M=$(PWD) clean
insmod命令失败并显示“Permission Denied”错误。
[user1@localhost LinuxKernelModules]$ make clean
make -C /lib/modules/3.10.0-514.21.1.el7.x86_64/build M=/home/user1/projects/LinuxKernelModules clean
make[1]: Entering directory `/usr/src/kernels/3.10.0-514.21.1.el7.x86_64'
CLEAN /home/user1/projects/LinuxKernelModules/.tmp_versions
CLEAN /home/user1/projects/LinuxKernelModules/Module.symvers
make[1]: Leaving directory `/usr/src/kernels/3.10.0-514.21.1.el7.x86_64'
[user1@localhost LinuxKernelModules]$ make
make -C /lib/modules/3.10.0-514.21.1.el7.x86_64/build M=/home/user1/projects/LinuxKernelModules modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-514.21.1.el7.x86_64'
CC [M] /home/user1/projects/LinuxKernelModules/skm.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/user1/projects/LinuxKernelModules/skm.mod.o
LD [M] /home/user1/projects/LinuxKernelModules/skm.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-514.21.1.el7.x86_64'
[user1@localhost LinuxKernelModules]$ sudo insmod skm.ko
[sudo] password for user1:
insmod: ERROR: could not load module skm.ko: Permission denied
目录和目标文件具有写入和执行权限。并且user1具有与root相同的权限。
[user1@localhost LinuxKernelModules]$ ls -al
total 296
drwxr--r--. 3 user1 user1 4096 Jun 6 16:52 .
drwxrwxrwx. 11 user1 user1 4096 Jun 5 18:42 ..
-rwxr--r--. 1 user1 user1 831 Jun 2 11:58 fcdm.c
-rwxr--r--. 1 user1 user1 811 Jun 6 16:28 Makefile
-rw-rw-r--. 1 user1 user1 58 Jun 6 16:52 modules.order
-rw-rw-r--. 1 user1 user1 0 Jun 6 16:52 Module.symvers
-rwxr--r--. 1 user1 user1 2146 Jun 2 17:53 scdm.c
-rwxr--r--. 1 user1 user1 397 Jun 6 16:52 skm.c
-rwxr--r--. 1 user1 user1 94872 Jun 6 16:52 skm.ko
-rw-rw-r--. 1 user1 user1 279 Jun 6 16:52 .skm.ko.cmd
-rw-rw-r--. 1 user1 user1 736 Jun 6 16:52 skm.mod.c
-rwxr--r--. 1 user1 user1 52848 Jun 6 16:52 skm.mod.o
-rw-rw-r--. 1 user1 user1 25181 Jun 6 16:52 .skm.mod.o.cmd
-rwxr--r--. 1 user1 user1 43560 Jun 6 16:52 skm.o
-rw-rw-r--. 1 user1 user1 25121 Jun 6 16:52 .skm.o.cmd
drwxrwxr-x. 2 user1 user1 4096 Jun 6 16:52 .tmp_versions
我在安装了内核头文件的CentOS 7计算机上运行它。 我能够在运行旧内核(2.6.x)的CentOS 6计算机上构建和加载具有相同源代码和构建配置的模块。
解决方案:
该错误是因为$HOME
目录驻留在计算机未获得root访问权限的NFS服务器上,如此answer中所述。从/tmp
目录加载模块就可以了。