Android15 userdebug版本不能remount
背景描述:
最近调试Android Vendor Hal的时候发现一个奇怪的现象: android userdebug版本刷到设备中,执行adb root没提示错误,但是没有获取到root权限。
Android设备运行的系统版本有三种情况:user版本、userdebug版本和eng版本。user版本默认是不允许root,userdebug通常是开发调试使用版本可以做root操作。
下面以这个具体的问题出发,说明是如何确定问题的原因以及解决的方法。
先揭晓问题的原因:SELinux状态被设置成了"Enforcing",即SELinux处于强制模式,会限制root权限。
发现问题
如下,adb root执行看着是成功了,但是当执行一些需要root权限的操作时会提示Permission denied。
确认问题
1.确认设备中的系统版本是usedebug
如上,确认设备中跑的系统是userdebug版本。根据以往经验,这种版本一般是能做root操作的。
2.确认是不是root成功
如上,虽然su命令执行提示是“inaccessible or not found”不确能准确说明是“inaccessible”还是“not found”, 但是从命令行提示符可以判断执行操作的用户应该还是普通用户,而非root。正常的root用户如下:
3.检查SELinux状态
SELinux是Android4.3以后引进的Linux安全机制,Enforcing说明SELinux处于强制模式,可能会限制root权限。
至此,基本确定问题原因,接下来就是怎么改的。
解决问题
尝试临时解决
如上,尝试临时修改的两种方法都因为权限不够失败了。这时候通过命令应该能看到SELinux拒绝相关日志 (关键词:"avc")。
尝试永久解决
根据以往经验,这时通常有两种方法修改SELinux策略为Permissive:
- 从bootload阶段,进入到特权模式,然后修改。 这种方法失败了,因为设备有点特殊不像手机能按键选择。
- 重新做个android镜像,制作镜像时设置SELinux为Permissive模式
接下来介绍怎么修改,使制作出来的android镜像SELinux模式为Permissive。
修改Android SELinux模式为Permissive步骤
1.修改镜像打包阶段板级配置脚本BoardConfig.mk中BOARD_BOOTCONFIG
如下图,在Android构建源码device/vendorX/platformX/BoardConfig.mk中有如下内容:
将enforcing改成permissive
2.重新打包bootimage
$cd aosp
$source build/envsetup.sh
$lunch xx_userdebug
$make bootimage
3.替换boot.img到设备
使用fastboot flash刷新bootimg分区,或者使用自研工具替换boot.img到设备
补充:SELinux介绍
三种模式介绍
Disabled(禁用)模式
核心特征:SELinux完全关闭,不提供任何安全保护
行为表现:
- 内核不加载SELinux策略
- 所有访问控制仅依赖传统Linux DAC (自主访问控制)
- 不生成任何SELinux审计日志
使用场景:
- 紧急故障排查(如:当SELinux导致系统无法启动时)
- 性能测试(消除SELinux开销)
重要限制:
- 从Disabled切换到其他状态必须重启系统
- 禁用状态下修改的文件可能丢失安全标签
Permissive(宽容)模式
核心特征:只记录不拦截的调试模式
行为表现:
- 完整加载并解析SELinux策略
- 检测到策略违规时仅记录到日志而不阻止操作
- 生成详细的avc:denied审计日志
使用场景:
- 策略开发和调试阶段
- 排查权限拒绝问题
- 收集新策略所需的访问规则
操作命令:
#setenforce 0 #切换到Permissive(无需重启)
#getenforce #切换成功的话,这里返回“Permissive”
Enforcing(强制)模式
核心特征:完全启用安全保护
行为表现:
- 加载并强制执行SELinux策略
- 拦截所有违反策略的操作并记录日志
- 提供MAC(强制访问控制)保护
使用场景:
- 生产环境(默认安全配置)
- 安全敏感应用(金融、企业设备)
- Google要求Android设备必须默认启用
操作命令:
#setenforce 1 #切换到Enforcing(无需重启)
#getenforce #成功切换的话,这时返回"Enforcing"
三种模式转换关系
启用SELinux(Disabled->Permissive/Enforcing)必须重启。Permissive <-> Enforcing可通过setenforce实时切换。关闭SELinux(任何状态->Disabled)必须重启。