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

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