Adoptable Storage

Android では、これまで常に外部ストレージ アクセサリ(SD カードなど)がサポートされてきました。ただし、従来の外部ストレージには永続性が見込めず、データ保護も最小限であったことから、シンプルなファイル ストレージに限定されてきたという経緯がありました。Android 6.0 では、外部ストレージ メディアを取り込み、内部ストレージのように動作させる機能が導入されています。

外部ストレージ メディアを取り込むと、一度に 1 つの Android デバイスでのみ動作するようにフォーマットと暗号化が行われます。取り込まれたメディアは、Android デバイスと強く結び付けられるため、すべてのユーザーのアプリと個人データを安全に格納できます。

ユーザーが新しいストレージ メディア(SD カードなど)を取り込み可能な場所に挿入すると、Android 上でそのメディアの使用方法の確認が求められます。ユーザーは、メディアを取り込んでフォーマットと暗号化を行うか、シンプルなファイル ストレージとしてそのまま使用するかを選択できます。取り込みを選択すると、プラットフォームによって、プライマリの共有ストレージ コンテンツ(通常は /sdcard にマウント)が新たに取り込まれたメディアに移行され、内部ストレージの貴重なスペースが解放されます。従来のストレージでは MBR が使用されるため、ストレージの上限が 2 TB になりますが、Adoptable Storage では GPT が使用されるため、ファイル ストレージの上限は最大 9 ZB になります。

アプリは、デベロッパーが android:installLocation 属性でサポートを指定した場合に限り、Adopted Storage メディアに配置できます。サポート対象のアプリを新規にインストールする場合は、空き領域が最も多いストレージ デバイスに自動的に配置されます。ユーザーは設定アプリ上でサポート対象アプリのストレージ デバイス間での移動を行えます。取り込まれたメディアに移されたアプリは、メディアが取り外されている間は記録され、再度挿入された時点でメディアに戻ります。

セキュリティ

プラットフォームは、取り込まれたデバイスごとに暗号鍵をランダムに生成し、その鍵を Android デバイスの内部ストレージに格納します。そうすることで、取り込まれたメディアは内部ストレージと同様に安全に保護されます。鍵は、取り込まれたパーティションの GUID に基づいて、各 Adoptable Storage デバイスに関連付けられます。

内部ストレージでファイルベースの暗号化(FBE)を使用するようにデバイスが構成されている場合、Adoptable Storage は FBE とメタデータ暗号化の両方を使用します。それ以外の場合、Adoptable Storage はフルディスク暗号化(FDE)を使用します。

Adopted Storage デバイスのディスク上のレイアウトは、SELinux ラベルなどの内部データ パーティションとほぼ同じです。Android デバイスでマルチユーザーがサポートされている場合、Adopted Storage デバイスでもマルチユーザーをサポートし、内部ストレージと同水準の分割が行われます。

Adopted Storage デバイスに格納されたデータは、そのデバイスを取り込んだ Android デバイスと強く結び付けられるため、親デバイスから暗号鍵を抽出することはできません。したがって、ストレージ デバイスを別の場所にマウントすることはできません。

デバイスで FBE を使用している場合は、Adoptable Storage で FBE とメタデータ暗号化を構成する方法について、FBE のドキュメントメタデータ暗号化のドキュメントをご覧ください。

パフォーマンスと安定性

Adopted Storage に使用するメディアについては、偶発的なデータの損失や破損を防ぐため、バッテリー収納部のスロットや保護カバーの内側など、安定した場所にある外部ストレージ メディアのみとすることを検討してください。特に、スマートフォンやタブレットに接続した USB デバイスの使用は控えるようにしてください。ただし、一般的には、テレビとして使用されるデバイスに接続する外付け USB ドライブは除外できます。通常、テレビ自体は安定した場所に設置されているためです。

ユーザーが新しいストレージ デバイスを取り込むと、プラットフォームではベンチマークが実行され、内部ストレージとパフォーマンスが比較されます。取り込まれたデバイスが内部ストレージより著しく低速である場合、プラットフォームはエクスペリエンスが低下する可能性についてユーザーに警告を発します。このベンチマークは、よく利用される Android アプリの実際の I/O 動作をベースとしています。現在の AOSP の実装では、しきい値は 1 つで超過するとユーザーに警告が発せられるだけですが、デバイス メーカーはこれをさらに発展させて、カードが極端に遅い場合は取り込み自体を拒否するなどの実装を採用できます。

取り込まれたデバイスは、POSIX 権限と拡張属性をサポートするファイルシステム(ext4f2fs など)でフォーマットする必要があります。フラッシュ ベースのストレージ デバイスの場合、パフォーマンスを最適化するには f2fs ファイルシステムが推奨されます。

定期的なアイドル メンテナンスを実施する際は、内部ストレージの場合と同様に、プラットフォームが取り込まれたメディアに対して FI_TRIM を発行します。現在の SD カード仕様は DISCARD コマンドに対応していませんが、カーネルは代わりに ERASE コマンドを使用します。SD カードのファームウェアでは、最適化を目的としてこのコマンドの使用を選択できます。

テスト

Adoptable Storage が機能しているかどうかをテストするには、次の CTS テストを実行します。

cts-tradefed run commandAndExit cts-dev \
    -m CtsAppSecurityHostTestCases \
    -t android.appsecurity.cts.AdoptableHostTest

デバイスに内蔵スロットがない場合、または USB コネクタをアクティブな adb 接続に使用している場合に、USB ドライブと SD カードの動作を確認するには、次のコマンドを使用します。

adb shell sm set-virtual-disk true