Android 12 में, FUSE पासथ्रू की सुविधा उपलब्ध है. इससे FUSE ओवरहेड कम हो जाता है. साथ ही, परफ़ॉर्मेंस को लोअर फ़ाइल सिस्टम के डायरेक्ट ऐक्सेस के बराबर बनाया जा सकता है. android12-5.4, android12-5.10, और android-mainline (सिर्फ़ टेस्ट करने के लिए) कर्नेल में, FUSE पासथ्रू की सुविधा उपलब्ध है. इसका मतलब है कि इस सुविधा के लिए, डिवाइस में इस्तेमाल किए जा रहे कर्नेल और डिवाइस पर चल रहे Android के वर्शन के हिसाब से सहायता मिलती है:
Android 11 से Android 12 पर अपग्रेड करने वाले डिवाइसों में, FUSE पासथ्रू की सुविधा उपलब्ध नहीं होती. ऐसा इसलिए, क्योंकि इन डिवाइसों के कर्नेल फ़्रीज़ कर दिए जाते हैं. साथ ही, इन्हें ऐसे कर्नेल पर नहीं ले जाया जा सकता जिन्हें FUSE पासथ्रू में किए गए बदलावों के साथ आधिकारिक तौर पर अपग्रेड किया गया हो.
Android 12 के साथ लॉन्च होने वाले डिवाइसों में, आधिकारिक कर्नेल का इस्तेमाल करने पर, FUSE पासथ्रू की सुविधा उपलब्ध होती है. ऐसे डिवाइसों के लिए, Android फ़्रेमवर्क कोड को MediaProvider मेनलाइन मॉड्यूल में एम्बेड किया जाता है. यह कोड, FUSE पासथ्रू की सुविधा लागू करता है. इसे अपने-आप अपग्रेड किया जाता है. ऐसे डिवाइस भी MediaProvider में किए गए बदलावों को ऐक्सेस कर सकते हैं जिनमें MediaProvider को मेनलाइन मॉड्यूल के तौर पर लागू नहीं किया गया है. जैसे, Android Go डिवाइस. ऐसा इसलिए, क्योंकि इन बदलावों को सार्वजनिक तौर पर शेयर किया जाता है.
FUSE बनाम SDCardFS
Userspace में फ़ाइल सिस्टम (FUSE) एक ऐसा तरीका है जिससे कर्नेल (FUSE ड्राइवर), FUSE फ़ाइल सिस्टम पर की जाने वाली कार्रवाइयों को userspace प्रोग्राम (FUSE डेमॉन) को आउटसोर्स कर सकता है. यह प्रोग्राम, कार्रवाइयों को लागू करता है. Android 11 में, SDCardFS को बंद कर दिया गया है. साथ ही, स्टोरेज एम्युलेशन के लिए FUSE को डिफ़ॉल्ट समाधान बना दिया गया है. इस बदलाव के तहत, Android ने अपना FUSE डेमॉन लागू किया है. इससे फ़ाइल ऐक्सेस को इंटरसेप्ट किया जा सकता है, सुरक्षा और निजता से जुड़ी अतिरिक्त सुविधाएं लागू की जा सकती हैं, और रनटाइम पर फ़ाइलों में बदलाव किया जा सकता है.
FUSE, कैश की जा सकने वाली जानकारी को मैनेज करने में अच्छी परफ़ॉर्म करता है. जैसे, पेज या एट्रिब्यूट. हालांकि, बाहरी स्टोरेज को ऐक्सेस करने पर, परफ़ॉर्मेंस में गिरावट आती है. यह गिरावट, मिड और लो-एंड डिवाइसों में साफ़ तौर पर दिखती है. ये गिरावटें, FUSE फ़ाइल सिस्टम को लागू करने में सहयोग करने वाले कॉम्पोनेंट की चेन की वजह से होती हैं. साथ ही, FUSE ड्राइवर और FUSE डेमॉन के बीच होने वाले कम्यूनिकेशन में, कर्नेल स्पेस से यूज़र स्पेस में कई बार स्विच करने की वजह से भी ऐसा होता है. इसकी तुलना में, लोअर फ़ाइल सिस्टम का डायरेक्ट ऐक्सेस ज़्यादा बेहतर होता है. इसे पूरी तरह से कर्नेल में लागू किया जाता है.
इन गिरावटों को कम करने के लिए, ऐप्लिकेशन
स्प्लिसिंग का इस्तेमाल करके, डेटा कॉपी करने की प्रोसेस को कम कर सकते हैं. साथ ही, ContentProvider
API
का इस्तेमाल करके, लोअर फ़ाइल सिस्टम की फ़ाइलों को डायरेक्ट ऐक्सेस किया जा सकता है. इन और अन्य
ऑप्टिमाइज़ेशन के बावजूद, FUSE का इस्तेमाल करने पर, लोअर फ़ाइल
सिस्टम के डायरेक्ट ऐक्सेस की तुलना में, रीड
और राइट कार्रवाइयों में बैंडविथ कम हो सकती है — खास तौर पर, रैंडम रीड
कार्रवाइयों में. इनमें कैशिंग या रीड-अहेड से कोई मदद नहीं मिलती. इसके अलावा, ऐसे ऐप्लिकेशन जो लेगसी /sdcard/ पाथ के ज़रिए सीधे स्टोरेज को ऐक्सेस करते हैं उनमें परफ़ॉर्मेंस में गिरावट साफ़ तौर पर दिखती है. खास तौर पर, IO-इंटेंसिव कार्रवाइयां करते समय.
SDcardFS userspace के अनुरोध
SDcardFS का इस्तेमाल करने से, कर्नेल से यूज़र स्पेस कॉल को हटाकर, FUSE के स्टोरेज एम्युलेशन और अनुमति की जांच की प्रोसेस को तेज़ किया जा सकता है. Userspace के अनुरोध, इस पाथ को फ़ॉलो करते हैं: Userspace → VFS → sdcardfs → VFS → ext4 → पेज कैश/स्टोरेज.
पहली इमेज. SDcardFS userspace के अनुरोध
FUSE userspace के अनुरोध
शुरुआत में, FUSE का इस्तेमाल स्टोरेज एम्युलेशन को चालू करने और ऐप्लिकेशन को डिवाइस के स्टोरेज या बाहरी एसडी कार्ड का पारदर्शी तरीके से इस्तेमाल करने की अनुमति देने के लिए किया जाता था. FUSE का इस्तेमाल करने पर, कुछ ओवरहेड होता है. ऐसा इसलिए, क्योंकि userspace का हर अनुरोध, इस पाथ को फ़ॉलो करता है: Userspace → VFS → FUSE ड्राइवर → FUSE डेमॉन → VFS → ext4 → पेज कैश/स्टोरेज.
दूसरी इमेज. FUSE userspace के अनुरोध
FUSE पासथ्रू के अनुरोध
फ़ाइल ऐक्सेस की ज़्यादातर अनुमतियों की जांच, फ़ाइल खोलने के समय की जाती है. इसके अलावा, उस फ़ाइल से पढ़ने और उसमें लिखने के दौरान, अनुमतियों की अतिरिक्त जांच की जाती है. कुछ मामलों में, फ़ाइल खोलने के समय यह पता चल सकता है कि अनुरोध करने वाले ऐप्लिकेशन के पास, अनुरोध की गई फ़ाइल का पूरा ऐक्सेस है. इसलिए, सिस्टम को FUSE ड्राइवर से FUSE डेमॉन को, रीड और राइट के अनुरोध फ़ॉरवर्ड करने की ज़रूरत नहीं होती. ऐसा इसलिए, क्योंकि इससे सिर्फ़ डेटा को एक जगह से दूसरी जगह ले जाया जाएगा.
FUSE पासथ्रू की मदद से, कोई अनुरोध खोलने को मैनेज करने वाला FUSE डेमॉन, FUSE ड्राइवर को यह सूचना दे सकता है कि कार्रवाई की अनुमति है. साथ ही, रीड और राइट के सभी अनुरोधों को सीधे लोअर फ़ाइल सिस्टम पर फ़ॉरवर्ड किया जा सकता है. इससे, यूज़र स्पेस FUSE डेमॉन के FUSE ड्राइवर के अनुरोधों का जवाब देने के लिए इंतज़ार करने का अतिरिक्त ओवरहेड कम हो जाता है.
यहां FUSE और FUSE पासथ्रू के अनुरोधों की तुलना दिखाई गई है.
तीसरी इमेज. FUSE का अनुरोध बनाम FUSE पासथ्रू का अनुरोध
जब कोई ऐप्लिकेशन, FUSE फ़ाइल सिस्टम को ऐक्सेस करता है, तो ये कार्रवाइयां होती हैं:
FUSE ड्राइवर, अनुरोध को मैनेज करता है और उसे एनक्यू करता है. इसके बाद, इसे FUSE डेमॉन को दिखाता है. FUSE डेमॉन,
/dev/fuseफ़ाइल पर किसी खास कनेक्शन इंस्टेंस के ज़रिए, उस FUSE फ़ाइल सिस्टम को मैनेज करता है. FUSE डेमॉन को इस फ़ाइल को पढ़ने से रोका जाता है.जब FUSE डेमॉन को कोई फ़ाइल खोलने का अनुरोध मिलता है, तो वह तय करता है कि उस फ़ाइल के लिए FUSE पासथ्रू की सुविधा उपलब्ध होनी चाहिए या नहीं. अगर यह सुविधा उपलब्ध है, तो डेमॉन:
FUSE ड्राइवर को इस अनुरोध के बारे में सूचना देता है.
FUSE_DEV_IOC_PASSTHROUGH_OPENioctl का इस्तेमाल करके, फ़ाइल के लिए FUSE पासथ्रू की सुविधा चालू करता है. इसे, खोले गए/dev/fuseके फ़ाइल डिस्क्रिप्टर पर लागू किया जाना चाहिए.
ioctl को (पैरामीटर के तौर पर) एक डेटा स्ट्रक्चर मिलता है. इसमें ये शामिल होते हैं:
लोअर फ़ाइल सिस्टम की उस फ़ाइल का फ़ाइल डिस्क्रिप्टर जो पासथ्रू सुविधा के लिए टारगेट है.
FUSE के उस अनुरोध का यूनीक आइडेंटिफ़ायर जिसे फ़िलहाल मैनेज किया जा रहा है. यह अनुरोध, ओपन या क्रिएट-एंड-ओपन होना चाहिए.
अतिरिक्त फ़ील्ड. इन्हें खाली छोड़ा जा सकता है. इनका इस्तेमाल, आने वाले समय में लागू करने के लिए किया जाता है.
अगर ioctl सही से काम करता है, तो FUSE डेमॉन, ओपन अनुरोध को पूरा करता है. FUSE ड्राइवर, FUSE डेमॉन के जवाब को मैनेज करता है. साथ ही, कर्नेल में मौजूद FUSE फ़ाइल में, लोअर फ़ाइल सिस्टम की फ़ाइल का रेफ़रंस जोड़ा जाता है. जब कोई ऐप्लिकेशन, FUSE फ़ाइल पर रीड/राइट कार्रवाई का अनुरोध करता है, तो FUSE ड्राइवर यह जांच करता है कि लोअर फ़ाइल सिस्टम की फ़ाइल का रेफ़रंस उपलब्ध है या नहीं.
अगर कोई रेफ़रंस उपलब्ध है, तो ड्राइवर, लोअर फ़ाइल सिस्टम की फ़ाइल को टारगेट करने वाले, एक ही पैरामीटर के साथ नया वर्चुअल फ़ाइल सिस्टम (वीएफ़एस) अनुरोध बनाता है.
अगर कोई रेफ़रंस उपलब्ध नहीं है, तो ड्राइवर, अनुरोध को FUSE डेमॉन पर फ़ॉरवर्ड करता है.
ऊपर दी गई कार्रवाइयां, सामान्य फ़ाइलों पर रीड/राइट और रीड-इटर/राइट-इटर के लिए होती हैं. साथ ही, मेमोरी-मैप की गई फ़ाइलों पर रीड/राइट कार्रवाइयों के लिए भी ये कार्रवाइयां होती हैं. किसी फ़ाइल के लिए, FUSE पासथ्रू की सुविधा तब तक उपलब्ध रहती है, जब तक वह फ़ाइल बंद नहीं हो जाती.
FUSE पासथ्रू की सुविधा लागू करना
Android 12 पर चलने वाले डिवाइसों पर, FUSE पासथ्रू की सुविधा चालू करने के लिए, टारगेट डिवाइस की $ANDROID_BUILD_TOP/device/…/device.mk फ़ाइल में ये लाइनें जोड़ें.
# Use FUSE passthrough
PRODUCT_PRODUCT_PROPERTIES += \
persist.sys.fuse.passthrough.enable=true
FUSE पासथ्रू की सुविधा बंद करने के लिए, ऊपर दिए गए कॉन्फ़िगरेशन में किए गए बदलाव को छोड़ दें या persist.sys.fuse.passthrough.enable को false पर सेट करें. अगर आपने पहले FUSE पासथ्रू की सुविधा चालू की है, तो इसे बंद करने पर, डिवाइस FUSE पासथ्रू की सुविधा का इस्तेमाल नहीं कर पाएगा. हालांकि, डिवाइस काम करता रहेगा.
डिवाइस को फ़्लैश किए बिना, FUSE पासथ्रू की सुविधा चालू/बंद करने के लिए, ADB कमांड का इस्तेमाल करके, सिस्टम प्रॉपर्टी में बदलाव करें. यहां इसका उदाहरण दिया गया है.
adb rootadb shell setprop persist.sys.fuse.passthrough.enable {true,false}adb reboot
ज़्यादा मदद के लिए, रेफ़रंस के तौर पर लागू करने का तरीका देखें.
FUSE पासथ्रू की पुष्टि करना
यह पुष्टि करने के लिए कि MediaProvider, FUSE पासथ्रू का इस्तेमाल कर रहा है, डीबग करने के मैसेज के लिए logcat देखें. उदाहरण के लिए:
adb logcat FuseDaemon:V \*:S
--------- beginning of main
03-02 12:09:57.833 3499 3773 I FuseDaemon: Using FUSE passthrough
03-02 12:09:57.833 3499 3773 I FuseDaemon: Starting fuse...लॉग में मौजूद FuseDaemon: Using FUSE passthrough एंट्री से यह पक्का होता है कि FUSE पासथ्रू का इस्तेमाल किया जा रहा है.
Android 12 CTS में CtsStorageTest शामिल है. इसमें ऐसे टेस्ट शामिल हैं जिनसे FUSE पासथ्रू ट्रिगर होता है. मैन्युअल तरीके से टेस्ट करने के लिए, नीचे दिखाए गए तरीके से atest का इस्तेमाल करें:
atest CtsStorageTest