selinux 是如何导致开机进入recovery的

截取log的异常部分。

疑点1. 可以看出是某critical的service被kill了4次in 4min,从而触发系统自动进入recovery。

疑点2. 系统在访问部分节点时,没有权限?

撸一遍init.cpp的代码:

问题在以下这个函数

简单记录下:

此函数是init在等待ueventd冷启动完成,如果超时,init就直接启动了。

在ueventd里有很多设备节点创建及改变selinux context的操作,通过加log最终确定,

由于selinux变更context太过耗时,导致此函数超时。

于是在init启动后续service时,设备节点的context还没初始化完成就被别人初始化了一个错误的context。于是有了"疑点1"的异常

也导致了service的启动失败,由于context已经错了,所以service不断失败,从而导致重启进入recovery

而selinux初始化耗时的根本原因就是写在device/*/*.te里的各种selinux规则,由于通配符过多,selinux遍历时间太长而耗时.

通过优化sepolicy规则后,解决。

同时还有一点:android9之后,init等待的超时改为60s,也进一步降低了超时风险.

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值