ممر الصمامات

يدعم Android 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 ، والتي تتم ترقيتها تلقائيًا. يمكن أيضًا للأجهزة التي لا تستخدم MediaProvider كوحدة رئيسية (على سبيل المثال، أجهزة Android Go)، الوصول إلى تغييرات MediaProvider حيث تتم مشاركتها بشكل عام.

الصمامات مقابل SDCardFS

نظام الملفات في مساحة المستخدم (FUSE) هو آلية تسمح بالاستعانة بمصادر خارجية للعمليات التي يتم إجراؤها على نظام ملفات FUSE بواسطة kernel (برنامج تشغيل FUSE) إلى برنامج مساحة المستخدم (FUSE daemon)، الذي ينفذ العمليات. قام Android 11 بإهمال SDCardFS وجعل FUSE هو الحل الافتراضي لمحاكاة التخزين. وكجزء من هذا التغيير، قام Android بتطبيق برنامج FUSE الخاص به لاعتراض الوصول إلى الملفات، وفرض ميزات أمان وخصوصية إضافية، ومعالجة الملفات في وقت التشغيل.

بينما يعمل FUSE بشكل جيد عند التعامل مع المعلومات القابلة للتخزين المؤقت مثل الصفحات أو السمات، فإنه يقدم تراجعات في الأداء عند الوصول إلى وحدة التخزين الخارجية التي تظهر بشكل خاص في الأجهزة المتوسطة والمنخفضة. تنجم هذه التراجعات عن سلسلة من المكونات التي تتعاون في تنفيذ نظام ملفات FUSE، بالإضافة إلى مفاتيح متعددة من مساحة kernel إلى مساحة المستخدم في الاتصالات بين برنامج تشغيل FUSE وبرنامج FUSE الخفي (مقارنة بالوصول المباشر إلى الملف السفلي نظام أصغر حجمًا ويتم تنفيذه بالكامل في النواة).

للتخفيف من هذه التراجعات، يمكن للتطبيقات استخدام الربط لتقليل نسخ البيانات واستخدام ContentProvider API للوصول المباشر إلى ملفات نظام الملفات الأقل. حتى مع هذه التحسينات وغيرها ، قد تشهد عمليات القراءة والكتابة انخفاضًا في النطاق الترددي عند استخدام FUSE عند مقارنتها بالوصول المباشر إلى نظام الملفات الأدنى - خاصة مع عمليات القراءة العشوائية، حيث لا يمكن للتخزين المؤقت أو القراءة المسبقة أن يساعد. وتستمر التطبيقات التي تصل مباشرة إلى مساحة التخزين من خلال المسار القديم /sdcard/ في مواجهة انخفاض ملحوظ في الأداء، خاصة عند إجراء عمليات إدخال/إخراج مكثفة.

طلبات مساحة المستخدم SDcardFS

يمكن أن يؤدي استخدام SDcardFS إلى تسريع مضاهاة التخزين والتحقق من إذن FUSE عن طريق إزالة استدعاء مساحة المستخدم من kernel. تتبع طلبات مساحة المستخدم المسار: مساحة المستخدم → VFS → sdcardfs → VFS → ext4 → ذاكرة التخزين المؤقت/التخزين للصفحة.

الصمامات العبور SDcardFS

الشكل 1. طلبات مساحة المستخدم SDcardFS

طلبات مساحة المستخدم FUSE

تم استخدام FUSE في البداية لتمكين محاكاة التخزين والسماح للتطبيقات باستخدام وحدة التخزين الداخلية أو بطاقة sdcard الخارجية بشفافية. يؤدي استخدام FUSE إلى بعض الحمل لأن كل طلب لمساحة المستخدم يتبع المسار: Userspace → VFS → FUSE driver → FUSE daemon → VFS → ext4 → ذاكرة التخزين المؤقت/التخزين للصفحة.

فيوز العبور فيوز

الشكل 2. طلبات مساحة المستخدم FUSE

طلبات العبور FUSE

