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

พื้นที่เก็บข้อมูลภายนอกได้รับการจัดการโดยชุดค่าผสมของ 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: เส้นทาง Sysf อย่างน้อย 1 รายการไปยังอุปกรณ์ที่มอบตัวยึดนี้ได้ คะแนน คั่นด้วยการเว้นวรรค และแต่ละรายการต้องขึ้นต้นด้วย /
  • flags: รายการ Flag ที่คั่นด้วยคอมมา (ไม่บังคับ) ต้องไม่มี / ค่าที่เป็นไปได้ ได้แก่ 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 ออก) รายละเอียดการกำหนดค่าจะแบ่งออกเป็น 2 หมวดหมู่

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

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

  • mountPoint: เส้นทางระบบไฟล์ของการต่อเชื่อมนี้
  • storageDescription: ทรัพยากรสตริงที่อธิบายการต่อเชื่อมนี้
  • primary: เป็นจริงหากการต่อเชื่อมนี้เป็นที่จัดเก็บข้อมูลภายนอกหลัก
  • removable: เป็นจริงหากต่อเชื่อมนี้มีสื่อแบบถอดได้ เช่น อุปกรณ์ SD
  • emulated: เป็นจริงหากมีการจำลองตัวยึดนี้และมีที่จัดเก็บข้อมูลภายใน อาจใช้ FUSE daemon
  • mtp-reserve: จำนวน MB ของพื้นที่เก็บข้อมูลที่ MTP ควรสงวนไว้ฟรี พื้นที่เก็บข้อมูล ใช้เมื่อมีการทำเครื่องหมายตัวยึดว่าจำลองเท่านั้น
  • allowMassStorage: เป็นจริงหากแชร์ต่อเชื่อมนี้ผ่านที่จัดเก็บข้อมูล USB ขนาดใหญ่ได้
  • maxFileSize: ขนาดไฟล์สูงสุดเป็น MB

อุปกรณ์อาจให้ที่จัดเก็บข้อมูลภายนอกโดยจำลองการไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ระบบไฟล์ที่ไม่ได้รับอนุญาตจากที่จัดเก็บข้อมูลภายใน เป็นไปได้ 1 อย่าง ได้มาจาก 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 จะต่อเชื่อมกับพื้นที่เก็บข้อมูลหลักที่ใช้ร่วมกันขณะรันไทม์
    • นักพัฒนาแอปอาจสร้างเส้นทางต่อไปแบบไดนามิกหรือแบบคงที่ ขึ้นอยู่กับ Use Case ของตน การรวม UUID ไว้ในเส้นทางจะเป็นการระบุการ์ดแต่ละรายการที่ต้องการ ชัดเจนยิ่งขึ้นสำหรับนักพัฒนาซอฟต์แวร์ (ตัวอย่างเช่น /storage/ABCD-1234/report.txt เป็นไฟล์ที่แตกต่างจาก /storage/DCBA-4321/report.txt อย่างชัดเจน)
  • บริการ FUSE แบบฮาร์ดโค้ดถูกนำออกจากไฟล์ init.rc เฉพาะอุปกรณ์แล้ว และจะแยกแบบไดนามิกจาก vold เมื่อจำเป็น

นอกจากการเปลี่ยนแปลงการกำหนดค่าเหล่านี้แล้ว Android 6.0 ยังมีแนวคิดเกี่ยวกับ พื้นที่เก็บข้อมูลแบบ Adable สำหรับอุปกรณ์ที่ใช้ Android 6.0 สื่อกายภาพใดๆ ที่ไม่ใช่ ที่ถูกนำไปใช้จะถือว่าพกพาได้

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

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