FUSE পাসথ্রু

Android 12-এ FUSE পাসথ্রু কাজ করে, যা FUSE ওভারহেডকে কমিয়ে দেয়। এর ফলে, নিচের লেভেলের ফাইল সিস্টেমে সরাসরি অ্যাক্সেসের মতো পারফর্ম্যান্স পাওয়া যায়। FUSE পাসথ্রু android12-5.4, android12-5.10 এবং android-mainline (শুধুমাত্র টেস্টিং) কার্নেলে কাজ করে, যার অর্থ হল এই ফিচারের জন্য সহায়তা ডিভাইসের ব্যবহার করা কার্নেল এবং ডিভাইসে চলমান Android ভার্সনের উপর নির্ভর করে:

  • Android 11 থেকে Android 12-এ আপগ্রেড করা ডিভাইস FUSE পাসথ্রু সাপোর্ট করতে পারে না, কারণ এইসব ডিভাইসের কার্নেল ফ্রিজ করা আছে এবং সেগুলি FUSE পাসথ্রু পরিবর্তনের সাথে আনুষ্ঠানিকভাবে আপগ্রেড করা কার্নেলে মুভ করতে পারে না।

  • Android 12-এর সাথে লঞ্চ করা ডিভাইস, অফিসিয়াল কার্নেল ব্যবহার করার সময় FUSE পাসথ্রু কাজ করতে পারে। এই ধরনের ডিভাইসের জন্য, FUSE পাসথ্রু প্রয়োগকারী Android ফ্রেমওয়ার্ক কোডটি MediaProvider মেইনলাইন মডিউলে এম্বেড করা থাকে, যা অটোমেটিক আপগ্রেড করা হয়। যেসব ডিভাইস মেইনলাইন মডিউল হিসেবে MediaProvider প্রয়োগ করে না (যেমন, Android Go ডিভাইস), সেগুলিও MediaProvider পরিবর্তন অ্যাক্সেস করতে পারে, কারণ সেগুলি সর্বজনীনভাবে শেয়ার করা হয়।

FUSE বনাম SDCardFS

ইউজারস্পেসে ফাইল সিস্টেম (FUSE) হল এমন একটি মেকানিজম যা FUSE ফাইল সিস্টেমে করা অপারেশন কার্নেল (FUSE ড্রাইভার) থেকে ইউজারস্পেস প্রোগ্রামে (FUSE ডেমন) আউটসোর্স করার অনুমতি দেয়, যা অপারেশন প্রয়োগ করে। Android 11 SDCardFS-এর ব্যবহার বন্ধ করে দিয়েছে এবং স্টোরেজ এমুলেশনের জন্য FUSE-কে ডিফল্ট সমাধান হিসেবে সেট করেছে। এই পরিবর্তনের অংশ হিসেবে, ফাইল অ্যাক্সেস ইন্টারসেপ্ট করতে, অতিরিক্ত নিরাপত্তা ও গোপনীয়তা ফিচার প্রয়োগ করতে এবং রানটাইমে ফাইল ম্যানিপুলেট করতে, Android নিজস্ব FUSE ডেমনের প্রয়োগ করেছে।

FUSE, পৃষ্ঠা বা অ্যাট্রিবিউটের মতো ক্যাশে করা যায় এমন তথ্য নিয়ে কাজ করার সময় ভালো পারফর্ম করলেও, এটি এক্সটার্নাল স্টোরেজ অ্যাক্সেস করার সময় পারফর্ম্যান্স রিগ্রেশন নিয়ে আসে যা বিশেষ করে মাঝারি ও নিম্ন-মানের ডিভাইসে দেখা যায়। FUSE ফাইল সিস্টেমের ইমপ্লিমেন্টেশনে একসাথে কাজ করা কম্পোনেন্টের চেনের কারণে এই রিগ্রেশন হয়, এর পাশাপাশি FUSE ড্রাইভার ও FUSE ডেমন (লোয়ার ফাইল সিস্টেমে সরাসরি অ্যাক্সেসের তুলনায়, যা আরও লিনার এবং কার্নেলে সম্পূর্ণভাবে ইমপ্লিমেন্ট করা হয়) কমিউনিকেশনে কার্নেল স্পেস থেকে ইউজার স্পেসে একাধিক সুইচ করার কারণেও এটি হয়।

