การกำหนดค่าอุปกรณ์

ระบบจัดการพื้นที่เก็บข้อมูลภายนอกโดยรวมบริการ vold init service และStorageManagerService system service 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 อย่างน้อย 1 เส้นทางไปยังอุปกรณ์ที่ให้จุดยึดนี้ได้ แยกกันด้วยการเว้นวรรค และแต่ละรายการต้องขึ้นต้นด้วย /
  • flags: รายการ Flag ที่คั่นด้วยคอมมา (ไม่บังคับ) ต้องไม่มี / ค่าที่เป็นไปได้ ได้แก่ nonremovable และ encryptable

สำหรับ Android เวอร์ชัน 4.3 ขึ้นไป ไฟล์ fstab ต่างๆ ที่ init, vold และ recovery ใช้จะรวมอยู่ในไฟล์ /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 แบบรวม ที่ไม่มี Flag voldmanaged= ในช่องนี้ FLAG นี้ต้องตามด้วยป้ายกำกับที่อธิบายการ์ด และหมายเลขพาร์ติชันหรือคำว่า auto ตัวอย่างคือ voldmanaged=sdcard:auto Flag อื่นๆ ที่เป็นไปได้คือ nonremovable, encryptable=sdcard, noemulatedsd และ encryptable=userdata

รายละเอียดการกําหนดค่า

การโต้ตอบกับพื้นที่เก็บข้อมูลภายนอกที่ระดับเฟรมเวิร์กขึ้นไปจะจัดการผ่าน StorageManagerService เนื่องจากการเปลี่ยนแปลงการกําหนดค่าใน Android 6.0 (เช่น การนำการวางซ้อนทรัพยากร storage_list.xml ออก) รายละเอียดการกําหนดค่าจึงแบ่งออกเป็น 2 หมวดหมู่

Android 5.x และเก่ากว่า

ไฟล์การกําหนดค่า storage_list.xml สำหรับอุปกรณ์แต่ละเครื่อง ซึ่งโดยปกติจะระบุผ่านการวางซ้อน frameworks/base จะกําหนดแอตทริบิวต์และข้อจํากัดของอุปกรณ์จัดเก็บข้อมูล องค์ประกอบ <StorageList> มีองค์ประกอบ <storage> อย่างน้อย 1 รายการ โดยควรทำเครื่องหมายองค์ประกอบใดองค์ประกอบหนึ่งเป็นองค์ประกอบหลัก แอตทริบิวต์ <storage> ประกอบด้วย

  • mountPoint: เส้นทางไฟล์ระบบของการติดตั้งนี้
  • storageDescription: ทรัพยากรสตริงที่อธิบายการต่อเชื่อมนี้
  • primary: จริงหากการต่อเชื่อมนี้เป็นพื้นที่เก็บข้อมูลภายนอกหลัก
  • removable: จริงหากการต่อเชื่อมนี้มีสื่อแบบถอดออกได้ เช่น การ์ด SD
  • emulated: จริงหากการต่อเชื่อมนี้เป็นการจําลองและมีการสำรองข้อมูลโดยที่จัดเก็บข้อมูลภายใน ซึ่งอาจใช้ DEMON ของ FUSE
  • 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 จะต้องนำไปยังตำแหน่งเดียวกันด้วย ซึ่งอาจเป็นผ่านสัญลักษณ์ลิงก์ หากอุปกรณ์ปรับตำแหน่งของพื้นที่เก็บข้อมูลภายนอกระหว่างการอัปเดตแพลตฟอร์ม คุณควรสร้างลิงก์สัญลักษณ์เพื่อให้เส้นทางเดิมทำงานต่อไปได้

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 ระบบจะถือว่าสื่อแบบแผ่นดิสก์ที่ไม่ได้นำมาใช้เป็นแบบพกพา

พื้นที่เก็บข้อมูลแบบ Adoptable

หากต้องการระบุอุปกรณ์เก็บข้อมูลที่นำมาใช้ได้ใน fstab ให้ใช้แอตทริบิวต์ encryptable=userdata ในช่อง fs_mgr_flags คําจํากัดความทั่วไปมีดังนี้

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

เมื่อนำอุปกรณ์เก็บข้อมูลมาใช้ แพลตฟอร์มจะลบเนื้อหาและเขียนตารางพาร์ติชัน GUID ซึ่งกำหนดพาร์ติชัน 2 รายการ ดังนี้

  • พาร์ติชัน 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 เพื่อตรวจหาประเภทระบบไฟล์ก่อนการต่อเชื่อม และผู้ใช้สามารถเลือกฟอร์แมตสื่อได้เมื่อระบบไม่รองรับระบบไฟล์