Android第三方内核厂商模块加载后/sys设备节点未生成求助
内核模块加载后/sys节点未生成问题排查
问题背景
我们正尝试将第三方内核厂商模块集成到Android系统中,因无需在early-init阶段加载,未加入BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD配置,改用.rc文件加载模块。
现有配置
加载用的rc文件(路径:/vendor/etc/init/xx_module.insmod.rc)
on boot start xx_module_insmod_sh service xx_module_insmod_sh /vendor/etc/xx_modules_run.sh sys.all.boot.ready class main user root group root system disabled oneshot
执行脚本/vendor/etc/xx_modules_run.sh
#!/system/bin/sh insmod /vendor/lib/modules/xyz.ko setprop $1 1
现象
- 开机后
lsmod显示xyz.ko已加载,但/sys/devices/virtual/inxx节点未生成 - 手动通过
adb shell执行insmod /vendor/lib/modules/xyz.ko时,/sys/devices/virtual/inxx节点正常生成 - 无开机阶段dmesg日志,调试受限
排查方向与解决方法
调整模块加载时机
on boot触发时机较早,可能模块依赖的内核子系统或硬件节点尚未初始化完成。尝试将触发时机改为系统完全启动后:on property:sys.boot_completed=1 start xx_module_insmod_sh也可尝试依赖更具体的硬件就绪属性(如厂商提供的硬件初始化完成标识)。
给脚本添加调试输出
修改脚本,将操作日志写入文件以便排查:#!/system/bin/sh sleep 5 insmod /vendor/lib/modules/xyz.ko > /vendor/xx_module_insmod.log 2>&1 echo "insmod exit code: $?" >> /vendor/xx_module_insmod.log ls -l /sys/devices/virtual/ >> /vendor/xx_module_insmod.log setprop $1 1开机后查看
/vendor/xx_module_insmod.log,确认insmod是否有报错,以及加载后/sys/devices/virtual目录的内容。检查SELinux权限
开机阶段SELinux策略可能与手动执行时不同,模块创建节点可能被阻止。可临时关闭SELinux测试:setenforce 0,重启后观察节点是否生成。若确认是SELinux问题,需添加对应规则(如允许模块创建inxx类型节点、调整模块加载上下文)。验证模块参数与依赖
- 确认脚本中
insmod是否缺少必要参数,对比手动执行的命令与脚本命令是否完全一致。 - 检查模块是否依赖其他内核模块,若有,需确保依赖模块在当前模块加载前已完成加载,可在脚本中先加载依赖模块。
- 确认脚本中
调整service的class属性
将service的class main改为class late_start,让模块在更晚的阶段启动,避免与其他初始化流程冲突。
内容的提问来源于stack exchange,提问作者aTJ
相关产品推荐
相关产品推荐