এইসব রিগ্রেশন কমানোর জন্য, অ্যাপ ডেটা কপি করা কমাতে স্প্লাইসিং ব্যবহার করতে পারে এবং লোয়ার ফাইল সিস্টেম ফাইলে সরাসরি অ্যাক্সেস পেতে ContentProvider API ব্যবহার করতে পারে। এমনকি এগুলি ও অন্যান্য অপ্টিমাইজেশন সহ, FUSE ব্যবহার করার সময় রিড ও রাইট অপারেশন কম ব্যান্ডউইথ দেখতে পেতে পারে, কারণ এটি লোয়ার ফাইল সিস্টেমের ডাইরেক্ট অ্যাক্সেসের তুলনায় কম ব্যান্ডউইথ ব্যবহার করে — বিশেষ করে র‍্যান্ডম রিড অপারেশনের ক্ষেত্রে, যেখানে কোনও ক্যাশিং বা রিড-অ্যাহেড সাহায্য করতে পারে না। এছাড়াও, যেসব অ্যাপ সরাসরি লেগ্যাসি /sdcard/ পাথের মাধ্যমে স্টোরেজ অ্যাক্সেস করে, সেগুলি পারফর্ম্যান্সের ক্ষেত্রে উল্লেখযোগ্য ড্রপ অনুভব করা চালিয়ে যাবে, বিশেষ করে IO-ইনটেনসিভ অপারেশন পারফর্ম করার সময়।

SDcardFS ইউজারস্পেস অনুরোধ

SDcardFS ব্যবহার করলে, কার্নেল থেকে ব্যবহারকারীর স্পেস কল সরিয়ে FUSE-এর স্টোরেজ এমুলেশন ও অনুমতির চেক দ্রুত করা যায়। ব্যবহারকারীর স্পেস সংক্রান্ত অনুরোধ এই পাথ অনুসরণ করে: ব্যবহারকারীর স্পেস → VFS → sdcardfs → VFS → ext4 → পৃষ্ঠা ক্যাশে/স্টোরেজ।

FUSE পাসথ্রু SDcardFS

ছবি ১. SDcardFS ইউজারস্পেস অনুরোধ

FUSE ব্যবহারকারীর স্পেস সংক্রান্ত অনুরোধ

স্টোরেজ এমুলেশন চালু করতে এবং অ্যাপগুলিকে ইন্টার্নাল স্টোরেজ বা এক্সটার্নাল এসডিকার্ড স্বচ্ছভাবে ব্যবহার করার অনুমতি দিতে FUSE প্রাথমিকভাবে ব্যবহার করা হয়েছিল। FUSE ব্যবহার করলে কিছু ওভারহেড হয় কারণ প্রতিটি ইউজারস্পেস অনুরোধ এই পাথ অনুসরণ করে: ইউজারস্পেস → VFS → FUSE ড্রাইভার → FUSE ডেমন → VFS → ext4 → পৃষ্ঠা ক্যাশে/স্টোরেজ।

FUSE পাসথ্রু FUSE

ছবি ২. FUSE ব্যবহারকারীর স্পেস সংক্রান্ত অনুরোধ

FUSE পাসথ্রু অনুরোধ

বেশিরভাগ ফাইল অ্যাক্সেস করার অনুমতি ফাইল খোলার সময় চেক করা হয়, সেই ফাইল থেকে পড়ার এবং লেখার সময় অতিরিক্ত অনুমতি চেক করা হয়। কিছু ক্ষেত্রে, ফাইল খোলার সময় এটি জানা সম্ভব যে অনুরোধকারী অ্যাপের অনুরোধ করা ফাইলে সম্পূর্ণ অ্যাক্সেস আছে, তাই সিস্টেমকে FUSE ড্রাইভার থেকে FUSE ডেমনে রিড ও রাইট করার অনুরোধ ফরওয়ার্ড করা চালিয়ে যেতে হবে না (কারণ এটি শুধুমাত্র ডেটা এক জায়গা থেকে অন্য জায়গায় সরাবে)।

FUSE পাসথ্রু সহ, একটি খোলা অনুরোধ হ্যান্ডেল করা FUSE ডেমোন, FUSE ড্রাইভারকে জানাতে পারে যে অপারেশনটি অনুমোদিত এবং পরবর্তী সমস্ত রিড ও রাইট অনুরোধ সরাসরি লোয়ার ফাইল সিস্টেমে ফরওয়ার্ড করা যেতে পারে। এটি FUSE ড্রাইভারের অনুরোধে উত্তর দেওয়ার জন্য ইউজার স্পেস FUSE ডেমনকে অপেক্ষা করার অতিরিক্ত ওভারহেড এড়িয়ে যায়।

