今天编程插入模块的时候遇到了这个问题,具体报错信息如下:
insmod: ERROR: could not insert module analyze_inode.ko: Operation not permitted
看到 Operation not permitted首先想到的就是权限问题,但是我已经在超级权限下执行了这个命令,情况如下图所示:
可是在root用户或者sudo权限下还是有这个问题,再次查找资料,怀疑可能与《Linux如何解决root用户Operation not permitted》所描述的情况有关,遂参考该博客进行测试。
地址:https://jingyan.baidu.com/article/fcb5aff7786e1eedab4a7142.html
按照上面的说法,使用命令:
lsattr analyze_inode.ko
得到结果如下所示:
按照这篇经验的说法,可以看到是不含 i 属性的,所以也不存在root用户权限不足的问题。
到这里就感觉很奇怪了,试着重启了也还是有这个权限的问题,既然文件本身应该没有什么权限问题了,那么就来看看模块里面会不会遇到一些奇怪的问题导致报这样的错误。
首先使用:dmesg 看一看有没有关于模块的打印信息,在使用dmesg打印信息之前确保自己的程序里有没有对应问题的输出,比如读写一个不存在的文件等,当这个情况发生时有没有打印出相应的报错输出,如果有可以用dmesg查看,在使用之前可以先使用dmesg -c清掉内容,再插入模块,这样保证输出的信息不会很混乱。
在我这个问题下输出了如下dmesg信息:
果然打印出了一些信息,通过这些信息就可以进一步进行排查,可以看到显示出了open file error(注:这是模块代码里遇到open错误的输出,并非系统错误提示)
所以看一看代码中关于这个信息的情况,模块的关于这个报错的代码如下:
fp = filp_open("/mnt/exp/1.txt",O_RDWR | O_CREAT ,0644);
if(IS_ERR(fp))
{
printk("TABLE: open file error \n");
return -1;
}
看到这里才恍然大悟,由于重装了电脑,文件夹 /mnt/exp 不存在,所以也没办法创建和打开这个目录下的1.txt文件,现在把 /mnt/exp文件创建上再插入模块测试:
可以看到模块插入成功了。
总结:
遇到 insmod: ERROR: could not insert module xxx.ko: Operation not permitted 问题时,一步一步进行排查。
1、首先考虑权限问题,使用:
sudo insmod xxx.ko
试一试或者先切换到超级用户权限下再插入模块,这基本上就能解决这个问题,但是也有例外。
2、试一试《Linux如何解决root用户Operation not permitted》提出的方法
https://jingyan.baidu.com/article/fcb5aff7786e1eedab4a7142.html
或者:https://www.cnblogs.com/cpl9412290130/p/11592803.html
3、检查代码中是否有问题,例如是否读写了不存在的文件,或者打开的文件文件夹并不存在等,最好在代码中将这些可能遇到的问题printk出来,检查的时候可以使用dmesg来查看到底是哪里的问题。
我所遇到的就是第三种情况,这时候编译模块的时候并没有报错信息,然后一步步排查错误总结如上。