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