Android 8.1.0系统下root用户写入eMMC分区P25提示“Operation not permitted”的问题求助
你已经确认了root权限、SELinux上下文(均为u:object_r:block_device:s0)、文件权限(777)都没问题,日志里也没有AVC拒绝记录,但dd写入P25时直接报Operation not permitted——这种情况基本可以确定是内核层的限制,而非用户态权限问题。下面是具体的排查方向和解决思路:
1. 检查分区是否被标记为只读(RO)
首先看P25是不是被内核挂载成了只读模式:
mount | grep mmcblk1p25
如果输出里有ro字样,说明是只读挂载,尝试重新挂载为读写(替换<挂载点>为实际路径,如果分区有挂载的话):
mount -o remount,rw /dev/mmcblk1p25 <挂载点>
如果分区没有挂载,再检查内核对该分区的只读标记:
cat /sys/block/mmcblk1/mmcblk1p25/ro
如果返回1,说明内核把这个分区标记成了只读,这可能是厂商故意设置的(比如保护关键系统分区),也可能是文件系统出错导致的。
2. 确认P25是否是厂商保护的特殊分区
很多Android设备的eMMC分区有特殊用途,比如P25可能是基带固件分区、bootloader相关分区或者厂商预留的受保护分区,这类分区内核会直接禁止写入,哪怕是root用户也不行。
可以通过以下方式确认:
- 查看分区表信息,对比P24和P25的大小、位置,推测用途:
fdisk -l /dev/mmcblk1 - 如果能拿到设备的内核源码或设备树文件,查看分区定义(比如
arch/arm/boot/dts/你的设备.dts)里有没有把P25标记为read-only或者protected的配置。
3. 用strace跟踪系统调用,定位具体错误环节
用strace工具跟踪dd的系统调用,看看到底是哪个环节被拒绝了:
strace dd if=/dev/zero of=/dev/mmcblk1p25 bs=1 count=1
重点看最后的write()调用,如果返回-1 EPERM (Operation not permitted),就确认是内核在阻止写入;同时检查前面的open()调用是否成功(返回的文件描述符大于0),排除打开文件时的限制。
4. 排查隐藏的SELinux限制(即使没有AVC日志)
有时候SELinux规则会设置dontaudit,导致拒绝操作时不生成AVC日志,但实际还是限制了写入。可以临时关闭SELinux测试:
setenforce 0
如果关闭后能正常写入P25,说明确实是SELinux的问题,需要添加自定义规则。可以用audit2allow -a工具尝试生成规则(哪怕日志不多,也可能找到线索)。
5. 检查eMMC硬件级写保护
eMMC芯片本身有硬件写保护机制,比如设置了写保护位。可以读取eMMC的扩展CSD寄存器查看相关状态:
mmc extcsd read /dev/mmcblk1
重点看PERM_WRITE_PROTECT、WP_GRP_ENABLE这类字段,如果这些位被设置,说明分区是硬件级锁定的,通常需要厂商专用工具才能解除(而且很多厂商不会开放这个权限,避免用户误操作变砖)。
推荐的排查顺序
- 先检查P25是否是只读挂载,是的话尝试重新挂载为读写;
- 临时关闭SELinux,排除SEPolicy的影响;
- 用strace跟踪系统调用,确定具体是哪个环节出错;
- 查看内核启动日志中关于P25的初始化信息:
dmesg | grep -A 10 -B 10 mmcblk1p25
内容的提问来源于stack exchange,提问作者arnold




