启动时的 Android insmod 内核对象

roo*_*kin 3 boot android kernel init linux-kernel

我目前正在尝试在引导过程结束时插入内核模块,因此我在 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
Run Code Online (Sandbox Code Playgroud)

然后在我的 /data 目录中 my_sh.sh 有以下内容:

#!/system/bin/sh
    log -t mytag -p V "Hello World!"
    insmod mymodule.ko mod_parameter=arg
Run Code Online (Sandbox Code Playgroud)

但是当我运行时——有时我在 logcat -s“mytag”时看不到“Hello World”标签,当然,也没有安装 insmodded 模块。

延迟插入内核模块的正确方法是什么(它需要在网络启动并挂载 /data 后插入)。更进一步 - 我如何将 insmod 的输出输入到日志中以便我可以调试?任何帮助表示赞赏,如有必要,我可以发布更多详细信息。

Pek*_*der 5

至少从升级Froyo,仍然在棒棒糖,Android的init工具insmod系统/核心/初始化/ buildin.c。它应该直接在init*.rc文件中工作:

on boot
    insmod /system/lib/modules/your-module.ko.
Run Code Online (Sandbox Code Playgroud)

然而,至少在 Lollipop 5.1 中,它不再有效,因为 SELinux 规则被强制执行。 init没有所需的sys_module权限。因此底层init_module系统调用返回EPERM. 这从未向任何地方报告。唯一的症状是insmod命令现在总是无法加载模块。

就此打开了AOSP 问题。据谷歌称,这按预期工作。如果您想在强制执行 SELinux 时使用内核模块(他们强烈建议反对),您必须自己将所需的 SELinux 权限添加到init.