我目前正在尝试在启动过程结束时修改内核模块,因此我在init.rc中创建了以下条目:
on post_late_start
start myscript
on nonencrypted
class_start late_start
trigger post_late_start
on property:void.decrypt=trigger_restart_framework
class_start main
class_start late_start
trigger post_late_start
service myscript /data/my_sh.sh
disabled
oneshot
然后在我的/ data目录中,my_sh.sh具有以下内容:
#!/system/bin/sh
log -t mytag -p V "Hello World!"
insmod mymodule.ko mod_parameter=arg
但是当我运行时 - 有时候我没有看到“Hello World”标签,当我登录-s“mytag”时,当然也没有安装insmodded模块。
延迟插入内核模块的正确方法是什么(它需要在网络启动和/数据安装后进入)。而且 - 如何将insmod的输出输入日志以便我可以调试?任何帮助表示赞赏,如有必要,我可以发布更多详细信息。
答案 0 :(得分:3)
至少从Froyo到Lollipop,Android init
在system/core/init/buildin.c中实现了insmod
。它应该直接在init*.rc
文件中工作:
on boot
insmod /system/lib/modules/your-module.ko.
但是,至少在Lollipop 5.1中,它不再有效,因为SELinux规则得到了强制执行。 init
没有必要的sys_module
权限。因此,基础init_module
系统调用返回EPERM
。这从未报告过任何地方。唯一的症状是insmod
命令现在无法加载模块。
我在此打开了AOSP issue。根据谷歌的说法,这是按预期工作的。如果您想在强制执行SELinux时使用内核模块(他们强烈反对),您必须自己将所需的SELinux权限添加到init
。
答案 1 :(得分:0)
我不确定你的日志,但是对于insmod你需要提供模块的确切路径,因为我不认为你将mymodule.ko和init.rc一起驻留在同一个地方。因此,尝试给出ko文件的完整路径。 通常它位于/lib/modules/youdrivername.ko
所以先在这里查看。