FUSE পাসথ্রু

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

  • Android 11 থেকে Android 12 তে আপগ্রেড করা ডিভাইসগুলি FUSE পাসথ্রু সমর্থন করতে পারে না কারণ এই ডিভাইসগুলির কার্নেলগুলি হিমায়িত থাকে এবং তারা এমন একটি কার্নেলে যেতে পারে না যা FUSE পাসথ্রু পরিবর্তনগুলির সাথে আনুষ্ঠানিকভাবে আপগ্রেড করা হয়েছে৷

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

FUSE বনাম SDCardFS

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

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

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

SDcardFS ব্যবহারকারী স্থান অনুরোধ

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

FUSE পাসথ্রু SDcardFS

চিত্র 1. SDcardFS ব্যবহারকারী স্থান অনুরোধ

FUSE ব্যবহারকারী স্থান অনুরোধ

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

FUSE পাসথ্রু FUSE

চিত্র 2. FUSE ব্যবহারকারী স্থান অনুরোধ

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

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

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

FUSE এবং FUSE পাসথ্রু অনুরোধগুলির একটি তুলনা নীচে দেখানো হয়েছে৷

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

চিত্র 3. 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 পাসথ্রু যাচাই করুন

মিডিয়াপ্রোভাইডার 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