Android P, failed to mount /vendor, /dev/block/dm-5 is read only

本文详细介绍了在Android P设备上遇到dm-verity导致无法读写vendor分区的问题及解决方案。作者尝试了adb disable-verity命令,但在某些情况下需要进入fastboot模式解锁设备。最终通过在u-boot中禁用SELinux成功解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

I tried to mount -o remount,rw /vendor on android P with user-debug build, and I got the feedback 'failed to mount /vendor, /dev/block/dm-5 is read only'.

I searched and it looks like dm-verity is in effect, so I tried the following cmd:

adb root

adb disable-verity  //if this cmd failed, you need try 'adb reboot bootloader->fastboot flashing unlock' 

adb reboot

adb disable-verity

adb reboot

Now, it still didn't work.

Then I tried to disable selinux in uboot. It worked.

<think>我们正在讨论如何获取`/dev/block/dm-98`设备节点。在Android系统中,`/dev/block/dm-*`设备通常是通过设备映射(device mapper)创建的虚拟块设备。设备映射是Linux内核的一个功能,允许将多个物理块设备组合成逻辑设备,或者对块设备进行重映射(如加密、压缩等)。 获取`/dev/block/dm-98`的具体方法取决于它是如何被创建的。通常,它是由系统在启动过程中通过`dmctl`(设备映射控制工具)或类似的机制创建的。我们可以通过以下步骤来追踪其来源: ### 1. **查看设备映射状态** 使用`dmsetup`命令可以查看当前设备映射的状态: ```bash adb shell dmsetup info -c /dev/block/dm-98 ``` 或者查看所有设备映射: ```bash adb shell dmsetup ls ``` 然后通过设备名查找具体信息: ```bash adb shell dmsetup info <name> ``` ### 2. **检查系统启动日志** 设备映射通常在系统启动时创建,可以查看启动日志: ```bash adb shell logcat -d | grep 'dm-98' adb shell dmesg | grep 'dm-98' ``` ### 3. **检查设备映射表** 每个设备映射都有一个映射表,描述其如何映射到物理设备: ```bash adb shell dmsetup table /dev/block/dm-98 ``` 或者使用设备名: ```bash adb shell dmsetup table <name> ``` ### 4. **检查系统配置** 在Android系统中,设备映射可能由以下方式创建: - **init.rc脚本**:在系统启动时通过`dmctl`命令创建。 - **vold**:Volume守护进程,用于管理存储设备。 - **fstab**:文件系统表配置,可能触发设备映射的创建(如加密分区)。 检查`init.rc`相关脚本: ```bash adb shell grep -r 'dmctl' /system/etc/init/ /vendor/etc/init/ ``` ### 5. **检查设备节点链接** 有时`/dev/block/dm-98`可能是一个符号链接,可以检查其指向: ```bash adb shell ls -l /dev/block/dm-98 ``` ### 6. **通过inode追踪** 如果上述方法无效,可以通过设备节点的inode在系统日志中搜索: ```bash adb shell ls -i /dev/block/dm-98 # 获取inode号 adb shell dmesg | grep <inode> ``` ### 示例:设备映射创建过程 在Android文件系统加密中,设备映射用于映射加密后的数据分区。例如: ``` dmctl create system-crypt --target "cryptsetup aes-cbc-essiv:sha256 <key> /dev/block/platform/soc/1d84000.ufshc/by-name/userdata 0" ``` 这将创建一个设备映射节点(如`/dev/block/dm-0`),然后系统挂载该节点。 ### 注意事项 - 设备号(如98)是动态分配的,每次启动可能不同。 - 设备映射名称(如`system-crypt`)更具标识性。 --- §§相关问题§§ 1. 在Linux系统中,设备映射(device mapper)的工作原理是什么? 2. Android系统在哪些场景下会使用设备映射(如dm-*)? 3. 如何通过设备映射表(dmsetup table)解析设备映射的物理设备来源? 4. 在Android系统启动过程中,设备映射的创建流程是怎样的? 5. 如何动态创建和删除设备映射节点?</think>### `/dev/block/dm-98` 的获取方式解析 `/dev/block/dm-98` 是 Linux 设备映射器(Device Mapper)创建的虚拟块设备节点,通常由以下方式生成: #### 1. **设备映射器动态创建** 设备映射器在以下场景自动创建此类节点: ```bash # 查看设备映射状态 dmsetup ls --tree ``` 输出示例: ``` system (253:0) └─ (253:98) # dm-98 对应此映射 ``` #### 2. **Android 系统层创建** 在 Android 中常见创建场景: - **文件系统加密**:`dm-crypt` 创建加密卷 - **逻辑卷管理**:`dm-linear` 组合多个分区 - **文件级加密 (FBE)**:用户数据分区加密 - **动态分区**:Android 10+ 的 super 分区管理 #### 3. **关键获取方法** ##### (1) 通过映射表反推 ```bash adb shell dmsetup table dm-98 ``` 输出示例: ``` 0 1048576 linear 259:3 2048 ``` 解读: - `259:3` = 物理设备 `/dev/block/sda3` - `2048` = 起始扇区 ##### (2) 通过挂载点追溯 ```bash adb shell mount | grep dm-98 ``` 输出示例: ``` /dev/block/dm-98 on /data type ext4 ... ``` ##### (3) 通过设备号确认 ```bash adb shell ls -l /dev/block/dm-98 ``` 输出关键信息: ``` brw------- 1 root root 253, 98 2023-01-01 00:00 dm-98 ``` - `253` = 设备映射器主设备号 - `98` = 次设备号 #### 4. **创建原理** 内核设备映射器通过 `ioctl` 调用创建: ```c // 内核创建流程 dm_ctl_ioctl() → dm_table_create() → dm_device_create() // 分配 dm-X 设备号 ``` ### 典型应用场景 1. **Android 用户数据加密**: ```bash # 创建流程示例 vdc cryptfs enable <password> # 触发 dm-crypt 创建 ``` 2. **动态分区组合**: ```bash lpmake --device-size=... --partition=system:readonly:... ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值