/ storage / emulated / 0 /とは何ですか?


40

最近、私は、ファイルを削除した場合のことを考え出した/sdcard/Download、それはからファイルを削除します/storage/emulated/0/Download。ファイルを追加すると、ファイルが/sdcard/Download複製されます/storage/emulated/0/Downloadます。

それで何/storage/emulated/0/ですか?Androidファイルシステムにはどのような目的で使用されていますか?

回答:


40

/storage/emulated/0/Download ファイルへの実際のパスです。

/sdcard/Download の実際のパスへのシンボリックリンクです /storage/emulated/0/Download

ただし、実際のファイルはのファイルシステムにあり/data/media、次にファイルシステムにマウントされます/storage/emulated/0(多くの場合、他のマウントポイントも)

A シンボリックリンクコンピューティングでは、シンボリックリンクの絶対または相対パスとそのパス名の分解能に影響する形で他のファイルまたはディレクトリへの参照を含む任意のファイルのための用語です。シンボリックリンクは、1978年までにDECおよびData GeneralのRDOSのミニコンピューターオペレーティングシステムにすでに存在していました。


15
この答えは、「エミュレート」される理由について少し説明すればより良いでしょう。Androidは実際にはもっと良いものに裏打ちされたFAT fsを偽造するためのハッキングを行っていると思いますが、詳細がわからず、新しい質問を求めてこの質問をクリックしました。
R ..

4
@R ..「エミュレートされた」私見は、それが「エミュレートされたSDカード」(実際のSDカードではない)であることを指します。
イジー

10
@R .. SDCardFSを使用します。ここではそれについての優れた記事です:xda-developers.com/...アーカイブ
Nonnyムース

16

/storage/emulated/0/ 実際に /data/media/0/エミュレートされた/仮想ファイルシステムではなく、実際公開されます。

これは、ここでの以前の回答を参照していますが、より関連性のある詳細があります。

Androidのストレージ:

上のアンドロイド5

/sdcard >S> /storage/emulated/legacy >S> /mnt/shell/emulated/0
/mnt/shell/emulated >E> /data/media

のAndroid 6+

# for (Java) Android apps (running inside zygote virtual machine)
# "/storage to VIEW" bind mount is inside a separate mount namespace for every app
/sdcard >S> /storage/self/primary
/storage/self >B> /mnt/user/USER-ID
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/VIEW/emulated
/mnt/runtime/VIEW/emulated >E> /data/media

# for services/daemons/processes in root/global namespace (VIEW = default)
/sdcard >S> /storage/self/primary
/storage >B> /mnt/runtime/default
/mnt/runtime/default/self/primary >S> /mnt/user/USER-ID/primary
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/default/emulated
/mnt/runtime/default/emulated >E> /data/media

* >S>シンボリックリンクのために、>E>エミュレートおよび>B>マウントバインドのため
* USER-IDの場合には、現在のユーザのをMultiple Users、またはWork Profile、通常、0デバイスの所有者のもの、即ち
* VIEWの一つであるread、または(permission.READ_EXTERNAL_STORAGEとアプリ用)write(permission.WRITE_EXTERNAL_STORAGE)またはdefaultルートで実行中のプロセスのために( / global mount namespaceすなわちzygoteの外)
*以前のAndroidバージョンにはわずかな違いがありましたが、エミュレーションの概念は実装以来同じでした。
* Androidのマウント名前空間の実装の詳細については、この回答を参照してください。

要するに、/sdcardおよび/storage/emulated/0-FAT / vFAT / FAT32ファイルシステムを表す-を介して/data/media/0(またはAdoptable Storageの/mnt/expand/[UUID]/media/0場合)エミュレーションまたはエミュレーションを指します。 FUSEsdcardfs

Android固有ではなく、一般的にLinux関連であるため、シンボリックリンクバインドマウント(「バインドマウントの作成」を参照)は、主にエミュレーション部分に関する質問なので、この質問の範囲外です。

エミュレーション:

エミュレーションがここにあるのはなぜですか?エミュレートされたファイルシステムは、実際のファイルシステム(ext4またはf2fs)上の抽象化レイヤーであり、基本的に2つの目的を果たします。

  • AndroidデバイスのPCへのUSB接続を保持します(数日後にMTPで実装されます)
  • ユーザーのプライベートメディアおよびSDカード上の他のアプリのデータへのアプリ/プロセスの不正アクセスを制限します。

読むAndroidのストレージジャーニー詳細については、概要は次のとおりです。

