מעבר FUSE

אנדרואיד 12 תומך ב-FUSE passthrough, אשר ממזער את תקורה של FUSE כדי להשיג ביצועים דומים לגישה ישירה למערכת הקבצים התחתונה. העברת FUSE נתמכת בקרנלים של android12-5.4 , android12-5.10 ו- android-mainline (בדיקה בלבד), מה שאומר שהתמיכה בתכונה זו תלויה בליבה המשמשת את המכשיר ובגרסת האנדרואיד שהמכשיר פועל:

  • מכשירים שמשדרגים מאנדרואיד 11 לאנדרואיד 12 לא יכולים לתמוך במעבר FUSE מכיוון שהקרנלים של המכשירים האלה קפואים והם לא יכולים לעבור לגרעין ששודרג רשמית עם שינויי המעבר של FUSE.

  • מכשירים המופעלים עם אנדרואיד 12 יכולים לתמוך במעבר FUSE בעת שימוש בליבה רשמית. עבור מכשירים כאלה, קוד המסגרת של אנדרואיד שמיישם מעבר FUSE מוטבע במודול הראשי של MediaProvider , המשודרג אוטומטית. מכשירים שאינם מיישמים את MediaProvider כמודול מרכזי (לדוגמה, מכשירי Android Go), יכולים גם לגשת לשינויים ב-MediaProvider כשהם משותפים באופן ציבורי.

FUSE לעומת SDCardFS

מערכת קבצים ב-Userspace (FUSE) היא מנגנון המאפשר מיקור חוץ של פעולות המבוצעות על מערכת קבצים של FUSE על ידי הקרנל (מנהל התקן FUSE) לתוכנית Userspace (FUSE daemon), המיישמת את הפעולות. אנדרואיד 11 ביטל את SDCardFS והפך את FUSE לפתרון ברירת המחדל לאמולציית אחסון. כחלק מהשינוי הזה, אנדרואיד הטמיעה דמון FUSE משלה כדי ליירט גישה לקבצים, לאכוף תכונות אבטחה ופרטיות נוספות ולתפעל קבצים בזמן ריצה.

בעוד ש-FUSE מתפקד היטב כאשר עוסקים במידע הניתן למטמון כגון דפים או תכונות, הוא מציג רגרסיות ביצועים בעת גישה לאחסון חיצוני הנראות במיוחד במכשירים בינוניים ונמוכים. רגרסיות אלו נגרמות משרשרת של רכיבים המשתפים פעולה ביישום מערכת הקבצים FUSE, כמו גם מתגים מרובים ממרחב ליבה למרחב משתמש בתקשורת בין מנהל ההתקן של FUSE לדמון FUSE (בהשוואה לגישה ישירה לקובץ התחתון מערכת רזה יותר ומיושמת לחלוטין בקרנל).

כדי להפחית רגרסיות אלו, אפליקציות יכולות להשתמש בחבור כדי לצמצם את העתקת הנתונים ולהשתמש ב- ContentProvider API כדי לקבל גישה ישירה לקבצי מערכת קבצים נמוכים יותר. אפילו עם אופטימיזציות אלו ואחרות, פעולות קריאה וכתיבה עשויות לראות רוחב פס מופחת בעת שימוש ב-FUSE בהשוואה לגישה ישירה למערכת הקבצים הנמוכה יותר - במיוחד עם פעולות קריאה אקראיות, שבהן שום מטמון או קריאה קדימה לא יכולים לעזור. ואפליקציות שניגשים ישירות לאחסון דרך הנתיב /sdcard/ מדור קודם ממשיכות לחוות ירידה ניכרת בביצועים, במיוחד בעת ביצוע פעולות עתירות IO.

בקשות למרחב משתמש של SDcardFS

שימוש ב-SDcardFS יכול להאיץ את אמולציית האחסון ובדיקות ההרשאות של FUSE על ידי הסרת קריאת המרחב למשתמש מהקרנל. בקשות למרחב משתמש עוקבות אחר הנתיב: Userspace → VFS → sdcardfs → VFS → ext4 → מטמון עמוד/אחסון.

FUSE Passthrough SDcardFS

איור 1. בקשות למרחב משתמש של SDcardFS

בקשות למרחב משתמש של FUSE

FUSE שימש בתחילה כדי לאפשר אמולציית אחסון וכדי לאפשר לאפליקציות להשתמש בשקיפות באחסון הפנימי או בכרטיס sdcard חיצוני. השימוש ב-FUSE מציג תקורה מסוימת מכיוון שכל בקשת מרחב משתמש עוקבת אחר הנתיב: Userspace → VFS → מנהל התקן FUSE → FUSE daemon → VFS → ext4 → מטמון עמוד/אחסון.

FUSE מעבר FUSE

איור 2. בקשות למרחב משתמש של FUSE

בקשות מעבר 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 passthrough צריך להיות זמין עבור הקובץ המסוים הזה. אם זה זמין, הדמון:

    1. מודיע לנהג FUSE על בקשה זו.

    2. מאפשר העברת FUSE עבור הקובץ באמצעות FUSE_DEV_IOC_PASSTHROUGH_OPEN ioctl, אשר יש לבצע על מתאר הקובץ של /dev/fuse שנפתח.

  3. ה-ioctl מקבל (כפרמטר) מבנה נתונים המכיל את הדברים הבאים:

    • מתאר קבצים של קובץ מערכת הקבצים התחתון שהוא היעד לתכונת המעבר.

    • מזהה ייחודי של בקשת ה-FUSE שנמצאת כעת בטיפול (חייב להיות פתוח או יצירה ופתיחה).

    • שדות נוספים שניתן להשאיר ריקים ומיועדים להטמעות עתידיות.

  4. אם ה-ioctl מצליח, הדמון FUSE משלים את הבקשה הפתוחה, מנהל ההתקן של FUSE מטפל בתשובת הדמון FUSE, והפניה לקובץ מערכת הקבצים התחתון מתווספת לקובץ FUSE בתוך הליבה. כאשר אפליקציה מבקשת פעולת קריאה/כתיבה בקובץ FUSE, מנהל ההתקן של FUSE בודק אם ההפניה לקובץ מערכת קבצים נמוכה יותר זמינה.

    • אם הפניה זמינה, מנהל ההתקן יוצר בקשה חדשה של מערכת קבצים וירטואלית (VFS) עם אותם פרמטרים המתמקדים בקובץ מערכת הקבצים התחתון.

    • אם הפניה אינה זמינה, מנהל ההתקן מעביר את הבקשה לדמון FUSE.

הפעולות לעיל מתרחשות עבור קריאה/כתיבה ו-read-iter/write-iter בקבצים גנריים ופעולות קריאה/כתיבה בקבצים ממופי זיכרון. מעבר FUSE עבור קובץ נתון קיים עד לסגירת הקובץ.

יישום FUSE passthrough

כדי לאפשר מעבר 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 passthrough, השבתתו מונעת מהמכשיר להשתמש ב-FUSE passthrough אך המכשיר נשאר פונקציונלי.

כדי להפעיל/לבטל את מעבר FUSE מבלי להבהב את ההתקן, שנה את מאפיין המערכת באמצעות פקודות ADB. דוגמה מוצגת להלן.

adb root
adb shell setprop persist.sys.fuse.passthrough.enable {true,false}
adb reboot

לעזרה נוספת, עיין ביישום העזר .

אמת את מעבר FUSE

כדי לאמת ש-MediaProvider משתמש ב-FUSE passthrough, בדוק את 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