डिवाइस कॉन्फ़िगरेशन

बाहरी मेमोरी को 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 और उसके बाद के वर्शन रिलीज़ करने के लिए, 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: अगर यह माउंट मुख्य बाहरी स्टोरेज है, तो सही है.
  • removable: अगर इस माउंट में, फ़िज़िकल एसडी जैसा हटाया जा सकने वाला मीडिया मौजूद है, तो यह सही है कार्ड.
  • emulated: अगर इस माउंट को एम्युलेट किया गया है और इसके बैक अप के लिए डिवाइस का स्टोरेज इस्तेमाल किया गया है, तो यह सही है, शायद FUSE डीमन का इस्तेमाल करके.
  • mtp-reserve: MTP मुफ़्त में मिलने वाला स्टोरेज का उतना स्टोरेज इस्तेमाल कर सकता है स्टोरेज. इसका इस्तेमाल सिर्फ़ तब किया जाता है, जब माउंट को एम्युलेट किया गया के तौर पर मार्क किया गया हो.
  • allowMassStorage: अगर इस माउंट को यूएसबी मास स्टोरेज के ज़रिए शेयर किया जा सकता है, तो यह सही है.
  • maxFileSize: फ़ाइल का ज़्यादा से ज़्यादा साइज़ एमबी में होना चाहिए.

डिवाइस केस-इनसेंसिटिव, डिवाइस के स्टोरेज का इस्तेमाल करके, बिना अनुमति वाले फ़ाइल सिस्टम का इस्तेमाल किया जा सकता है. एक संभव लागू करने की सुविधा system/core/sdcard में FUSE डीमन से दी गई है, जो इसे डिवाइस के लिए खास तौर पर 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 के हिसाब से माउंट हो जाता है.
    • पाथ बनाने की प्रोसेस जारी रखने के लिए डेवलपर, डाइनैमिक या स्टैटिक तरीके से पाथ बना सकते हैं. कुछ भी शामिल न करें. पाथ में यूयूआईडी शामिल करने से, हर कार्ड की पहचान की जाती है डेवलपर के लिए स्थान अधिक साफ़ होता है. (उदाहरण के लिए, साफ़ तौर पर /storage/ABCD-1234/report.txt फ़ाइल, /storage/DCBA-4321/report.txt से अलग है.)
  • हार्ड कोड की गई FUSE सेवाओं को डिवाइस के हिसाब से बनी init.rc फ़ाइलों से हटा दिया गया है. इसके बजाय, ज़रूरत पड़ने पर vold से डाइनैमिक तौर पर फ़ोर्क की जाती है.

कॉन्फ़िगरेशन में किए गए इन बदलावों के अलावा, Android 6.0 में डिवाइस का स्टोरेज. Android 6.0 डिवाइस के लिए, ऐसा कोई भी फ़िज़िकल मीडिया जो अपनाया गया फ़ॉर्मैट, पोर्टेबल के तौर पर देखा जाता है.

डिवाइस का स्टोरेज

fstab में, डिवाइस के स्टोरेज डिवाइस के बारे में बताने के लिए, fs_mgr_flags फ़ील्ड में encryptable=userdata एट्रिब्यूट का इस्तेमाल करें. यहां एक सामान्य परिभाषा दी गई है:

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

जब कोई स्टोरेज डिवाइस इस्तेमाल किया जाता है, तो प्लैटफ़ॉर्म कॉन्टेंट मिटा देता है और जीयूआईडी (ग्लोबली यूनीक आइडेंटिफ़ायर) पार्टीशन वाली टेबल, जो दो सेगमेंट के बारे में बताती है:

  • एक छोटा खाली android_meta हिस्सा, जो आने वाले समय में इस्तेमाल के लिए रिज़र्व है. यह पार्टिशन टाइप जीयूआईडी है 19A710A2-B3CA-11E4-B026-10604B889DCF.
  • एक बड़ा android_ext पार्टिशन जिसे dm-क्रिप्ट का इस्तेमाल करके एन्क्रिप्ट (सुरक्षित) किया गया है और जिसे कर्नेल की क्षमताओं के हिसाब से, ext4 या f2fs का इस्तेमाल करके फ़ॉर्मैट किया गया है. यह पार्टिशन टाइप जीयूआईडी है 193D1EA4-B3CA-11E4-B075-10604B889DCF.

पोर्टेबल संग्रहण

fstab में, voldmanaged एट्रिब्यूट वाले स्टोरेज डिवाइसों को डिफ़ॉल्ट रूप से पोर्टेबल माना जाता है. हालांकि, ऐसा तब ही होगा, जब कोई अन्य एट्रिब्यूट जैसे encryptable=userdata परिभाषित किया गया है. उदाहरण के लिए, यूएसबी ओटीजी डिवाइसों की सामान्य परिभाषा यहां दी गई है:

/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
                                                    voldmanaged=usb:auto

यह प्लैटफ़ॉर्म, माउंट करने से पहले फ़ाइल सिस्टम के टाइप का पता लगाने के लिए blkid का इस्तेमाल करता है. साथ ही, उपयोगकर्ता, माउंट करने से पहले 'मीडिया' जब फ़ाइल सिस्टम के काम न करता हो.