web-dev-qa-db-ja.com

シェルからAndroidデバイスのパーティションを識別するにはどうすればよいですか?

私はどのパーティションが何のために使用されているかを見つけようとしています/boot/recovery/systemadb 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を生成しました(/dev/block/mmcblk0の「名前」列が欠落しているだけです)。

だから私は迷っています。 DiskInfo のようなアプリがあり、それらの詳細を表示できることがわかっているので、デバイスのどこかに保存する必要があります。ただし、私の場合、デバイスの変更(アプリのインストールによる)はオプションではありません。

したがって、基本的に私の質問は次のように燃え尽きます。

Androidデバイスのどこにこの情報が保存されていますか?

可能であれば、一般的なアプローチが推奨されます。そうでない場合、いくつかのアプローチの「試行錯誤」(if..elseif..fi)も同様に行います。

背景:「/bootパーティションのみを取得したい」という使用例があります(dd経由でイメージを取得します)。最初にすべてのパーティションを取得し、後で評価することはしません-時間がかかり、生成されるデータが多すぎます;)-これはすでに意図を説明しています。特定のディスクイメージを取得する小さなツールを作成します。

19
Izzy

それを達成するための「ユニークな方法」はないように思えるので、私は全体からのアイデアを組み合わせ、それらをスクリプト(または「スクリプトライブラリ」)に結合して、それらを順番にチェックするようにしました(ヒットが成功するまで)。それをAdebarという名前の「デバイスドキュメントツール」に統合しました。興味のある方は lib/partitions.lib ファイルで見つけることができます。 Adebarはオープンソース(GPLv2)なので、自由にコピーして使用するか、プロジェクトを分岐して改善してください。

完全なソリューションはここに投稿するには少し長いですが(前述のとおり、Githubで入手できます)、SEのポリシーでは投稿に少なくとも一般的な部分を含めることであるため、次のようになります。

さまざまなソースがさまざまな詳細セットを提供するため、最初に「最適なもの」を試し、次に少なくとも何かが見つかるまで再帰します。

  • /proc/dumchar_infoは最も詳細な情報を提供するため、これが最初に試されます。幸せなMTKユーザーはこれを取得します。
  • /proc/mtdは2番目に優れたソースです。
  • /proc/emmcは以前の候補とほぼ同じである必要がありますが、使用するのは少し難しいです
  • /dev/block/platform/*/by-name、…とクロスチェック
  • /proc/partitions/proc/mountsとクロスチェックされ、少なくともマウントされたパーティションを提供します

したがって、私が作成したスクリプトは基本的にソースをこの順序で調べ、詳細を収集できるようになるとすぐに停止します(たとえば、/proc/dumchar_infoが見つかった場合、他のすべてを解析する必要はありません)。それらはすべて別々の関数に入れられ、まったく同じ構造を使用してデータを返します。それらすべての結果をマージすることもできます。

誰かがより良い解決策を思い付くことができれば、私はもちろんそのアイデアに対して常にオープンです:)

12
Izzy

Linuxのmounted-partitionの情報は https://stackoverflow.com/a/15639867/629118 として取得できますが、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

0
Kazuki Sakamoto