기기 설정

외부 저장소는 vold 초기화 서비스와 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 기반) 또는 'auto'(사용할 수 있는 첫 번째 파티션인 경우)입니다.
  • sysfs_path: 이 마운트 지점을 제공할 수 있는 하나 이상의 기기 sysfs 경로입니다. 공백으로 구분되며 각 경로가 /로 시작해야 합니다.
  • flags: 쉼표로 구분된 플래그 목록입니다(선택사항). /를 포함하면 안 됩니다. 사용할 수 있는 값으로 nonremovableencryptable이 있습니다.

Android 버전 4.3 이상의 경우 init에서 다양한 fstab 파일을 사용하며, 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, noemulatedsd, encryptable=userdata입니다.

구성 세부정보

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

Android 5.x 이전

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

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

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

# 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입니다.
  • android_ext 파티션은 dm-crypt로 암호화하고 커널 기능에 따라 ext4 또는 f2fs을 사용하여 형식을 지정한 대용량 파티션입니다. 파티션 유형 GUID는 193D1EA4-B3CA-11E4-B075-10604B889DCF입니다.

휴대용 저장소

fstab에서는 voldmanaged 속성이 있는 저장소 기기에 encryptable=userdata와 같은 다른 속성이 정의되지 않는 한 기본적으로 이 기기를 휴대용으로 간주합니다. 예를 들어, USB OTG 기기의 일반적인 정의는 다음과 같습니다.

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

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