يتم التحقق من معظم أذونات الوصول إلى الملفات في وقت فتح الملف، مع إجراء عمليات فحص أذونات إضافية عند القراءة من هذا الملف والكتابة إليه. في بعض الحالات، من الممكن معرفة وقت فتح الملف أن التطبيق الطالب لديه حق الوصول الكامل إلى الملف المطلوب، لذلك لا يحتاج النظام إلى مواصلة إعادة توجيه طلبات القراءة والكتابة من برنامج تشغيل FUSE إلى برنامج FUSE الخفي (كما هو الحال سينقل البيانات فقط من مكان إلى آخر).

باستخدام عبور FUSE، يمكن لبرنامج FUSE الذي يتعامل مع طلب مفتوح إخطار برنامج تشغيل FUSE بأن العملية مسموح بها وأن جميع طلبات القراءة والكتابة اللاحقة يمكن إعادة توجيهها مباشرة إلى نظام الملفات الأدنى. يؤدي هذا إلى تجنب العبء الإضافي الناتج عن انتظار البرنامج الخفي لمساحة المستخدم FUSE للرد على طلبات برنامج تشغيل FUSE.

تظهر أدناه مقارنة بين طلبات عبور FUSE وFUSE.

فيوز العبور المقارنة

الشكل 3. طلب ​​FUSE مقابل طلب عبور FUSE

عندما يقوم أحد التطبيقات بالوصول إلى نظام ملفات FUSE، تحدث العمليات التالية:

  1. يعالج برنامج تشغيل FUSE الطلب ويضعه في قائمة الانتظار، ثم يقدمه إلى برنامج FUSE الذي يتعامل مع نظام ملفات FUSE من خلال مثيل اتصال محدد على الملف /dev/fuse ، والذي تم حظر برنامج FUSE من قراءته.

  2. عندما يتلقى برنامج FUSE طلبًا لفتح ملف، فإنه يقرر ما إذا كان عبور FUSE يجب أن يكون متاحًا لهذا الملف المحدد. إذا كان متاحًا، فالبرنامج الخفي:

    1. يقوم بإعلام برنامج تشغيل FUSE بهذا الطلب.

    2. لتمكين عبور FUSE للملف باستخدام FUSE_DEV_IOC_PASSTHROUGH_OPEN ioctl، والذي يجب تنفيذه على واصف الملف للملف /dev/fuse المفتوح.

  3. يتلقى ioctl (كمعلمة) بنية بيانات تحتوي على ما يلي:

    • واصف الملف لملف نظام الملفات الأدنى الذي يعد هدفًا لميزة العبور.

    • المعرف الفريد لطلب FUSE الذي تتم معالجته حاليًا (يجب أن يكون مفتوحًا أو إنشاء وفتح).

    • الحقول الإضافية التي يمكن تركها فارغة والمخصصة للتطبيقات المستقبلية.

  4. إذا نجح ioctl، يكمل البرنامج الخفي FUSE الطلب المفتوح، ويتعامل برنامج التشغيل FUSE مع رد برنامج FUSE الخفي، وتتم إضافة مرجع إلى ملف نظام الملفات السفلي إلى ملف FUSE داخل kernel. عندما يطلب أحد التطبيقات عملية قراءة/كتابة على ملف FUSE، يتحقق برنامج تشغيل FUSE من توفر المرجع إلى ملف نظام ملفات أقل.

    • في حالة توفر مرجع، يقوم برنامج التشغيل بإنشاء طلب نظام ملفات ظاهري (VFS) جديد بنفس المعلمات التي تستهدف ملف نظام الملفات الأدنى.

    • في حالة عدم توفر مرجع، يقوم برنامج التشغيل بإعادة توجيه الطلب إلى البرنامج الخفي FUSE.

تحدث العمليات المذكورة أعلاه للقراءة/الكتابة والقراءة/الكتابة/الايتر على الملفات العامة وعمليات القراءة/الكتابة على الملفات المعينة للذاكرة. يوجد عبور FUSE لملف معين حتى يتم إغلاق هذا الملف.

تنفيذ عبور FUSE

لتمكين عبور FUSE على الأجهزة التي تعمل بنظام التشغيل Android 12، أضف الأسطر التالية إلى ملف $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 قيد الاستخدام.

يتضمن Android 12 CTS CtsStorageTest ، والذي يتضمن اختبارات تؤدي إلى عبور FUSE. لإجراء الاختبار يدويًا، استخدم الاختبار كما هو موضح أدناه:

atest CtsStorageTest