Bộ nhớ ngoài được quản lý bởi sự kết hợp của dịch vụ vold
init và dịch vụ hệ thống StorageManagerService
. Việc gắn các khối lượng bộ nhớ ngoài vật lý được xử lý bởi vold
, thực hiện các hoạt động dàn dựng để chuẩn bị phương tiện trước khi đưa nó lên ứng dụng.
Lưu ý: Trong Android 8.0, lớp MountService
được đổi tên thành StorageManagerService
.
Ánh xạ tệp
Đối với Android 4.2.2 trở về trước, tệp cấu hình vold.fstab
dành riêng cho thiết bị xác định ánh xạ từ thiết bị sysfs đến điểm gắn kết hệ thống tệp và mỗi dòng tuân theo định dạng sau:
dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
-
label
: Nhãn cho tập. -
mount_point
: Đường dẫn hệ thống tập tin nơi ổ đĩa sẽ được gắn kết. -
partition
: Số phân vùng (dựa trên 1), hoặc 'tự động' cho phân vùng có thể sử dụng đầu tiên. -
sysfs_path
: Một hoặc nhiều đường dẫn sysfs đến các thiết bị có thể cung cấp điểm gắn kết này. Được phân tách bằng dấu cách và mỗi dấu cách phải bắt đầu bằng/
. -
flags
: Danh sách cờ được phân tách bằng dấu phẩy tùy chọn, không được chứa/
. Các giá trị có thể bao gồmnonremovable
di chuyển và có thểencryptable
.
Đối với các phiên bản Android 4.3 trở lên, các tệp fstab khác nhau được init, vold và recovery sử dụng đã được thống nhất trong tệp /fstab.<device>
. Đối với các ổ lưu trữ bên ngoài do vold
quản lý, các mục nhập phải có định dạng sau:
<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
-
src
: Một đường dẫn dưới sysfs (thường được gắn tại / sys) tới thiết bị có thể cung cấp điểm gắn kết. Đường dẫn phải bắt đầu bằng/
. -
mount_point
: Đường dẫn hệ thống tập tin nơi ổ đĩa sẽ được gắn kết. -
type
: Loại hệ thống tệp trên ổ đĩa. Đối với thẻ bên ngoài, đây thường làvfat
. -
mnt_flags
:Vold
bỏ qua trường này và nó phải được đặt thànhdefaults
-
fs_mgr_flags
:Vold
bỏ qua bất kỳ dòng nào trong fstab hợp nhất không bao gồm cờvoldmanaged=
trong trường này. Cờ này phải được theo sau bởi một nhãn mô tả thẻ và số phân vùng hoặc từauto
. Đây là một ví dụ:voldmanaged=sdcard:auto
. Các cờ có thể có khác là không thể di chuyển được, có thểencryptable=sdcard
,nonremovable
vàencryptable=userdata
noemulatedsd
Chi tiết cấu hình
Các tương tác lưu trữ bên ngoài ở và trên cấp khung được xử lý thông qua StorageManagerService
. Do những thay đổi về cấu hình trong Android 6.0 (như xóa lớp phủ tài nguyên Storage_list.xml), chi tiết cấu hình được chia thành hai loại.
Android 5.x trở về trước
Tệp cấu hình storage_list.xml
dành riêng cho thiết bị, thường được cung cấp thông qua frameworks/base
, xác định các thuộc tính và ràng buộc của thiết bị lưu trữ. Phần tử <StorageList>
chứa một hoặc nhiều phần tử <storage>
, chính xác một phần tử trong số đó sẽ được đánh dấu là chính. Các thuộc tính <storage>
bao gồm:
-
mountPoint
: đường dẫn hệ thống tập tin của mount này. -
storageDescription
: tài nguyên chuỗi mô tả mount này. -
primary
: true nếu gắn kết này là bộ nhớ ngoài chính. -
removable
: true nếu ngàm này có phương tiện di động, chẳng hạn như thẻ SD vật lý. -
emulated
: true nếu mount này được mô phỏng và được hỗ trợ bởi bộ nhớ trong, có thể sử dụng daemon FUSE. -
mtp-reserve
: số MB dung lượng lưu trữ mà MTP nên dự trữ để lưu trữ miễn phí. Chỉ được sử dụng khi gắn kết được đánh dấu là giả lập. -
allowMassStorage
: true nếu giá đỡ này có thể được chia sẻ qua bộ nhớ chung USB. -
maxFileSize
: kích thước tệp tối đa tính bằng MB.
Các thiết bị có thể cung cấp bộ nhớ ngoài bằng cách mô phỏng hệ thống tệp không phân biệt chữ hoa chữ thường, không được phép được hỗ trợ bởi bộ nhớ trong. Một triển khai khả thi được cung cấp bởi daemon FUSE trong system/core/sdcard
, có thể được thêm vào dưới dạng dịch vụ init.rc
dành riêng cho thiết bị:
# virtual sdcard daemon running as media_rw (1023) service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023 class late_start
Trong đó source_path
là bộ nhớ trong sao lưu và dest_path
là điểm gắn kết đích.
Khi định cấu hình tập lệnh init.rc
dành riêng cho thiết bị, biến môi trường EXTERNAL_STORAGE
phải được xác định là đường dẫn đến bộ nhớ ngoài chính. Đường dẫn /sdcard
cũng phải phân giải đến cùng một vị trí, có thể thông qua một liên kết tượng trưng. Nếu một thiết bị điều chỉnh vị trí của bộ nhớ ngoài giữa các bản cập nhật nền tảng, thì các liên kết tượng trưng sẽ được tạo để các đường dẫn cũ tiếp tục hoạt động.
Android 6.0
Cấu hình của hệ thống con lưu trữ hiện được tập trung trong tệp fstab
dành riêng cho thiết bị và một số tệp / biến cấu hình tĩnh lịch sử đã bị xóa để hỗ trợ hành vi động hơn:
- Lớp phủ tài nguyên
storage_list.xml
đã bị xóa và không còn được sử dụng bởi khuôn khổ. Các thiết bị lưu trữ hiện được định cấu hình động khi đượcvold
phát hiện. - Các biến môi trường
EMULATED_STORAGE_SOURCE/TARGET
đã bị xóa và không còn được Zygote sử dụng để định cấu hình các điểm gắn kết dành riêng cho người dùng. Thay vào đó, việc phân tách người dùng hiện được thực thi với GID dành riêng cho người dùng và bộ nhớ dùng chung chính đượcvold
gắn vào vị trí trong thời gian chạy.- Các nhà phát triển có thể tiếp tục xây dựng đường dẫn động hoặc tĩnh tùy thuộc vào trường hợp sử dụng của họ. Bao gồm UUID trong đường dẫn xác định từng thẻ để làm cho vị trí rõ ràng hơn cho các nhà phát triển. (Ví dụ:
/storage/ABCD-1234/report.txt
rõ ràng là một tệp khác với/storage/DCBA-4321/report.txt
.)
- Các nhà phát triển có thể tiếp tục xây dựng đường dẫn động hoặc tĩnh tùy thuộc vào trường hợp sử dụng của họ. Bao gồm UUID trong đường dẫn xác định từng thẻ để làm cho vị trí rõ ràng hơn cho các nhà phát triển. (Ví dụ:
- Các dịch vụ FUSE được mã hóa cứng đã bị xóa khỏi các tệp
init.rc
dành riêng cho thiết bị và thay vào đó sẽ được tách động từvold
khi cần.
Ngoài những thay đổi về cấu hình này, Android 6.0 bao gồm khái niệm về bộ nhớ có thể sử dụng. Đối với các thiết bị Android 6.0, bất kỳ phương tiện vật lý nào không được chấp nhận đều được coi là di động.
Lưu trữ có thể chấp nhận
Để chỉ ra một thiết bị lưu trữ có thể sử dụng trong fstab
, hãy sử dụng thuộc tính encryptable=userdata
trong trường fs_mgr_flags
. Đây là một định nghĩa điển hình:
/devices/platform/mtk-msdc.1/mmc_host* auto auto defaults voldmanaged=sdcard1:auto,encryptable=userdata
Khi thiết bị lưu trữ được sử dụng, nền tảng sẽ xóa nội dung và ghi bảng phân vùng GUID xác định hai phân vùng:
- một phân vùng
android_meta
trống nhỏ được dành để sử dụng trong tương lai. Loại phân vùng GUID là 19A710A2-B3CA-11E4-B026-10604B889DCF. - một phân vùng
android_ext
lớn được mã hóa bằng dm-crypt và được định dạng bằng cách sử dụngext4
hoặcf2fs
tùy thuộc vào khả năng của hạt nhân. Loại phân vùng GUID là 193D1EA4-B3CA-11E4-B075-10604B889DCF.
Lưu trữ di động
Trong fstab
, các thiết bị lưu trữ có thuộc tính voldmanaged
được coi là di động theo mặc định trừ khi một thuộc tính khác như encryptable=userdata
được xác định. Ví dụ: đây là định nghĩa điển hình cho thiết bị USB OTG:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults voldmanaged=usb:auto
Nền tảng này sử dụng blkid
để phát hiện các loại hệ thống tệp trước khi gắn và người dùng có thể chọn định dạng phương tiện khi hệ thống tệp không được hỗ trợ.