如何从shell中识别Android设备的分区?

如何从shell中识别Android设备的分区?,android,shell,partition,Android,Shell,Partition,我正在尝试从adb shell中查找哪个分区用于什么,例如/boot、/recovery、/system。虽然这对于当前装入的分区来说是微不足道的(使用mount或df命令,请参见示例),但对于当前未装入的分区来说(如在“用户模式”下启动时的/recovery),这似乎很棘手 有一个问题,但我尝试过的任何设备都无法解决: cat/proc/mtd:此字段为空或不存在 cat/proc/emmc:此字段为空或不存在 cat/proc/dumchar\u info:不存在(MTK/MediaTek

我正在尝试从adb shell中查找哪个分区用于什么,例如
/boot
/recovery
/system
。虽然这对于当前装入的分区来说是微不足道的(使用
mount
df
命令,请参见示例),但对于当前未装入的分区来说(如在“用户模式”下启动时的
/recovery
),这似乎很棘手

有一个问题,但我尝试过的任何设备都无法解决:

  • cat/proc/mtd
    :此字段为空或不存在
  • cat/proc/emmc
    :此字段为空或不存在
  • cat/proc/dumchar\u info
    :不存在(MTK/MediaTek)
  • ls-al/dev/block/platform/*/by name
    :不存在或没有所需的详细信息
  • parted
    刚刚产生了一个
    错误:磁盘外不能有分区
    /dev/block/mmcblk1
    上(只是缺少
    /dev/block/mmcblk0
    的“名称”列)
所以我不知所措。我知道有类似的应用程序可以显示这些细节,所以必须在设备上的某个地方存储。但是,在我的情况下,修改设备(通过安装应用程序)不是一个选项

所以我的问题基本上可以归结为:

此信息存储在Android设备的何处?

如果可能,最好采用通用方法。如果不是,那么多种方法的“尝试和错误”(If..elseif..fi
)也可以


背景:一个示例用法是“我只想检索
/boot
分区”(通过
dd
获取它的映像)。首先抓取所有分区,然后进行评估是不行的——太耗时,产生的数据太多;)-这已经描述了它的意图:编写一个小工具来检索一个特定的磁盘映像。

您可以在Linux上获得挂载分区的信息,但是我不认为Linux内核不知道
boot
recovery
分区,如果
/dev/block/platform/**/by name
没有它

因此,您可以使用当前装载的信息来猜测哪个分区是
boot
recovery
或/dev/block/*中未装载的其他分区

事实上,fastboot只发送要闪存的分区的名称。我想这意味着只有fastboot的引导加载程序知道这些信息

由于似乎没有“独特的方法”来实现这一点,我开始将来自allover的想法结合起来,将它们加入脚本(或者更确切地说是“脚本库”)中,以便按顺序进行检查(直到取得成功),并将其集成到名为的“设备文档工具”中。感兴趣的人可以在文件中找到它。由于Adebar是开源的(GPLv2),所以可以随意复制和使用它——或者分叉项目并改进它

完整的解决方案在这里发布有点长(如前所述,您可以在Github上获取),但由于SE策略是在文章中至少包含一般部分,因此它的作用如下:

不同的来源提供了不同的细节集,因此它首先尝试“最好的”,然后递归,直到至少找到了一些东西

  • /proc/dumchar\u info
    提供了最详细的信息,因此首先尝试此方法。快乐的MTK用户会得到这个
  • /proc/mtd
    是第二个最佳来源
  • /proc/emmc
    应该与前面的候选者一样多,但使用起来有点棘手
  • /dev/block/platform/*/by name
    ,与……交叉核对
  • /proc/partitions
    /proc/mounts
    交叉检查后,我们至少得到了已安装的分区
因此,我构建的脚本基本上按此顺序遍历源代码,在能够收集详细信息时立即停止(例如,如果找到
/proc/dumchar\u info
,则无需解析所有其他脚本)。它们都放在不同的函数中,使用相同的结构返回数据,甚至可以合并所有函数的结果


如果有人能想出一个更好的解决方案,我当然随时愿意接受这个想法:)

您要查找的确切信息(大小、位置、装载量)是在
/proc/mounts
@jan中找不到的,如前所述,每个分区“用于”什么。例如,从
mount
或您所说的
/proc/mounts
派生而来,
/dev/block/mmcblk1p21
持有
系统
分区。但是请注意,由于
mount
命令本身只保存当前装入的分区。但我还需要那些当前未装载的(例如,正常启动时恢复)。规模是次要的。标识对我来说很重要。我只需按名称
ls-l/dev/block/platform/omap/omap\hsmmc.0/来获取指向实际设备的分区名称列表。@jan同意–如果可能的话(请参阅我的问题:
/dev/block/platform/*/by name
:在某些设备上不存在。@Andreyua您已经从外壳部分看到了,修改设备(通过安装应用程序)不是选项限制?谢谢Kazuki–但是对于20多个分区,猜测太容易出错(26在当前连接的设备上,
mmcblk1p1
mmcblk1p26
),其中仅安装了3或4个(在所述设备上安装了3个)–尤其是“通过脚本自动猜测”。即使跳过所有具有2048个或更少块的分区,在该设备上也会留下10个分区,减去3个已装入的分区,可从中猜出7个。
fastboot
可以自行判断,这是另一个证明信息必须能自动获取的证据(除非它硬编码到设备上的计数器部分).fastboot是引导加载程序的一部分,它与Linux系统分离,因此我认为您无法获得