Konfigurasi perangkat

Penyimpanan eksternal dikelola oleh kombinasi layanan init vold dan layanan sistem StorageManagerService. Pemasangan volume penyimpanan eksternal fisik ditangani oleh vold, yang melakukan operasi staging untuk menyiapkan media sebelum mengeksposnya ke aplikasi.

Catatan: Di Android 8.0, class MountService diganti namanya menjadi StorageManagerService.

Pemetaan file

Untuk Android 4.2.2 dan yang lebih lama, file konfigurasi vold.fstab khusus perangkat menentukan pemetaan dari perangkat sysfs ke titik mount file sistem, dan setiap baris mengikuti format ini:

dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
  • label: Label untuk volume.
  • mount_point: Jalur sistem file tempat volume harus dipasang.
  • partition: Nomor partisi (berbasis 1), atau 'otomatis' untuk partisi pertama yang dapat digunakan.
  • sysfs_path: Satu atau beberapa jalur sysfs ke perangkat yang dapat menyediakan titik mount ini. Dipisahkan dengan spasi, dan setiap parameter harus diawali dengan /.
  • flags: Daftar flag opsional yang dipisahkan koma, tidak boleh berisi /. Nilai yang mungkin mencakup nonremovable dan encryptable.

Untuk rilis Android 4.3 dan yang lebih baru, berbagai file fstab yang digunakan oleh init, vold, dan recovery disatukan dalam file /fstab.<device>. Untuk volume penyimpanan eksternal yang dikelola oleh vold, entri harus memiliki format berikut:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src: Jalur di sysfs (biasanya dipasang di /sys) ke perangkat yang dapat memberikan titik pemasangan. Jalur harus diawali dengan /.
  • mount_point: Jalur sistem file tempat volume harus dipasang.
  • type: Jenis sistem file pada volume. Untuk kartu eksternal, ini biasanya vfat.
  • mnt_flags: Vold mengabaikan kolom ini dan harus ditetapkan ke defaults
  • fs_mgr_flags: Vold mengabaikan baris apa pun dalam fstab terpadu yang tidak menyertakan tanda voldmanaged= di kolom ini. Flag ini harus diikuti dengan label yang menjelaskan kartu, dan nomor partisi atau kata auto. Berikut adalah contohnya: voldmanaged=sdcard:auto. Flag lain yang mungkin adalah nonremovable, encryptable=sdcard, noemulatedsd, dan encryptable=userdata.

Detail konfigurasi

Interaksi penyimpanan eksternal di dan di atas level framework ditangani melalui StorageManagerService. Karena perubahan konfigurasi di Android 6.0 (seperti penghapusan overlay resource storage_list.xml), detail konfigurasi dibagi menjadi dua kategori.

Android 5.x dan yang lebih lama

File konfigurasi storage_list.xml khusus perangkat, yang biasanya disediakan melalui overlay frameworks/base, menentukan atribut dan batasan perangkat penyimpanan. Elemen <StorageList> berisi satu atau beberapa elemen <storage>, yang salah satunya harus ditandai sebagai utama. Atribut <storage> mencakup:

  • mountPoint: jalur sistem file pemasangan ini.
  • storageDescription: resource string yang mendeskripsikan pemasangan ini.
  • primary: benar jika pemasangan ini adalah penyimpanan eksternal utama.
  • removable: benar jika pemasangan ini memiliki media yang dapat dilepas, seperti kartu SD fisik.
  • emulated: benar jika pemasangan ini diemulasi dan didukung oleh penyimpanan internal, mungkin menggunakan daemon FUSE.
  • mtp-reserve: jumlah MB penyimpanan yang harus dicadangkan MTP untuk penyimpanan gratis. Hanya digunakan saat pemasangan ditandai sebagai diemulasi.
  • allowMassStorage: benar jika pemasangan ini dapat dibagikan melalui penyimpanan massal USB.
  • maxFileSize: ukuran file maksimum dalam MB.

