Как я могу идентифицировать разделы Android-устройства из оболочки?

Я пытаюсь найти, какой раздел используется для чего, например. /boot, /recovery, /system, от adb shell. Хотя это тривиально для разделенных в данный момент разделов (с помощью команд mount или df, например, как идентифицировать имена разделов), это кажется сложным когда речь идет о разделах, которые в настоящее время не установлены (например, /recovery при загрузке в "пользовательском режиме" ).

Там учебник на XDA, но это не сработало ни для одного из устройств, которые я пробовал:

  • cat /proc/mtd: это пустое или несуществующее
  • cat /proc/emmc: это пустой или несуществующий
  • cat /proc/dumchar_info: не существует (MTK/MediaTek)
  • ls -al /dev/block/platform/*/by-name: либо несуществующий, либо не имеющий требуемых деталей
  • parted только что дал Error: Can't have a partition outside the disk! на /dev/block/mmcblk1 (при этом просто отсутствует столбец "name" для /dev/block/mmcblk0).

Так что я в недоумении. Я знаю, что есть такие приложения, как DiskInfo, которые могут отображать эти детали, поэтому их необходимо хранить где-нибудь на устройстве. Тем не менее, изменение устройства (путем установки приложения) в моем случае не является вариантом.

Итак, в основном мой вопрос сжигает:

Где на Android-устройстве хранится эта информация?

Если возможно, предпочтительным является общий подход. Если нет, то "try-and-err" нескольких подходов (if..elseif..fi) также будет работать.

Для фона: примером использования будет "Я хочу получить только раздел /boot" (получить его изображение через dd). Это не будет сделано, чтобы сначала захватить все разделы и оценить позже - слишком много времени и слишком много данных;) - Это уже описывает намерение: написание небольшого инструмента для извлечения определенного образа диска.

Ответы

Ответ 1

Поскольку для достижения этого не существует "уникального способа", я начал комбинировать идеи из allover, объединив их в script (или, скорее, в библиотеку script), чтобы они проверялись последовательно (до тех пор, пока был сделан хороший удар) и интегрировал это в мой "Инструмент документации к устройствам" с именем Adebar. Желающие могут найти его в файле lib/partitions.lib. Поскольку Adebar является открытым исходным кодом (GPLv2), не стесняйтесь копировать и использовать его - или разблокировать проект и улучшить его.

Полное решение - это немного длинный пост для публикации здесь (как сказано, вы можете его захватить в Github), но поскольку политика SE включает в себя как минимум общую часть сообщения, вот что он делает:

Различные источники предоставляют разные наборы деталей, поэтому сначала пробуют "лучшие", а затем повторяются до тех пор, пока не будет найдено что-то.

  • /proc/dumchar_info дает наиболее подробные сведения, поэтому сначала это делается. Счастливые пользователи MTK получат это.
  • /proc/mtd - второй лучший источник.
  • /proc/emmc должен иметь почти столько же, сколько и предыдущие кандидаты, но немного сложно использовать
  • /dev/block/platform/*/by-name, перекрестно проверено с помощью...
  • /proc/partitions перекрестная проверка с помощью /proc/mounts дает нам, по крайней мере, разделы, установленные

Итак, script, который я построил, в основном идет по источникам в этом порядке, останавливаясь, как только он смог собрать детали (например, если /proc/dumchar_info было найдено, не нужно разбирать все остальные). Все они вставляются в отдельные функции, возвращая данные с использованием одной и той же структуры, можно даже объединить результаты из всех них.

Если кто-то может придумать лучшее решение, я, конечно, всегда открыт для идеи:)

Ответ 2

Вы можете получить информацию о смонтированном разделе в Linux как fooobar.com/info/355818/..., но я не думаю, что ядро ​​Linux не знает о boot и recovery, если /dev/block/platform/**/by-name не имеет его.

Итак, вы можете использовать текущую смонтированную информацию, чтобы угадать, какой раздел boot или recovery, или что-то еще в /dev/block/ *, который не установлен.

Фактически, fastboot отправляет только имя раздела, который вы хотите выполнить. Это означает, что только загрузчик для fastboot знает информацию, я думаю.

https://github.com/android/platform_system_core/blob/8163104b3feb575a321b194a70ecb9873a70b29d/fastboot/fastboot_protocol.txt