बाहरी स्टोरेज को vold init
service और 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 फ़ाइलों को /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: एमटीपी को मुफ़्त स्टोरेज के लिए, कितने एमबी स्टोरेज को रिज़र्व करना चाहिए. इसका इस्तेमाल सिर्फ़ तब किया जाता है, जब माउंट को 'इम्यूलेट किया गया' के तौर पर मार्क किया गया हो.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, उपयोगकर्ता के हिसाब से माउंट पॉइंट कॉन्फ़िगर करने के लिए, इनका इस्तेमाल नहीं करता. इसके बजाय, अब उपयोगकर्ता के हिसाब से GIDs की मदद से, उपयोगकर्ता को अलग किया जाता है. साथ ही, रनटाइम के दौरान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
स्टोरेज डिवाइस को इस्तेमाल करने पर, प्लैटफ़ॉर्म उसमें मौजूद कॉन्टेंट मिटा देता है और एक 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 जैसे किसी दूसरे एट्रिब्यूट की जानकारी नहीं दी जाती. उदाहरण के लिए, यहां यूएसबी ओटीजी डिवाइसों के लिए सामान्य परिभाषा दी गई है:
/devices/*/xhci-hcd.0.auto/usb* auto auto defaults
voldmanaged=usb:auto
प्लैटफ़ॉर्म, माउंट करने से पहले फ़ाइल सिस्टम टाइप का पता लगाने के लिए blkid का इस्तेमाल करता है. साथ ही, फ़ाइल सिस्टम काम न करने पर, उपयोगकर्ता मीडिया को फ़ॉर्मैट करने का विकल्प चुन सकते हैं.