Vold之存儲設備和fstab配置


前置知識

External Storage(外部存儲)

分類

  1. traditional storage(傳統存儲)

    • portable storage(便攜式存儲): SD卡或USB設備。
    • emulated storage(模擬存儲):將部分內部存儲暴露於模擬層來實現存儲。
  2. adoptable storage(可合並的存儲設備)

    這種存儲設備是指可以像內部存儲設備那樣進行加密和格式化的物理介質(例如 SD 卡或 USB 設備)。

fstab配置

android的 external storage 由Vold 和 StroageManagerService共同管理。

‼️ 在 Android 8.0 中,MountService 類已更名為 StorageManagerService

Android 4.3 及更高版本,init、vold 和 recovery 所使用的各種 fstab 文件在 /fstab.<device> 文件中進行統一。對於由 vold 管理的外部存儲卷,條目應采用以下格式:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src:sysfs(通常在 /sys 下裝載)下可以提供裝載點的設備的路徑。路徑必須以 / 開頭。
  • mount_point:要裝載卷的文件系統路徑。
  • type:卷上的文件系統類型。如果是外部卡,則通常為 vfat
  • mnt_flagsVold 會忽略此字段,應將其設置為 defaults
  • fs_mgr_flagsVold 會忽略此字段中不包含 voldmanaged= 標記的統一的 fstab 中的任何行。該標記必須后跟描述卡的標簽,以及分區號或字詞 auto。例如:voldmanaged=sdcard:auto。其他可能的標記有 nonremovableencryptable=sdcardnoemulatedsdencryptable=userdata

對於adoptable storage,需要在fstab中通過在fs_mgr_flags中 設置encryptable=userdata顯式說明。如果沒有這個flag,都會被vold當做便攜式設備處理。

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

合並存儲設備時,該平台會擦除內容並寫入定義兩個分區的 GUID 分區表:

  • 一個較小的空 android_meta 分區,預留以備將來使用的。分區類型 GUID 為 19A710A2-B3CA-11E4-B026-10604B889DCF
  • 一個較大的 android_ext 分區,使用 dm-crypt 加密並使用 ext4f2fs(取決於內核功能)格式化。分區類型 GUID 為 193D1EA4-B3CA-11E4-B075-10604B889DCF

在Vold創建存儲卷時,我們就能看到相關的代碼了。

fstab 中,具有 voldmanaged 屬性的存儲設備默認被視為便攜式設備,除非定義了其他屬性(如 encryptable=userdata)。例如,典型的 USB OTG 設備的定義如下:

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

該平台在裝載之前使用 blkid 檢測文件系統類型,用戶可以選擇在文件系統不受支持時將媒體格式化。

RK平台的 fstab 文件

# Android fstab file.
#<src>                                          <mnt_point>         <type>    <mnt_flags and options>                       <fs_mgr_flags>
# The filesystem that contains the filesystem checker binary (typically /system) cannot
# specify MF_CHECK, and must come before any filesystems that do specify MF_CHECK

/dev/block/by-name/oem            /oem                ext4      ro,noatime,nodiratime,noauto_da_alloc                                  wait,check
/dev/block/by-name/cache          /cache              ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard                wait,check
/dev/block/by-name/metadata       /metadata           ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard                wait
/dev/block/by-name/misc         /misc               emmc      defaults     defaults

/devices/platform/*usb*   auto vfat defaults      voldmanaged=usb:auto

/dev/block/zram0                                none                swap      defaults                                              zramsize=50%
# For sdmmc
/devices/platform/fe320000.dwmmc/mmc_host*        auto  auto    defaults        voldmanaged=sdcard1:auto,encryptable=userdata

說明

本文大多數內容摘選自Android 開源項目--存儲


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM