Как я могу идентифицировать разделы 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