תצורת מכשיר

האחסון החיצוני מנוהל על ידי שילוב של אתחול vold ושירות מערכת של StorageManagerService. הרכבה של נפחי האחסון החיצוני הפיזי מטופלים על ידי vold, מבצע פעולות Staging כדי להכין את המדיה לפני חשיפת המדיה לאפליקציות.

הערה: ב-Android 8.0, השם של הכיתה MountService שונה לשם StorageManagerService

מיפויי קבצים

ב-Android 4.2.2 ובגרסאות קודמות, vold.fstab הספציפי למכשיר קובץ תצורה מגדיר מיפויים ממכשירי sysfs לטעינה של מערכת קבצים וכל שורה מתבצעת בפורמט הבא:

dev_mount <label> <mount_point> <partition> <sysfs_path> [flags]
  • label: תווית לעוצמת הקול.
  • mount_point: נתיב של מערכת הקבצים שבו צריך לטעון את עוצמת הקול.
  • partition: מספר מחיצה (מבוסס אחת) או 'אוטומטי' למחיצה ראשונה שניתן להשתמש בה.
  • sysfs_path: נתיב sysf אחד או יותר למכשירים שיכולים לספק את הטעינה הזו לנקודה. הן מופרדות ברווחים, וכל אחת מהן צריכה להתחיל ב-/.
  • flags: רשימת דגלים אופציונלית שמופרדת בפסיקים, לא יכולה להכיל /. הערכים האפשריים הם nonremovable ו-encryptable.

ל-Android בגרסאות 4.3 ואילך, קובצי fstab השונים שמשמשים את init, vold ו אוחדו קבצים לשחזור בקובץ /fstab.<device>. לגורמים חיצוניים נפחי אחסון שמנוהלים על ידי vold, הרשומות צריכות לכלול את בפורמט הבא:

<src> <mnt_point> <type> <mnt_flags> <fs_mgr_flags>
  • src: נתיב תחת sysfs (לרוב טעון ב- /sys) למכשיר אשר יכול לספק את נקודת הטעינה. הנתיב חייב להתחיל ב-/.
  • mount_point: נתיב של מערכת הקבצים שבו צריך לטעון את עוצמת הקול.
  • type: הסוג של מערכת הקבצים בנפח האחסון. לגבי כרטיסים חיצוניים: בדרך כלל המחיר הוא vfat.
  • mnt_flags: Vold מתעלם מהשדה הזה וצריך להגדיר אותו אל defaults
  • fs_mgr_flags: Vold מתעלמת מכל השורות ב-fstab המאוחד שאינם כוללים את הדגל voldmanaged= בשדה הזה. הדגל הזה חייב לאחר מכן תופיע תווית שמתארת את הכרטיס, וגם מספר מחיצה או את המילה auto לדוגמה: voldmanaged=sdcard:auto. דגלים אפשריים אחרים הם nonremovable, encryptable=sdcard, noemulatedsd וגם encryptable=userdata.

פרטי ההגדרות האישיות

אינטראקציות של אחסון חיצוני מטופלות ברמת ה-framework ומעלה עד StorageManagerService. בגלל שינויים בהגדרות האישיות של ב-Android 6.0 (כמו הסרת שכבת-העל של המשאב storage_list.xml), התג פרטי התצורה מחולקים לשתי קטגוריות.

Android 5.x וגרסאות קודמות

תצורת storage_list.xml הספציפית למכשיר , שניתן בדרך כלל באמצעות שכבת-על מסוג frameworks/base, מגדיר את ואילוצים של התקני אחסון. הרכיב <StorageList> מכיל רכיב <storage> אחד או יותר, שצריך לסמן רק אחד מהם ראשית. המאפיינים של <storage> כוללים:

  • mountPoint: נתיב מערכת הקבצים של הטעינה הזאת.
  • storageDescription: משאב מחרוזת שמתאר את הטעינה הזו.
  • primary: True אם הטעינה הזו היא האחסון החיצוני הראשי.
  • removable: true אם הטעינה הזו כוללת מדיה נשלפת, כמו כרטיס SD פיזי של Google.
  • emulated: True אם הטעינה הזו עוברת אמולציה ומגובה על ידי אחסון פנימי, באמצעות daemon של FUSE.
  • mtp-reserve: מספר ה-MB של נפח האחסון ש-MTP צריך לשמור בחינם אחסון. בשימוש רק כשהטעינה מסומנת כ'אמולציה'.
  • allowMassStorage: True אם ניתן לשתף את הטעינה הזו באמצעות אחסון בנפח USB גדול.
  • maxFileSize: גודל הקובץ המקסימלי ב-MB.

