zoukankan      html  css  js  c++  java
  • 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 开源项目--存储

  • 相关阅读:
    1112评论
    1029 C语言文法
    0909编译原理理解和解释
    复利计算4.0-单元测试
    命令解析程序的编写
    《构建之法》1、2、3章思考与感想
    复利计算4.0
    实验三的分析与总结
    复利计算(更新)
    单、复利计算程序
  • 原文地址:https://www.cnblogs.com/liutimo/p/14021104.html
Copyright © 2011-2022 走看看