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

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

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

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

Android 5.x และรุ่นก่อนหน้า

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

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

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