מכשירים עשויים לספק אחסון חיצוני על ידי אמולציה של רכיב לא תלוי-רישיות, מערכת קבצים ללא הרשאות שמגובה על ידי אחסון פנימי. אחד אפשרי מסופק על ידי הדימון (daemon) של FUSE ב-system/core/sdcard, שיכול נוסף בתור שירות init.rc ספציפי למכשיר:

# virtual sdcard daemon running as media_rw (1023)
service sdcard /system/bin/sdcard <source_path> <dest_path> 1023 1023
    class late_start

כאשר source_path הוא הגיבוי הפנימי של האחסון הפנימי ו-dest_path הוא נקודת טעינה של יעד.

כשמגדירים סקריפט init.rc ספציפי למכשיר, EXTERNAL_STORAGE יש להגדיר את משתנה הסביבה כנתיב אל המקור החיצוני הראשי אחסון. גם הנתיב /sdcard צריך להפנות לאותו המיקום, אולי באמצעות קישור סימבולי. אם מכשיר מכוונן את המיקום של אחסון חיצוני בין עדכוני פלטפורמה, יש ליצור קישורים סימבוליים כדי שהנתיבים הישנים ימשיכו לעבוד.

Android מגרסה 6.0

התצורה של מערכת המשנה לאחסון מרוכזת עכשיו קובץ fstab ספציפי למכשיר, ומספר קובצי תצורה/משתנים היסטוריים הוסרו כדי לתמוך בהתנהגות דינמית יותר:

  • שכבת-העל של המשאב storage_list.xml הוסרה והיא כבר לא בשימוש במסגרת. התקני אחסון מוגדרים עכשיו באופן דינמי כשהם מזוהות על ידי vold.
  • משתני הסביבה EMULATED_STORAGE_SOURCE/TARGET הוסרו ו-Zygote לא משתמש יותר בהם כדי להגדיר נקודות טעינה ספציפיות למשתמש. עכשיו מתבצעת אכיפה של הפרדת משתמשים עם מזהי GID ספציפיים למשתמש, ונפח אחסון משותף ראשי מותקן על ידי vold בזמן הריצה.
    • המפתחים יכולים להמשיך לבנות נתיבים באופן דינמי או סטטי, בהתאם של התרחיש לדוגמה המבוקש. ה-UUID בנתיב מזהה כל כרטיס שצריך המיקום ברור יותר למפתחים. (לדוגמה, /storage/ABCD-1234/report.txt הוא בבירור קובץ שונה מ-/storage/DCBA-4321/report.txt).
  • שירותי FUSE שמקודדים בתוך הקוד הוסרו מקובצי init.rc ספציפיים למכשיר, ובמקום זאת פוצלו באופן דינמי מ-vold כשיש צורך.

בנוסף לשינויי ההגדרות האלה, Android 6.0 כולל את אחסון מותאם. עבור מכשירי Android 6.0, כל מדיה פיזית שאינה נחשב כנייד.

אחסון מותאם

כדי לציין מכשיר אחסון שניתן להתאמה ב-fstab, צריך להשתמש במאפיין encryptable=userdata בשדה fs_mgr_flags. הנה הגדרה טיפוסית:

/devices/platform/mtk-msdc.1/mmc_host*           auto      auto     defaults
voldmanaged=sdcard1:auto,encryptable=userdata

כשמשתמשים בהתקן אחסון, הפלטפורמה מוחקת את התוכן וכותבת טבלת מחיצות GUID שמגדירה שתי מחיצות:

  • מחיצה קטנה וריקה של android_meta ששמורה לשימוש עתידי. סוג החלוקה GUID הוא 19A710A2-B3CA-11E4-B026-10604B889DCF.
  • מחיצת android_ext גדולה שמוצפנת באמצעות dm-crypt ומפורמטת באמצעות ext4 או f2fs, בהתאם ליכולות הליבה. סוג החלוקה GUID הוא 193D1EA4-B3CA-11E4-B075-10604B889DCF.

אחסון נייד

ב-fstab, התקני אחסון עם המאפיין voldmanaged נחשבים לנייד כברירת מחדל, אלא אם מאפיין אחר כמו encryptable=userdata מוגדר. לדוגמה, הנה הגדרה אופיינית למכשירי USB מסוג OTG:

/devices/*/xhci-hcd.0.auto/usb*             auto            auto    defaults
                                                    voldmanaged=usb:auto

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