/storage/emulated/0/
वास्तव में /data/media/0/
एक उत्सर्जित / आभासी फाइलसिस्टम के माध्यम से उजागर होता है, वास्तविक नहीं।
यह मेरे पिछले उत्तर के संदर्भ में है , लेकिन अधिक प्रासंगिक विवरणों के साथ।
एंड्रॉइड स्टोरेज:
पर एंड्रॉयड 5 :
/sdcard >S> /storage/emulated/legacy >S> /mnt/shell/emulated/0
/mnt/shell/emulated >E> /data/media
पर एंड्रॉयड 6 + :
# for (Java) Android apps (running inside zygote virtual machine)
# "/storage to VIEW" bind mount is inside a separate mount namespace for every app
/sdcard >S> /storage/self/primary
/storage/self >B> /mnt/user/USER-ID
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/VIEW/emulated
/mnt/runtime/VIEW/emulated >E> /data/media
# for services/daemons/processes in root/global namespace (VIEW = default)
/sdcard >S> /storage/self/primary
/storage >B> /mnt/runtime/default
/mnt/runtime/default/self/primary >S> /mnt/user/USER-ID/primary
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/default/emulated
/mnt/runtime/default/emulated >E> /data/media
* >S>
सिमलिंक के लिए, >E>
नकल के लिए और >B>
के लिए बाँध माउंट
* USER-ID
के मामले में वर्तमान उपयोगकर्ता के Multiple Users
या Work Profile
, सामान्य रूप से 0
यानी कि डिवाइस स्वामी की
* VIEW
में से एक है read
या (permission.READ_EXTERNAL_STORAGE साथ एप्लिकेशन के लिए) write
(permission.WRITE_EXTERNAL_STORAGE) या default
(रूट में चल रहे प्रक्रियाओं के लिए / ग्लोबल माउंट नेमस्पेस यानी ज़िगोटे के बाहर)
* पिछले एंड्रॉइड वर्जन पर मामूली अंतर था लेकिन इसे लागू करने के दौरान एमुलेशन की अवधारणा पहले जैसी थी।
* एंड्रॉइड के माउंट नेमस्पेस कार्यान्वयन पर थोड़ा अधिक विवरण के लिए, यह उत्तर देखें ।
संक्षेप में, /sdcard
और /storage/emulated/0
- जो एक FAT / vFAT / FAT32 फाइलसिस्टम का प्रतिनिधित्व करते हैं - इंगित /data/media/0
या ( Adoptable Storage के/mnt/expand/[UUID]/media/0
मामले में ) के माध्यम से या अनुकरण। FUSE
sdcardfs
एंड्रॉइड विशिष्ट नहीं होने के कारण लेकिन आमतौर पर लिनक्स संबंधित, सिमलिंक और बाइंड माउंट (देखें "बाइंड माउंट बनाना") इस प्रश्न के दायरे से बाहर हैं, क्योंकि यह प्रश्न मुख्य रूप से इम्यूलेशन भाग के बारे में है।
अनुकरण:
क्यों अनुकरण यहाँ है? इम्यूलेटेड फाइलसिस्टम वास्तविक फाइल सिस्टम ( ext4
या f2fs
) पर एक अमूर्त परत है जो मूल रूप से दो उद्देश्यों में कार्य करता है:
- पीसी के लिए Android उपकरणों की USB कनेक्टिविटी को पुनःप्राप्त करें (अब MTP के माध्यम से लागू किया गया है)
- एसडी कार्ड पर उपयोगकर्ता के निजी मीडिया और अन्य ऐप के डेटा के लिए एप्लिकेशन / प्रक्रियाओं की अनधिकृत पहुंच को प्रतिबंधित करें।
विवरण के लिए Android की संग्रहण यात्रा पढ़ें , सारांश है:
प्रारंभिक एंड्रॉइड डिवाइस आंतरिक भंडारण पर कम थे और (शारीरिक रूप से) बाहरी एसडी कार्ड पर भरोसा करते थे जो परंपरागत रूप से अधिकांश पीसी के साथ संगतता सुनिश्चित करने के लिए फाइल सिस्टम के एफएटी परिवार का उपयोग करते हैं (पीसी दुनिया पर माइक्रोसॉफ्ट के प्रभुत्व को देखें)।
जब आंतरिक भंडारण आकार में बढ़ता है, तो समान फाइलसिस्टम को आंतरिक (अभी भी "बाहरी") एसडी कार्ड में स्थानांतरित किया गया था।
लेकिन FAT / vFAT कार्यान्वयन में दो प्रमुख मुद्दे थे जिन्हें धीरे-धीरे Google द्वारा संबोधित किया गया था:
- एंड्रॉइड डिवाइस पीसी से सीधे जुड़े हुए थे ( यूएसबी मास स्टोरेज ) जैसे कि हम इन दिनों यूएसबी ड्राइव कनेक्ट करते हैं। यूएमएस ब्लॉक स्तर पर डिवाइस को उजागर करता है और एसडी कार्ड को एंड्रॉइड फ्रेमवर्क (अन-माउंट्स) से डिस्कनेक्ट करता है, इस प्रकार पूरे डेटा को ऐप्स के लिए अनुपलब्ध बनाता है और संभवतः कई कार्यक्षमताओं को तोड़ता है।
- एफएटी (विकास के दिनों में विंडोज के पसंदीदा होने के नाते) को यूनिक्स की अनुमति (मोड, यूआईडी, जीआईडी और इसी तरह सहानुभूति , और इसी
ioctls
तरह FS_IOC_FIEMAP
) को लागू करने के लिए कभी नहीं बनाया गया था । इसलिए, एसडी कार्ड पर सभी डेटा सभी ऐप के लिए उपलब्ध थे (चूंकि हर एंड्रॉइड ऐप एक यूनिक्स / लिनक्स उपयोगकर्ता है और कोई प्रतिबंध नहीं है), इसलिए गंभीर गोपनीयता और सुरक्षा चिंताओं को बढ़ाता है।
इन दोनों मुद्दों को अनुकरण के माध्यम से संबोधित किया गया था:
- वास्तविक एसडी कार्ड भंडारण को
/data
विभाजन (या पहले से कुछ उपकरणों पर स्वतंत्र / sdcard विभाजन) में स्थानांतरित किया गया था, जो ext4
फाइलसिस्टम (धीरे-धीरे प्रतिस्थापित किया जा रहा है f2fs
) को पूरी तरह से UNIX अनुमतियों को लागू करता है।
- यूएमएस के उपयोग से बना यह डिज़ाइन असंभव है क्योंकि पूरे
/data
विभाजन को 2 और कारणों से पीसी के संपर्क में नहीं लाया जा सकता है: (1)
इसमें बहुत सारी सेटिंग्स और ऐप्स का डेटा शामिल है जिसे अन्य ऐप के साथ-साथ मानव उपयोगकर्ताओं से भी संरक्षित किया जाना है। (2)
लिनक्स फाइल सिस्टम विंडोज द्वारा समर्थित नहीं हैं।
इसलिए UMS को मीडिया ट्रांसफर प्रोटोकॉल के साथ बदल दिया गया जो कि PTP का क्लाइंट-सर्वर टाइप एक्सटेंशन है - जो पहले से स्थापित प्रोटोकॉल है। MTP ब्लॉक डिवाइस को उजागर नहीं करता है, लेकिन सॉफ्टवेयर स्टैक के माध्यम से काम करता है। एमटीपी होस्ट एक ऐप के रूप में एंड्रॉइड पर चलता है ( android.process.media
) एंड्रॉइड ढांचे में पूरी तरह से सैंडबॉक्स किया गया है, जो किसी भी बढ़े हुए कार्यों को करने में सक्षम नहीं है।
अब एप्स (और एमटीपी, जो कि एक एप भी है) इसके बजाय एमुलेटेड स्टोरेज के साथ इंटरैक्ट करते /data/media
हैं, एक ही समय में दोनों उद्देश्यों को प्राप्त करते हैं अर्थात अनुमति जांच को कम करके और ऊपरी सतह पर FAT फाइलसिस्टम की तरह देखते हैं।
Google अब FUSE की कमियों को दूर करने के लिए sdcardfs के माध्यम से अनुकरण लागू कर रहा है ; एक प्रमुख इनपुट / आउटपुट ओवरहेड है अर्थात पढ़ने / लिखने की गति में सुधार करने के लिए।
बाहरी भंडारण की
शर्तें : बाहरी भंडारण पर सार्वजनिक और निजी फ़ाइलों
की अवधारणा को एक उदाहरण का उपयोग करके दिखाया जा सकता है: टर्मिनेट एप्लिकेशन इंस्टॉल करें।
निर्देशिका बनाएँ और ।
फ़ाइलें बनाएँ और ।
निम्नलिखित आदेश निष्पादित करें:
/sdcard/Android/data/com.termux/test_dir
/sdcard/test_dir
/sdcard/Android/data/com.termux/test_file
/sdcard/Android/data/com.termux/test_file
* आपके पास व्हाट्सएप इंस्टॉल होना चाहिए या किसी अन्य ऐप के निजी फ़ोल्डर का चयन करें।
अब फोर्स स्टॉप द टर्म एप और स्टोरेज की अनुमति प्रदान करें । आदेशों को फिर से निष्पादित करें:
समान फ़ाइलों और निर्देशिकाओं की अनुमतियों में अंतर देखें। ऐसा लगता है कि मूल लिनक्स फाइल सिस्टम पर अनुकरण के बिना बस संभव नहीं है जब एक साथ सैकड़ों ऐप (उपयोगकर्ता) को निपटाया जाना है। यह फाइलसिस्टम इम्यूलेशन है जो एक ही फाइल को एक ही समय में तीन अलग-अलग सेट की अनुमति के साथ उजागर करने देता है, यह स्वतंत्र है कि यह फाइल सिस्टम पर मूल अनुमति है:
# touch /data/media/0/test_file
# stat -c '%a %u %g %n' /data/media/0/test_file
644 1023 1023 /data/media/0/test_file
# stat -c '%a %u %g %n' /mnt/runtime/*/emulated/0/test_file
660 0 1015 /mnt/runtime/default/emulated/0/test_file
640 0 9997 /mnt/runtime/read/emulated/0/test_file
660 0 9997 /mnt/runtime/write/emulated/0/test_file
यह भी देखें कि "U # _everybody" UID क्या है?
सम्बंधित: