תצורת המכשיר

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

הערה: ב-Android 8.0, שם המחלקה MountService שונה ל- StorageManagerService .

מיפויי קבצים

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

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

עבור מהדורות אנדרואיד 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 .

פרטי תצורה

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

אנדרואיד 5.x ומעלה

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

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

התקנים עשויים לספק אחסון חיצוני על ידי חיקוי של מערכת קבצים חסרת רישיון חסרת רישיות, מגובה באחסון פנימי. יישום אפשרי אחד מסופק על ידי ה-FUSE daemon 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 חייב להגיע לאותו מיקום, אולי דרך סימלינק. אם מכשיר מתאים את מיקום האחסון החיצוני בין עדכוני הפלטפורמה, יש ליצור קישורי סימולציה כדי שהנתיבים הישנים ימשיכו לעבוד.

אנדרואיד 6.0

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

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

בנוסף לשינויי התצורה הללו, אנדרואיד 6.0 כולל את הרעיון של אחסון שניתן לאמץ. עבור מכשירי אנדרואיד 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 כדי לזהות סוגי מערכת קבצים לפני ההרכבה, ומשתמשים יכולים לבחור לפרמט את המדיה כאשר מערכת הקבצים אינה נתמכת.