নিচে FUSE ও FUSE পাসথ্রু অনুরোধের মধ্যে তুলনা দেখানো হয়েছে।

FUSE পাসথ্রু তুলনা

ছবি ৩. FUSE অনুরোধ বনাম FUSE পাসথ্রু অনুরোধ

কোনও অ্যাপ FUSE ফাইল সিস্টেম অ্যাক্সেস করলে, নিম্নলিখিত অপারেশনগুলি হয়:

  1. FUSE ড্রাইভার অনুরোধটি ম্যানেজ করে এবং এনকিউ করে, তারপর এটিকে FUSE ডেমনের কাছে উপস্থাপন করে যা একটি নির্দিষ্ট কানেকশন ইনস্ট্যান্সের মাধ্যমে /dev/fuse ফাইলে সেই FUSE ফাইল সিস্টেম ম্যানেজ করে, যা FUSE ডেমন থেকে ব্লক করা হয়।

  2. FUSE ডেমন কোনও ফাইল খোলার অনুরোধ পেলে, সেটি সিদ্ধান্ত নেয় যে সেই নির্দিষ্ট ফাইলের জন্য FUSE পাসথ্রু উপলভ্য হওয়া উচিত কিনা। এটি উপলভ্য হলে, ডেমন:

    1. এই অনুরোধের ব্যাপারে FUSE ড্রাইভারকে বিজ্ঞপ্তি পাঠায়।

    2. FUSE_DEV_IOC_PASSTHROUGH_OPEN ioctl ব্যবহার করে ফাইলের জন্য FUSE পাসথ্রু চালু করে, যা অবশ্যই খোলা /dev/fuse-এর ফাইল ডেসক্রিপটরে পারফর্ম করতে হবে।

  3. ioctl (প্যারামিটার হিসেবে) ডেটা স্ট্রাকচার পায়, যার মধ্যে নিম্নলিখিতগুলি থাকে:

    • নিম্ন ফাইল সিস্টেম ফাইলের ফাইল ডেসক্রিপটর যা পাসথ্রু ফিচারের জন্য টার্গেট।

    • বর্তমানে হ্যান্ডেল করা হচ্ছে এমন FUSE অনুরোধের অনন্য শনাক্তকারী (অবশ্যই খোলা থাকতে হবে অথবা খুলতে হবে)।

    • অতিরিক্ত ফিল্ড যা খালি রাখা যায় এবং ভবিষ্যতের ইমপ্লিমেন্টেশনের জন্য রাখা হয়।

  4. ioctl সফল হলে, FUSE ডেমন ওপেন করার অনুরোধ সম্পূর্ণ করে, FUSE ড্রাইভার FUSE ডেমন উত্তর ম্যানেজ করে এবং কার্নেলের মধ্যে FUSE ফাইলে নিম্ন ফাইল সিস্টেম ফাইলের একটি রেফারেন্স যোগ করা হয়। কোনও অ্যাপ FUSE ফাইলে রিড/রাইট অপারেশনের অনুরোধ করলে, FUSE ড্রাইভার চেক করে দেখে যে নিম্নতর ফাইল সিস্টেম ফাইলের রেফারেন্স উপলভ্য আছে কিনা।

    • রেফারেন্স উপলভ্য থাকলে, ড্রাইভার একই প্যারামিটার সহ একটি নতুন ভার্চুয়াল ফাইল সিস্টেম (VFS) অনুরোধ তৈরি করে যা লোয়ার ফাইল সিস্টেম ফাইলকে টার্গেট করে।

    • রেফারেন্স উপলভ্য না থাকলে, ড্রাইভার 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 root
adb 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 passthrough ব্যবহার করা হচ্ছে।

Android 12 CTS-এ CtsStorageTest অন্তর্ভুক্ত, যার মধ্যে FUSE পাসথ্রু ট্রিগার করে এমন পরীক্ষা অন্তর্ভুক্ত। ম্যানুয়ালি টেস্ট রান করতে, নিচে দেখানো atest ব্যবহার করুন:

atest CtsStorageTest