אחסון חיצוני מנוהל על ידי שילוב של שירות 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
, encryptableencryptable=sdcard
,noemulatedsd
ו-encryptableencryptable=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
.)
- מפתחים עשויים להמשיך לבנות נתיבים באופן דינמי או סטטי בהתאם למקרה השימוש שלהם. הכללת ה-UUID בנתיב מזהה כל כרטיס כדי להפוך את המיקום ברור יותר למפתחים. (לדוגמה,
- שירותי ה-FUSE המקודדים הקשיחים הוסרו מקבצי
init.rc
הספציפיים למכשיר ובמקום זאת מחולקים באופן דינמי מ-vold
בעת הצורך.
בנוסף לשינויי התצורה הללו, אנדרואיד 6.0 כולל את הרעיון של אחסון שניתן לאמץ. עבור מכשירי אנדרואיד 6.0, כל מדיה פיזית שאינה מאומצת נתפסת כניידת.
אחסון ניתן לאימוץ
כדי לציין התקן אחסון שניתן לאמץ ב- fstab
, השתמש בתכונה encryptable 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
כדי לזהות סוגי מערכת קבצים לפני ההרכבה, ומשתמשים יכולים לבחור לפרמט את המדיה כאשר מערכת הקבצים אינה נתמכת.