기기 설정

외부 저장소는 vold init 서비스와 StorageManagerService 시스템 서비스 조합에 의해 관리됩니다. 실제 외부 저장소 용량의 마운팅은 준비 작업을 수행하여 미디어를 앱에 노출시키기 전에 준비하는 vold에 의해 처리됩니다.

참고: Android 8.0에서는 MountService 클래스의 이름이 StorageManagerService로 변경되었습니다.

파일 매핑

Android 4.2.2 이전의 경우 기기별 vold.fstab 구성 파일이 sysfs 기기에서 파일 시스템 마운트 지점으로 이어지는 매핑을 정의하며, 각 행이 다음 형식을 따릅니다.

    dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
    
  • label: 용량 라벨입니다.
  • mount_point: 용량이 마운트되어야 하는 파일 시스템 경로입니다.
  • partition: 파티션 번호(1 기반)이거나 사용 가능한 첫 번째 파티션의 경우 '자동'입니다.
  • sysfs_path: 이 마운트 지점을 제공할 수 있는 1개 이상의 sysfs 기기 경로입니다. 공백으로 구분되며 각 경로가 /로 시작해야 합니다.
  • flags: 쉼표로 구분된 선택적 플래그 목록입니다. /를 포함하면 안 됩니다. 가능한 값은 nonremovableencryptable입니다.

Android 버전 4.3 이후의 경우 다양한 fstab 파일이 init에 의해 사용되며, vold 및 복구가 /fstab.<device> 파일에서 통합되었습니다. vold에 의해 관리되는 외부 저장소 용량의 경우 항목이 다음 형식을 취해야 합니다.

    <src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
    
  • src: 마운트 지점을 제공할 수 있는 sysfs 아래의 기기 경로입니다 (보통 /sys에 마운트됨). 경로는 /로 시작해야 합니다.
  • mount_point: 용량이 마운트되어야 하는 파일 시스템 경로입니다.
  • type: 용량의 파일 시스템 유형입니다. 외장 카드의 경우 vfat인 경우가 일반적입니다.
  • mnt_flags: Vold가 이 필드를 무시하며, defaults로 설정되어야 합니다.
  • fs_mgr_flags: Vold가 이 필드에 voldmanaged= 플래그를 포함하지 않는 통합된 fstab의 모든 행을 무시합니다. 이 플래그에 이어 카드 설명 라벨과 파티션 번호 또는 단어 auto가 위치해야 합니다( 예: voldmanaged=sdcard:auto). 다른 가능한 플래그로는 nonremovable, encryptable=sdcard, noemulatedsdencryptable=userdata가 있습니다.

구성 세부정보

프레임워크 수준 이상의 저장소 상호작용은 StorageManagerService를 통해 처리됩니다. Android 6.0의 구성 변경사항(storage_list.xml 리소스 오버레이 제거 등)으로 인해 구성 세부정보가 두 가지 카테고리로 나뉩니다.

Android 5.x 이전

일반적으로 frameworks/base 오버레이를 통해 제공되는 기기별 storage_list.xml 구성 파일은 저장소 기기의 속성과 제약 조건을 정의합니다. <StorageList> 요소는 1개 이상의 <storage> 요소를 포함하며, 이 중 정확히 하나 기본으로 표시되어야 합니다. <storage> 속성은 다음과 같습니다.

  • mountPoint: 이 마운트의 파일 시스템 경로입니다.
  • storageDescription: 이 마운트를 설명하는 문자열 리소스입니다.
  • primary: 마운트가 기본 외부 저장소인 경우 true입니다.
  • removable: 마운트에 물리 SD 카드와 같은 이동식 미디어가 있으면 true입니다.
  • emulated: FUSE 데몬을 사용하여 마운트가 에뮬레이션되고 내부 저장소에 의해 지원되는 경우 true입니다.
  • mtp-reserve: 무료 저장소를 위해 MTP에서 확보해야 하는 스토리지 크기(MB) 입니다. 마운트가 에뮬레이션된 것으로 표시된 경우에만 사용됩니다.
  • allowMassStorage: 이 마운트를 USB 대량 저장소를 통해 공유할 수 있는 경우 true입니다.
  • maxFileSize: 최대 파일크기(MB)입니다.

