बाहरी मेमोरी को 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
का इस्तेमाल करता है. साथ ही, उपयोगकर्ता, माउंट करने से पहले
'मीडिया' जब फ़ाइल सिस्टम के काम न करता हो.