ที่จัดเก็บข้อมูลภายนอกได้รับการจัดการโดยการรวมกันของบริการ 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
: พาธ sysfs หนึ่งรายการขึ้นไปไปยังอุปกรณ์ที่สามารถให้จุดเชื่อมต่อนี้ได้ คั่นด้วยช่องว่าง และแต่ละรายการต้องขึ้นต้นด้วย/
-
flags
: รายการแฟล็กที่คั่นด้วยเครื่องหมายจุลภาค ซึ่งต้องไม่มี/
ค่าที่เป็นไปได้ได้แก่ ค่าnonremovable
และencryptable
สำหรับ 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
ละเว้นบรรทัดใดๆ ใน fstab แบบรวมที่ไม่มีแฟล็กvoldmanaged=
ในฟิลด์นี้ ต้องตามด้วยป้ายกำกับที่อธิบายการ์ด และหมายเลขพาร์ติชันหรือคำว่าauto
ตามหลังแฟล็กนี้ นี่คือตัวอย่าง:voldmanaged=sdcard:auto
แฟล็กที่เป็นไปได้อื่นๆ คือnonremovable
,encryptable=sdcard
,noemulatedsd
และencryptable=userdata
รายละเอียดการกำหนดค่า
การโต้ตอบที่จัดเก็บข้อมูลภายนอกในระดับและสูงกว่าระดับเฟรมเวิร์กจะได้รับการจัดการผ่าน StorageManagerService
เนื่องจากการเปลี่ยนแปลงการกำหนดค่าใน Android 6.0 (เช่น การนำการซ้อนทับทรัพยากร storage_list.xml ออก) รายละเอียดการกำหนดค่าจึงแบ่งออกเป็นสองประเภท
Android 5.x และรุ่นก่อนหน้า
ไฟล์คอนฟิกูเรชัน storage_list.xml
เฉพาะอุปกรณ์ ซึ่งโดยทั่วไปจัดเตรียมผ่าน frameworks/base
จะกำหนดแอ็ตทริบิวต์และข้อจำกัดของอุปกรณ์หน่วยเก็บข้อมูล องค์ประกอบ <StorageList>
มีองค์ประกอบ <storage>
หนึ่งองค์ประกอบขึ้นไป โดยองค์ประกอบหนึ่งควรถูกทำเครื่องหมายเป็นองค์ประกอบหลัก คุณลักษณะ <storage>
ประกอบด้วย:
-
mountPoint
: เส้นทางระบบไฟล์ของการเมานต์นี้ -
storageDescription
: ทรัพยากรสตริงที่อธิบายการเมาต์นี้ -
primary
: true หากการเมาท์นี้เป็นที่จัดเก็บข้อมูลภายนอกหลัก -
removable
: จริงหากการเมาท์นี้มีสื่อแบบถอดได้ เช่น การ์ด SD จริง -
emulated
: true หากการเมาท์นี้ถูกจำลองและสำรองข้อมูลโดยที่จัดเก็บข้อมูลภายใน ซึ่งอาจใช้ FUSE daemon -
mtp-reserve
: จำนวน MB ของพื้นที่เก็บข้อมูลที่ MTP ควรสำรองไว้สำหรับพื้นที่เก็บข้อมูลฟรี ใช้เฉพาะเมื่อเมานต์ถูกทำเครื่องหมายว่าจำลองเท่านั้น -
allowMassStorage
: เป็นจริงหากการเมานต์นี้สามารถแชร์ผ่านที่เก็บข้อมูล USB ได้ -
maxFileSize
: ขนาดไฟล์สูงสุดเป็น MB
อุปกรณ์อาจจัดให้มีที่จัดเก็บข้อมูลภายนอกโดยการจำลองระบบไฟล์ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่และไม่ได้รับอนุญาตซึ่งได้รับการสนับสนุนโดยที่จัดเก็บข้อมูลภายใน การใช้งานที่เป็นไปได้อย่างหนึ่งนั้นมาจาก FUSE daemon ใน system/core/sdcard
ซึ่งสามารถเพิ่มเป็นบริการ 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
จะต้องแก้ไขไปยังตำแหน่งเดียวกัน ซึ่งอาจผ่านลิงก์สัญลักษณ์ หากอุปกรณ์ปรับตำแหน่งของที่จัดเก็บข้อมูลภายนอกระหว่างการอัปเดตแพลตฟอร์ม ควรสร้างซิมลิงก์เพื่อให้เส้นทางเก่าทำงานต่อไป
แอนดรอยด์ 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
อย่างชัดเจน)
- นักพัฒนาอาจยังคงสร้างเส้นทางแบบไดนามิกหรือแบบคงที่ต่อไป ขึ้นอยู่กับกรณีการใช้งานของพวกเขา การรวม UUID ไว้ในเส้นทางจะระบุการ์ดแต่ละใบเพื่อทำให้ตำแหน่งชัดเจนยิ่งขึ้นสำหรับนักพัฒนา (ตัวอย่างเช่น
- บริการ FUSE แบบฮาร์ดโค้ดได้ถูกลบออกจากไฟล์
init.rc
เฉพาะอุปกรณ์ และจะถูกแยกออกจากvold
แบบไดนามิกแทนเมื่อจำเป็น
นอกเหนือจากการเปลี่ยนแปลงการกำหนดค่าเหล่านี้แล้ว Android 6.0 ยังมีแนวคิดเรื่องพื้นที่เก็บข้อมูลที่ปรับใช้ได้ สำหรับอุปกรณ์ Android 6.0 สื่อทางกายภาพใดๆ ที่ไม่ได้นำมาใช้จะถูกมองว่าพกพาได้
พื้นที่เก็บข้อมูลที่นำมาใช้ได้
หากต้องการระบุอุปกรณ์จัดเก็บข้อมูลที่ปรับใช้ได้ใน fstab
ให้ใช้แอ็ตทริบิวต์ encryptable=userdata
ในฟิลด์ fs_mgr_flags
ต่อไปนี้เป็นคำจำกัดความทั่วไป:
/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
เพื่อตรวจจับประเภทระบบไฟล์ก่อนทำการติดตั้ง และผู้ใช้สามารถเลือกฟอร์แมตสื่อได้เมื่อระบบไฟล์ไม่รองรับ