기기는 내부 저장소에 의해 지원되는 대소문자를 구분하고 권한이 없는 파일 시스템을 에뮬레이션하여 외부 저장소를 제공할 수 있습니다. 하나의 가능한 구현은 기기별 init.rc 서비스로 추가 가능한 system/core/sdcard의 FUSE 데몬에 의해 제공됩니다.

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

여기서 source_path는 백업용 내부 저장소이고 dest_path는 타겟 마운트 지점입니다.

기기별 init.rc 스크립트를 구성할 때에는 EXTERNAL_STORAGE 환경 변수를 기존 외부 저장소에 대한 경로로 정의해야 합니다. /sdcard 경로 역시 심볼릭 링크를 통해 동일한 위치를 리졸브해야 합니다. 기기가 플랫폼 업데이트 간의 외부 저장소 위치를 조정하면 기존 경로가 계속 작동할 수 있도록 심볼릭 링크가 생성되어야 합니다.

Android 6.0

이제 저장소 하위 시스템 구성이 기기별 fstab 파일에 집중되며, 좀 더 동적인 동작을 지원할 수 있도록 과거의 여러 정적 구성 파일/변수가 제거되었습니다.

  • storage_list.xml 리소스 오버레이가 제거되어 더 이상 프레임워크에 의해 사용되지 않습니다. 이제 vold에 의해 감지되면 저장소 기기가 동적으로 구성됩니다.
  • EMULATED_STORAGE_SOURCE/TARGET 환경 변수가 제거되었으며 더 이상 사용자별 마운트 지점을 구성하기 위한 목적으로 Zygote에 의해 사용되지 않습니다. 대신 이제부터는 사용자별 GID로 사용자 구분이 시행되며, 기본 공유 저장소가 런타임 시 vold에 의해 제위치에 마운트됩니다.
    • 개발자는 사용 사례에 따라 계속해서 경로를 동적으로 또는 정적으로 빌드할 수 있습니다. 경로에 UUID를 포함하면 각 카드가 식별되어 개발자가 위치를 더욱 명확하게 알 수 있습니다. 예를 들어 /storage/ABCD-1234/report.txt/storage/DCBA-4321/report.txt와 명확히 다른 파일입니다.
  • 하드코딩된 FUSE 서비스가 기기별 init.rc 파일에서 제거되었으며 대신 필요한 경우 vold에서 동적으로 분기됩니다.

이러한 구성 변경사항 외에도 Android 6.0에는 채택 가능한 저장소의 개념이 포함됩니다. Android 6.0 기기의 경우 채택되지 않은 모든 물리 미디어가 휴대용으로 간주됩니다.

채택 가능한 저장소

fstab에 채택 가능한 저장소 기기를 나타내려면 fs_mgr_flags 필드에 encryptable=userdata 속성을 사용하세요. 일반적인 정의는 다음과 같습니다.

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

저장소 기기가 채택되면 플랫폼에서 콘텐츠를 삭제하고 두 파티션을 정의하는 GUID 파티션에 내용을 씁니다.

  • 나중에 사용할 수 있도록 예약된 작고 빈 android_meta 파티션입니다. 파티션 유형 GUID는 19A710A2-B3CA-11E4-B026-10604B889DCF입니다.
  • dm-crypt를 사용하여 암호화되고 커널 기능에 따라 ext4 또는 f2fs를 사용하여 형식이 지정되는 큰 android_ext 파티션입니다. 파티션 유형 GUID는 193D1EA4-B3CA-11E4-B075-10604B889DCF입니다.

휴대용 저장소

fstab에서는 voldmanaged 속성을 포함하는 저장소 기기가 기본적으로 휴대용으로 간주됩니다. 단, encryptable=userdata와 같은 다른 속성이 정의된 경우는 예외입니다. 예를 들어 여기에는 USB OTB 기기의 일반적인 정의가 나와 있습니다.

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

플랫폼은 blkid를 사용하여 마운트 전에 파일 시스템 유형을 감지하며, 사용자는 파일 시스템에 지원되지 않을 경우 미디어의 형식을 지정할지 결정할 수 있습니다.