Home | History | Annotate | Download | only in storage
      1 <html devsite>
      2   <head>
      3     <title>Device Configuration</title>
      4     <meta name="project_path" value="/_project.yaml" />
      5     <meta name="book_path" value="/_book.yaml" />
      6   </head>
      7   <body>
      8   <!--
      9       Copyright 2017 The Android Open Source Project
     10 
     11       Licensed under the Apache License, Version 2.0 (the "License");
     12       you may not use this file except in compliance with the License.
     13       You may obtain a copy of the License at
     14 
     15           http://www.apache.org/licenses/LICENSE-2.0
     16 
     17       Unless required by applicable law or agreed to in writing, software
     18       distributed under the License is distributed on an "AS IS" BASIS,
     19       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     20       See the License for the specific language governing permissions and
     21       limitations under the License.
     22   -->
     23 
     24 
     25 
     26 <p>External storage is managed by a combination of the <code>vold</code> init
     27 service and <code>StorageManagerService</code> system service. Mounting of physical
     28 external storage volumes is handled by <code>vold</code>, which performs
     29 staging operations to prepare the media before exposing it to apps.</p>
     30 
     31 <h2 id=file_mappings>File mappings</h2>
     32 <p>For Android 4.2.2 and earlier, the device-specific <code>vold.fstab</code>
     33 configuration file defines mappings from sysfs devices to filesystem mount
     34 points, and each line follows this format:</p>
     35 <pre class="devsite-click-to-copy">
     36 dev_mount &lt;label&gt; &lt;mount_point&gt; &lt;partition&gt; &lt;sysfs_path&gt; [flags]
     37 </pre>
     38 <ul>
     39 <li><code>label</code>: Label for the volume.</li>
     40 <li><code>mount_point</code>: Filesystem path where the volume should be mounted.</li>
     41 <li><code>partition</code>: Partition number (1 based), or 'auto' for first usable partition.</li>
     42 <li><code>sysfs_path</code>: One or more sysfs paths to devices that can provide this mount
     43 point. Separated by spaces, and each must start with <code>/</code>.</li>
     44 <li><code>flags</code>: Optional comma separated list of flags, must not contain <code>/</code>.
     45 Possible values include <code>nonremovable</code> and <code>encryptable</code>.</li>
     46 </ul>
     47 <p>For Android releases 4.3 and later, the various fstab files used by init, vold and
     48 recovery were unified in the <code>/fstab.&lt;device&gt;</code> file. For external
     49 storage volumes that are managed by <code>vold</code>, the entries should have the
     50 following format:</p>
     51 <pre class="devsite-click-to-copy">
     52 &lt;src&gt; &lt;mnt_point&gt; &lt;type&gt; &lt;mnt_flags&gt; &lt;fs_mgr_flags&gt;
     53 </pre>
     54 <ul>
     55 <li><code>src</code>: A path under sysfs (usually mounted at /sys) to the device that
     56 can provide the mount point. The path must start with <code>/</code>.</li>
     57 <li><code>mount_point</code>: Filesystem path where the volume should be mounted.</li>
     58 <li><code>type</code>: The type of the filesystem on the volume. For external cards,
     59 this is usually <code>vfat</code>.</li>
     60 <li><code>mnt_flags</code>: <code>Vold</code> ignores this field and it should be set
     61 to <code>defaults</code></li>
     62 <li><code>fs_mgr_flags</code>: <code>Vold</code> ignores any lines in the unified fstab
     63 that do not include the <code>voldmanaged=</code> flag in this field. This flag must
     64 be followed by a label describing the card, and a partition number or the word
     65 <code>auto</code>. Here is an example: <code>voldmanaged=sdcard:auto</code>.
     66 Other possible flags are <code>nonremovable</code>,
     67 <code>encryptable=sdcard</code>, <code>noemulatedsd</code>, and <code>encryptable=userdata</code>.</li>
     68 </ul>
     69 
     70 <h2 id=configuration_details>Configuration details</h2>
     71 <p>External storage interactions at and above the framework level are handled
     72 through <code>MountService</code>. Due to configuration changes in Android 6.0 (like the
     73 removal of the storage_list.xml resource overlay), the configuration details
     74 are split into two categories.</p>
     75 
     76 <h3 id=android_5_x_and_earlier>Android 5.x and earlier</h3>
     77 
     78 <p>The device-specific <code>storage_list.xml</code> configuration
     79 file, typically provided through a <code>frameworks/base</code> overlay, defines the
     80 attributes and constraints of storage devices. The <code>&lt;StorageList&gt;</code> element
     81 contains one or more <code>&lt;storage&gt;</code> elements, exactly one of which should be marked
     82 primary. <code>&lt;storage&gt;</code> attributes include:</p>
     83 <ul>
     84 <li><code>mountPoint</code>: filesystem path of this mount.</li>
     85 <li><code>storageDescription</code>: string resource that describes this mount.</li>
     86 <li><code>primary</code>: true if this mount is the primary external storage.</li>
     87 <li><code>removable</code>: true if this mount has removable media, such as a physical SD
     88 card.</li>
     89 <li><code>emulated</code>: true if this mount is emulated and is backed by internal storage,
     90 possibly using a FUSE daemon.</li>
     91 <li><code>mtp-reserve</code>: number of MB of storage that MTP should reserve for free
     92 storage. Only used when mount is marked as emulated.</li>
     93 <li><code>allowMassStorage</code>: true if this mount can be shared via USB mass storage.</li>
     94 <li><code>maxFileSize</code>: maximum file size in MB.</li>
     95 </ul>
     96 <p>Devices may provide external storage by emulating a case-insensitive,
     97 permissionless filesystem backed by internal storage. One possible
     98 implementation is provided by the FUSE daemon in <code>system/core/sdcard</code>, which can
     99 be added as a device-specific <code>init.rc</code> service:</p>
    100 <pre class="devsite-click-to-copy">
    101 # virtual sdcard daemon running as media_rw (1023)
    102 service sdcard /system/bin/sdcard &lt;source_path&gt; &lt;dest_path&gt; 1023 1023
    103     class late_start
    104 </pre>
    105 <p>Where <code>source_path</code> is the backing internal storage and <code>dest_path</code> is the
    106 target mount point.</p>
    107 <p>When configuring a device-specific <code>init.rc</code> script, the <code>EXTERNAL_STORAGE</code>
    108 environment variable must be defined as the path to the primary external
    109 storage. The <code>/sdcard</code> path must also resolve to the same location, possibly
    110 through a symlink. If a device adjusts the location of external storage between
    111 platform updates, symlinks should be created so that old paths continue working.</p>
    112 
    113 <h3 id=android_6_0>Android 6.0</h3>
    114 <p>Configuration of the storage subsystem is now concentrated in the
    115 device-specific <code>fstab</code> file, and several historical static configuration files/variables have been
    116 removed to support more dynamic behavior:</p>
    117 <ul>
    118    <li>The <code>storage_list.xml</code> resource overlay has been removed and is no longer used by the framework.
    119 Storage devices are now configured dynamically when detected by <code>vold</code>.
    120    <li>The <code>EMULATED_STORAGE_SOURCE/TARGET</code> environment variables have been removed and are no longer used by Zygote to
    121 configure user-specific mount points. Instead, user separation is now enforced
    122 with user-specific GIDs, and primary shared storage is mounted into place by <code>vold</code> at runtime.
    123   <ul>
    124      <li>Developers may continue to build paths dynamically or statically depending on
    125 their use case. Including the UUID in the path identifies each card to make
    126 location clearer for developers. (For example, <code>/storage/ABCD-1234/report.txt</code> is clearly a different file than <code>/storage/DCBA-4321/report.txt</code>.)
    127   </ul>
    128    <li>The hard-coded FUSE services have been removed from device-specific <code>init.rc</code> files and are instead forked dynamically from <code>vold</code> when needed.
    129 </ul>
    130 <p>In addition to these configuration changes, Android 6.0 includes the notion of
    131 adoptable storage. For Android 6.0 devices, any physical media that is not
    132 adopted is viewed as portable. </p>
    133 
    134 <h4 id=adoptable_storage>Adoptable storage </h4>
    135 <p>To indicate an adoptable storage device in the <code>fstab</code>, use the <code>encryptable=userdata</code> attribute in the <code>fs_mgr_flags</code> field. Heres a typical definition:</p>
    136 <pre class="devsite-click-to-copy">
    137 /devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
    138 voldmanaged=sdcard1:auto,encryptable=userdata
    139 </pre>
    140 <p>When a storage device is adopted, the platform erases the contents and writes a
    141 GUID partition table that defines two partitions:</p>
    142 <ul>
    143    <li>a small empty <code>android_meta</code> partition that is reserved for future use. The partition type GUID is
    144 19A710A2-B3CA-11E4-B026-10604B889DCF.
    145    <li>a large <code>android_ext</code> partition that is encrypted using dm-crypt and formatted using either <code>ext4</code> or <code>f2fs</code> depending on the kernel capabilities. The partition type GUID is
    146 193D1EA4-B3CA-11E4-B075-10604B889DCF.
    147 </ul>
    148 <h4 id=portable_storage>Portable storage </h4>
    149 <p>In the <code>fstab</code>, storage devices with the <code>voldmanaged</code> attribute are considered to be portable by default unless another attribute
    150 like <code>encryptable=userdata</code> is defined. For example, heres a typical definition for USB OTG devices:</p>
    151 <pre class="devsite-click-to-copy">
    152 /devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
    153                                                     voldmanaged=usb:auto
    154 </pre>
    155 <p>The platform uses <code>blkid</code> to detect filesystem types before mounting, and users can choose to format the
    156 media when the filesystem is unsupported.</p>
    157 
    158   </body>
    159 </html>
    160