Perangkat dapat menyediakan penyimpanan eksternal dengan mengemulasi sistem file tanpa izin dan tidak peka huruf besar/kecil yang didukung oleh penyimpanan internal. Salah satu kemungkinan implementasi disediakan oleh daemon FUSE di system/core/sdcard, yang dapat ditambahkan sebagai layanan init.rc khusus perangkat:

# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023
    class late_start

Dengan source_path adalah penyimpanan internal pendukung dan dest_path adalah direktori pemasangan target.

Saat mengonfigurasi skrip init.rc khusus perangkat, variabel lingkungan EXTERNAL_STORAGE harus ditentukan sebagai jalur ke penyimpanan eksternal utama. Jalur /sdcard juga harus di-resolve ke lokasi yang sama, mungkin melalui symlink. Jika perangkat menyesuaikan lokasi penyimpanan eksternal di antara update platform, symlink harus dibuat agar jalur lama terus berfungsi.

Android 6.0

Konfigurasi subsistem penyimpanan kini terkonsentrasi dalam file fstab khusus perangkat, dan beberapa file/variabel konfigurasi statis historis telah dihapus untuk mendukung perilaku yang lebih dinamis:

  • Overlay resource storage_list.xml telah dihapus dan tidak lagi digunakan oleh framework. Perangkat penyimpanan kini dikonfigurasi secara dinamis saat terdeteksi oleh vold.
  • Variabel lingkungan EMULATED_STORAGE_SOURCE/TARGET telah dihapus dan tidak lagi digunakan oleh Zygote untuk mengonfigurasi titik pemasangan khusus pengguna. Sebagai gantinya, pemisahan pengguna kini diterapkan dengan GID khusus pengguna, dan penyimpanan bersama utama dipasang ke tempatnya oleh vold saat runtime.
    • Developer dapat terus mem-build jalur secara dinamis atau statis, bergantung pada kasus penggunaannya. Menyertakan UUID dalam jalur akan mengidentifikasi setiap kartu untuk membuat lokasi lebih jelas bagi developer. (Misalnya, /storage/ABCD-1234/report.txt jelas merupakan file yang berbeda dengan /storage/DCBA-4321/report.txt.)
  • Layanan FUSE yang di-hardcode telah dihapus dari file init.rc khusus perangkat dan sebagai gantinya di-fork secara dinamis dari vold saat diperlukan.

Selain perubahan konfigurasi ini, Android 6.0 menyertakan konsep penyimpanan yang dapat diadopsi. Untuk perangkat Android 6.0, media fisik apa pun yang tidak diadopsi akan dianggap sebagai portabel.

Penyimpanan yang dapat diadaptasi

Untuk menunjukkan perangkat penyimpanan yang dapat diadopsi di fstab, gunakan atribut encryptable=userdata di kolom fs_mgr_flags. Berikut adalah definisi umumnya:

/devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
voldmanaged=sdcard1:auto,encryptable=userdata

Saat perangkat penyimpanan diadopsi, platform akan menghapus konten dan menulis tabel partisi GUID yang menentukan dua partisi:

  • partisi android_meta kosong kecil yang dicadangkan untuk penggunaan pada masa mendatang. GUID jenis partisi adalah 19A710A2-B3CA-11E4-B026-10604B889DCF.
  • partisi android_ext besar yang dienkripsi menggunakan dm-crypt dan diformat menggunakan ext4 atau f2fs, bergantung pada kemampuan kernel. GUID jenis partisi adalah 193D1EA4-B3CA-11E4-B075-10604B889DCF.

Penyimpanan portabel

Di fstab, perangkat penyimpanan dengan atribut voldmanaged dianggap portabel secara default, kecuali jika atribut lain seperti encryptable=userdata ditentukan. Misalnya, berikut adalah definisi umum untuk perangkat USB OTG:

/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
                                                    voldmanaged=usb:auto

Platform ini menggunakan blkid untuk mendeteksi jenis sistem file sebelum pemasangan, dan pengguna dapat memilih untuk memformat media jika sistem file tidak didukung.