初期のAndroidデバイスは内部ストレージが不足しており、従来のFATファミリのファイルシステムを使用してほとんどのPCとの互換性を確保する(物理的に)外部SDカードに依存していました(PCの世界でのMicrosoftの優位性を参照)。
内部ストレージのサイズが大きくなると、同じファイルシステムが内部(まだ「外部」と呼ばれる)SDカードにシフトされました。
しかし、FAT / vFATの実装には2つの大きな問題があり、Googleによって徐々に対処されました。

  • AndroidデバイスはPCに直接接続されていました(USB Mass Storage最近、USBドライブを接続するのと同じように、)に。UMSは、ブロックレベルでデバイスを公開し、AndroidフレームワークからSDカードを切断(マウント解除)するため、データ全体をアプリで使用できなくなり、多くの機能が破損する可能性があります。
  • FATは、UNIXのパーミッション(モード、UID、GIDと同様に実施するために設計されていませんでした(開発日数でWindowsのお気に入りである)シンボリックリンク、およびioctlsなどFS_IOC_FIEMAP)。そのため、SDカード上のすべてのデータはすべてのアプリで利用でき(すべてのAndroidアプリはUNIX / Linuxユーザーであり、uidを持っているため)、制限がなく、したがって深刻なプライバシーとセキュリティの懸念が生じます。

これらの問題は両方とも、エミュレーションによって対処されました。

  • 実際のSDカードストレージは、ファイルシステム/dataを保持するパーティション(または以前は一部のデバイスの独立した/ sdcardパーティション)に移動されext4(徐々に置き換えられますf2fs)、UNIXのアクセス許可を完全に実装しました。
  • この設計では、/dataパーティション全体をPCに公開できなかったため、UMSを使用できませんでした。さらに2つの理由(1)があります。多くの設定とアプリのデータが含まれ、他のアプリや人間のユーザーから保護されます。(2)LinuxファイルシステムはWindowsではサポートされていません。
    そのため、UMSはMedia Transfer Protocolに置き換えられました。これは、PTPのクライアントサーバータイプの拡張機能であり、既に確立されているプロトコルです。MTPはブロックデバイスを公開しませんが、ソフトウェアスタックを介して機能します。MTPホストはandroid.process.media、Androidフレームワークで完全にサンドボックス化されたアプリとしてAndroid上で実行され、エスカレーションされたタスクを実行できません。

現在、アプリ(およびアプリでもあるMTP)は/data/media、の代わりにエミュレートされたストレージと対話します。両方の目的を同時に達成します。つまり、権限チェックを下に強制し、上面でFATファイルシステムのように見えます。

Googleは現在、sdcardfsを介してエミュレーションを実装し、FUSEの欠点を克服しています。主要なものの1つは、入出力のオーバーヘッド、つまり読み取り/書き込み速度を改善することです。

外部ストレージの許可:外部ストレージ上のパブリックファイルとプライベートファイルの
概念は、例: Termuxアプリのインストールを使用して説明できます。 ディレクトリとを作成します。 ファイルとを作成します。 次のコマンドを実行します。

/sdcard/Android/data/com.termux/test_dir/sdcard/test_dir
/sdcard/Android/data/com.termux/test_file/sdcard/Android/data/com.termux/test_file

without_storage_perm * WhatsAppをインストールするか、他のアプリのプライベートフォルダーを選択する必要があります。

Termuxアプリを強制的に停止し、ストレージのアクセス許可を付与します。コマンドを再度実行します。

with_storage_perm

同じファイルとディレクトリのパーミッションの違いをご覧ください。数百のアプリ(ユーザー)が同時に処理される場合、これはネイティブLinuxファイルシステムでのエミュレーションなしでは単純に可能ではないようです。これは、実際のファイルシステムの元のアクセス権とは無関係に、同じファイルを3つの異なるアクセス権セットで同時に公開できるファイルシステムエミュレーションです。

# touch /data/media/0/test_file

# stat -c '%a %u %g %n' /data/media/0/test_file
644 1023 1023 /data/media/0/test_file

# stat -c '%a %u %g %n' /mnt/runtime/*/emulated/0/test_file
660 0 1015 /mnt/runtime/default/emulated/0/test_file
640 0 9997 /mnt/runtime/read/emulated/0/test_file
660 0 9997 /mnt/runtime/write/emulated/0/test_file

「u#_everybody」UIDとは何ですか?も参照してください

関連:


2
+1。私はMTPについての部分を誤解していると思います。MTPを使用するには、ターゲットデバイスにFATファイルシステムが必要ですか?そうでない場合、GoogleはFUSEの実装にext4ファイルシステムを使用できません。これは、アプリが共有ストレージ内のデータのみにアクセスするために必要なアクセス許可チェックを強制する可能性があるためですか?
消防士

1
@Firelordはエミュレーションについて議論するとき、MTPの実装に焦点を合わせていません。Googleは、特定のAndroidのニーズを満たすためにMTPプロトコルに既に変更を加えており、おそらくネイティブLinuxファイルシステムを介して実装できます。しかし、ポイントは、FAT-like permission-less filesystem下位互換性を確保し、Androidの外部ストレージコンセプトの設計を満たすために、Androidの初期に使用されていたものが必要です。私は自分の主張を詳しく説明するために編集を行いました。
イルファンラティフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.