/ संग्रहण / उत्सर्जित / 0 / क्या है?


40

हाल ही में, मुझे लगा है कि अगर मैं /sdcard/Downloadइससे फ़ाइलें हटाता हूँ तो इससे फ़ाइलें हटा दी जाती हैं /storage/emulated/0/Download। और अगर मैं इसमें फ़ाइलों को जोड़ता हूं तो /sdcard/Downloadउन्हें डुप्लिकेट करता है /storage/emulated/0/Download

तो क्या है /storage/emulated/0/? हमारे एंड्रॉइड फाइल सिस्टम में हमारे पास क्या उद्देश्य हैं?

जवाबों:


40

/storage/emulated/0/Download फ़ाइलों के लिए वास्तविक पथ है।

/sdcard/Download के वास्तविक पथ के लिए एक सहानुभूति है /storage/emulated/0/Download

हालाँकि, वास्तविक फाइलें फाइलसिस्टम में स्थित हैं /data/media, जो तब /storage/emulated/0(और अक्सर अन्य माउंटपॉइंट के रूप में अच्छी तरह से) मुहिम की जाती है।

एक साइमलिंक कंप्यूटिंग में, एक प्रतीकात्मक लिंक किसी भी फ़ाइल के लिए एक शब्द है जिसमें किसी अन्य फ़ाइल या निर्देशिका का एक संदर्भ होता है जो निरपेक्ष या रिश्तेदार पथ के रूप में होता है और जो पथनाम रिज़ॉल्यूशन को प्रभावित करता है। डीईसी और डेटा जनरल के आरडीओएस से मिनिकॉम्प्यूटर ऑपरेटिंग सिस्टम में 1978 तक प्रतीकात्मक लिंक पहले से मौजूद थे।


15
यह उत्तर बेहतर होगा यदि इस बारे में थोड़ा समझाया जाए कि यह "अनुकरण" क्यों है। मेरा मानना ​​है कि एंड्रॉइड कुछ हैक करने के लिए एक एफएटी एफएस को हैक करता है जो वास्तव में कुछ बेहतर द्वारा समर्थित है, लेकिन मुझे विवरण नहीं पता है और इस सवाल पर क्लिक करके कुछ नया सीखने की उम्मीद है।
आर ..

4
@R .. "इम्यूलेटेड" IMHO इस तथ्य की ओर इशारा करता है कि यह "एमुलेटेड एसडी कार्ड" है (वास्तविक नहीं)।
इज़्ज़

10
@R .. यह SDCardFS का उपयोग करता है। यहाँ इसके बारे में एक उत्कृष्ट लेख दिया गया है: xda-developers.com/… ( संग्रह )
नॉन मोसे

16

/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 मामले में ) के माध्यम से या अनुकरण। FUSEsdcardfs

एंड्रॉइड विशिष्ट नहीं होने के कारण लेकिन आमतौर पर लिनक्स संबंधित, सिमलिंक और बाइंड माउंट (देखें "बाइंड माउंट बनाना") इस प्रश्न के दायरे से बाहर हैं, क्योंकि यह प्रश्न मुख्य रूप से इम्यूलेशन भाग के बारे में है।

अनुकरण:

क्यों अनुकरण यहाँ है? इम्यूलेटेड फाइलसिस्टम वास्तविक फाइल सिस्टम ( 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

without_storage_perm * आपके पास व्हाट्सएप इंस्टॉल होना चाहिए या किसी अन्य ऐप के निजी फ़ोल्डर का चयन करें।

अब फोर्स स्टॉप द टर्म एप और स्टोरेज की अनुमति प्रदान करें । आदेशों को फिर से निष्पादित करें:

with_storage_perm

समान फ़ाइलों और निर्देशिकाओं की अनुमतियों में अंतर देखें। ऐसा लगता है कि मूल लिनक्स फाइल सिस्टम पर अनुकरण के बिना बस संभव नहीं है जब एक साथ सैकड़ों ऐप (उपयोगकर्ता) को निपटाया जाना है। यह फाइलसिस्टम इम्यूलेशन है जो एक ही फाइल को एक ही समय में तीन अलग-अलग सेट की अनुमति के साथ उजागर करने देता है, यह स्वतंत्र है कि यह फाइल सिस्टम पर मूल अनुमति है:

# 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 क्या है?

सम्बंधित:


2
+1। मुझे लगता है कि मैं एमटीपी के बारे में गलत समझ रहा हूं। क्या MTP को लक्ष्य डिवाइस पर FAT फाइल सिस्टम के साथ काम करने की आवश्यकता है? यदि नहीं, तो क्या Google FUSE कार्यान्वयन के लिए ext4 फाइलसिस्टम का उपयोग नहीं कर सकता था क्योंकि किसी एप्लिकेशन के लिए साझा संग्रहण में केवल उनके डेटा तक पहुंचने के लिए अनुमतियों की जांच को लागू कर सकता था?
Firelord

1
@Firelord जब अनुकरण की चर्चा करते हैं, तो ध्यान MTP कार्यान्वयन पर नहीं होता है। Google ने पहले से ही कुछ Android जरूरतों को पूरा करने के लिए MTP प्रोटोकॉल में बदलाव किए और संभवतः वे कुछ मूल लिनक्स फाइल सिस्टम के माध्यम से इसे लागू कर सकते थे। लेकिन मुद्दा यह है FAT-like permission-less filesystemकि हमें एक ऐसी आवश्यकता है जो पिछड़े संगतता को सुनिश्चित करने के लिए एंड्रॉइड के शुरुआती दिनों में उपयोग की जाती है और जो एंड्रॉइड के बाहरी संग्रहण अवधारणा के डिजाइन को पूरा करती है। मैंने अपनी बात विस्तृत करने के लिए एक संपादन किया है।
इरफान लतीफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.