צריבה של ROM עבור Galaxy S1 i9000 מלינוקס

בפוסט קודם הסברתי על אודות מחיצות באנדרויד. "הקהילה" קוראת לאסופה של ה־images של המחיצות הללו בתור ROM. אין הרבה הסברים באינטרנט שמסבירים איך לצרוב מכשירי Galaxy S i9000 בעברית בלינוקס. אז – מעכשיו יש.

  1. תורידו את ה־ROM־ים המקוריים של החברה המתאימה לכם. אין בעייה גדולה לשים רום של חברה אחרת. אם זה לא עובד, אפשר לצרוב את המודם המתאים. באתר של iAndroid יש קישורים להורדה: http://iandroid.co.il/forum/viewtopic.php?f=42&t=18962
  2. הקבצים שתורידו הם self extracting exe לחלונות. אצלי wine עשה את מלאכתו נאמנה והקבצים שנוצרו וחתימות ה־MD5 הם (קבצי ה־exe הם ממש ישנים, ייתכן ועכשיו יש קבצים עם חתימה שונה, מה שחושב זה קבצי ה־tar שנוצרים מהם):
    82d5a5fffd1fea566aab7fe39522aa2c  I9000.Cellcom.JIJVG.exe
    0cb6ef26ce3076c5b3ffde7cb2ad2a1a  I9000.Partner.JHJVG.exe
    254ef10b0ddacfeabc44cf547082e856  I9000.Pelephone.JJJVB.exe
    eedb05d074db2026b38c8f00ca18f935  Cellcom.JIJVG.tar
    33535d9aff3e39d04b0cc504ac389b51  Pelephone.JJJVB.tar
    7d593eae36a2d5151e6a84454c739827  Partner.JHJVG.tar
  3. עכשיו צריך לפתוח את אחד הקבצים, בתוך ספרייה חדשה (לדוגמה):
     mkdir open-android-firmware
     cd open-android-firmware
     tar xf ../Cellcom.JIJVG.tar
  4. כדי לצרוב צריך גם קובץ pit שמגדיר את מבנה המחיצות. חיפוש ברשת אחר s1_odin_20100512.pit  תניב קובץ שהתחימה שלו היא 1d927b36d2fa807a22e64fc86b445130
  5. צריך גם קובץ שמגדיר dbdatafs, הוא נקרא גם PDA (אין לי שמץ של מושג מה זה). אותו אפשר להוריד מכאן: http://forum.xda-developers.com/showthread.php?t=2184403 החתימה של מה שהורדתי היא 868b81b9e28d30c82a00038d29e65d8c
  6. הצריבה תיעשה על ידי תוכנה heimdall. היא זמינה מהמאגרים החופשיים של דביאן. להתקנה:
     sudo apt install heimdall-flash
  7. אופציונאלי: אני לא אוהב להשתמש ב־root, ולכן הגדרתי חוק udev שהמכשיר יהיה ניתן לתכנות גם בעזרת המשתמש שלי. צריך רק לדאוג שהמשתמש יהיה תחת הקבוצה plugdev ואז החוק הבא יעבוד (זה גם טוב לעבודה מול adb בתור משתמש רגיל, ולכן מומלץ).השורה אחרונה מתאימה לגלקסי, האחרות לנקסוס וואללה, לא זוכר 🙂
    elcuco@pinky ~ $ cat  /etc/udev/rules.d/51-android.rules 
    SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", MODE="0666", GROUP="plugdev" 
    SUBSYSTEM=="usb", ATTR{idVendor}=="681c", MODE="0666", GROUP="plugdev" SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", MODE="0666", GROUP="plugdev"
  8. בשלב זה נשים את המכשיר במצב download. תוציאו את המכסה האחורי,ואז תוציאו את הסוללה (פשוט לתת מכה והיא יוצאת). תכניסו מחדש את הסוללה ואז ללחוץ על השילוש הקדוש: מקש הבית, כפתור שמע תחתון וכפתור ההדלקה. על הצג יהיה אנדרויד צהוב.
    המלצה: לא לשים את המכסה אחורי. יהיה יותר קל להוציא את הסוללה ולהתחיל מההתחלה, ואני מבטיח שיהיה צורך בזה 🙂
  9. כעת פשוט מפעילים את הפקודה הבאה (אני שמרתי אותה בתסריט בשם flash-all.sh)
    heimdall flash --repartition  \
       --pit s1_odin_20100512.pit \
       --FACTORYFS factoryfs.rfs  \    
       --CACHE cache.rfs          \
       --DBDATAFS dbdata.rfs      \
       --IBL+PBL boot.bin         \
       --SBL Sbl.bin              \
       --PARAM param.lfs          \
       --KERNEL zImage            \   
       --MODEM modem.bin
  10. זהו. הצריבה לוקחת כמה דקות ואחרי המכשיר עולה כמו חדש.

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

המלצות נוספות:

  1. אל תנסו את זה בחלונות. צריך להשתמש בתוכנה odin שאין לי מושג מה היא עושה מי כתב אותה. זאת הדלפה של מישהו ואני לא סומך על קוד של מישהו אחר במחשב שלי. התוכנות שיש בלינוקס נבדקו והן קוד פתוח, אני סומך עליהן יותר.
  2. תוודאו את החתימות (md5 במיקרה של מה שאני נותן כאן).
  3. כמה שיותר מהר נסו לשים רום אלטרנטיבי. cyanogenmod הוא בסדר גמור. אני חושב ש־Replicant יהיה יותר טוב – אבל לא בדקתי אישית, והוא לא זמין לכל מכשיר.
  4. על מכשיר ישן זה, לא הייתי ממליץ על gapps כלל. אני השתמשתי ב־FDroid והשלמתי כמה תוכנות עם Aptoid. האחרון מפוקפק משהו… אבל זאת פשרה שאני נאלץ לחיות איתה.
  5. כדי להחליף מודם, יש לשים את המכשיר במצב download ולצרוב בעזרת הפקודה הבאה (את המודם צריך לקחת מהרום המתאים):
    heimdall flash --MODEM modem.bin
  6. אם דילגת על השלב של udev פשוט לשים sudo לפני כל פקודה.

שאלות שנותרו לי ללא מענה:

  1. מה התוכן של dbdata.rfs ומה המטרה של המחיצה הזאת.
  2. מה זה param.lfs.

תזכורת: מחיצות באנדרויד

Share

מחיצות באנדרואיד

לאחרונה יצא לי לצרוב מחדש מכשיר Galaxy S1 i9000. לא עשיתי את זה מלא זמן, אז חיפשתי באינטרנט מידע. מה שכתוב ברשת כרגיל אלו שטויות וחצאי אמיתות שכתבו קהילת המודרים. למזלי אני לא שייך לקהילה הזאת, אבל אני כן מבין טיפה בלינוקס ואנדרואיד, אני אנסה לעשות סדר.

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

  1. מחיצת boot. במערכת לינוקס ה־bootloader טוען את הקרנל, שמצידו הוא יעשה mount ל־rootfs ואז יפעיל את ‎/sbin/init . בשנים האחרונות בוני הפצות בונים אל תוך הקרנל initramfs – שהוא rootfs קטן, שממנו עושים pivot_root למערכת האמיתית.
    באנדוירד – ה־rootfs גם בנוי אל תוך הקרנל, אבל אין pivot_root והמערכת של הקרנל היא זאת שזמינה במכשיר. ה־partition הזה הוא למעשה RO, כיוון שב־boot הבא הקרנל יטען את כל המחיצה מחדש. הקרנל כולו יושב במחיצה הזאת. בזמן צריבה היא נקראת kernel, ולא boot, האחרון מכיל bootloader ויש הסברים בנושא בסוף הפוסט.
    דרך אגב – התמונה שאתם רואים באתחול של המכשיר? logo.gif. האניצמיה שאחריה, זה bootanim.
  2. מחיצת system. זאת המערכת של אנדורויד. השכבה הגרפית, וכו'. המחיצה הזאת מכילה גם את כל ה־user space drivers שאנרדרויד משתמשת. אין ממש מודולים, הכל בנוי אל תוך הקרנל. המחיצה הזאת mounted על ידי אחד מתסריטי האתחול אל /system/ בזמן האתחול, במצב RO. אם תשנו את ההרשאות, ותשנו שם קבצים הם ישארו ל־boot הבא, כיוון שהמחיצה הזאת ממופה אל התקן פיזי. במערכות סגורות, ייתכן וה-bootloader יגלה שיש שינוי בחתימה של המחיצה ויסרב לעלות את לינוקס.
  3. מחיצת data. זאת המחיצה שמכילה את ההגדרות של המשתמש, האפליקציות התקנו וכו'. המחיצה הזאת mounted במצב RW. יש ספרייה בעלת הרשאות למשתמש שמתחבר דרך adb במקום /data/local/tmp/.
    כשאתם עושים reset to factory defaults במכשיר, כל מה שעושים הוא לפרמט את המחיצה הזאת.
  4. מחיצת radio. במכשיר יש כמה מעבדים, אחד מהם הוא מעבד עצמאי שמדבר עם המודם. לכל ייצרן יש מודם שונה, אז כדי גוגל יצרו פרוטוקול ו"דרייבר" עבור המערכת הפעלה. היצרן של החומרה צריך לכתוב daemon שמאזין ב־local socket מול המערכת של אנדרואיד ומדבר עם החומרה (המעבד השני). הצד שמדבר מול אנדרואיד תקני ויציב, ומצד שני משתנה בהתאם לחומרה. מילות החיפוש שלכם בגוגל הם rild ו־rilj (המונח האחרון היה בשימוש יותר ב-4.2, עכשיו אני רואה אותו פחות).
    מערכת ההפעלה שמפעילה את המעבד שמדבר מול חומרת הרדיו נמצאת במחיצה הזאת, זאת ה"קושחה" של המודם. שוב, מדובר סה"כ על מערכת הפעלה למעבד armV5 ש"אנדרואיד" טוען בזמן האתחול על המעבד השני (תחשבו משהו בסגנון, grub שטוען את לינוקס).
  5. מחיצת persistent (לא זמינה בכל מכשיר). בעת ייצור של מכשיר צריך לכייל פרמטרים מסויימים יחודיים פר מכשיר. למשל ה־serial number או פרמטרים שיגרמו למודם הספציפי הזה לצריך פחות חשמל (יש הבדלים קטנים שנוצרים כתוצאה מאופן הייצור של המודמים). האתחולים הללו נעשים במפעל ומצריך ציוד מסוייים, וכאשר ניתן לעשות את הכיון בשטח – הוא לוקח זמן. יצרנים שומרים במחיצה זו פרמטרים שמיוצרים פעם אחת במחזור חיים של המכשיר כדי לייעל את זמן האתחול (מאתחלים פעם אחת, שומרים ערכים ופעם הבאה במקום לכייל פשוט כותבים לחומרה את הערכים מהפעם הקודמת).
    המחיצה הזאת mounted R/W אבל רק ל־root יש הרשאות כתיבה אליה. המחיצה הזאת לא מפורמטת בזמן איפוס המכשיר.
  6. מחיצת recovery. מי שהתקין רום של אנדרואיד שיחק עם תוכנה במכשיר שעולה "לפני אנדרואיד". אז זה לא בדיוק נכון… בסה"כ מדובר על קרנל אחר שב־initramfs שלו יש תוכנה שונה.
    בזמן העלייה של המכשיר, ה־boot loader בוחר איזה קרנל להפעיל בעזרת הכפתורים המוזרים שאתם לוחצים בשניות הראשונות של הפעלת המכשיר.
  7. מחיצת cache. הספרייה הזאת היא לשימוש פנימי של אנדוירד. פעם היא שימשה לשמירה של ה־dalvik cache. אני לא יודע בדיוק מה היא עושה בימינו (אני מניח ש־dart שומר שם את ה־binaries שהוא יוצר מהקוד dalvik שאנחנו מקמפלים באקליפס). כמו כן, בזמן האתחול המערכת בודקת האם קובץ מסויים קיים, ואם כן הוא מפעיל את מערכת ה־recovery (ראו סעיף קודם) כדי לעדכן את המערכת.
    אפשר לפרמט את המחיצה הזאת ללא בעייה, התוכן יתמלא באתחול הבא (האתחול יהיה איטי יותר, כיוון שהוא צריך ליצור את המטמון מחדש).
  8. lk (קיצור של little kernel, לא בדיוק מחיצה). במקביל למערכת ה־recovery ל"אנדרואיד" (במובן הרחב מאוד… בשלב זה אפילו לינוקס לא פועל) יש מערכת אחרת שמאפשרת "לצרוב" את המכשיר. זה האנדרואיד הצהוב הזה שאתם רואים שאתם רואים בזמן download mode. מערכת הפעלה זו היא רביעית שיושבת במכשיר (לינוקס ראשון זה ה־recovery, לינוקס שני זה "אנדרואיד" והמערכת שעובדת במודם). היא יודעת לדבר עם ה־USB וכאשר אתם עושים flash בעזרת heimdell זה כאילו שאתם במכשיר ועשים dd אל תוך מחיצה.
  9. pit – רשימת המחיצות. במחשב נורמאלי, רשימת המחיצות נשמרת בתחילת הדיסק, ואז כדי לשנות מחיצות פשוט מפעילים fdisk שקורא כמה סקטורים בתחילת הדיסק. היצרנים של מכשירי arm החליטו לעשות את זה מסובך. אז כדי לעשות את זה במכשירי Galaxy S i9000 משתמשים ב־heimdell כדי לשלוח אל המכשיר את רשימת המחיצות, הרשימה הזאת כתובה ב־pitt file. אפשר למשוך אותו מהמכשיר בעזרת הפקודה
    heimdall download-pit --output blabla.pit

    אפשר למצוא קבצי pit באינטרנט, חפשו את הקובץ s1_odin_20100512.pit ותוודאו שה־md5sum שלו הוא 1d927b36d2fa807a22e64fc86b445130.

אני לא מבין הרבה בנושא הזה – אני אשמח אם בתגובות מישהו ייתן הסבר טוב. ומוסבר. חצאי אמיתות ואגדות אורבניות לא יתקבלו. אני צריך קישור לתיעוד רשמי או קוד. מה שמעניין אותי זה לדעת איפה הבנייה של הקרנל, והחיבור של מערכות ה־recovery. לא חקרתי את זה לעומק ואני רוצה שמישהו יקצר לי את הזמן.

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

ההבדל בין מכשירי סמסונג ו"שאר העולם" הוא השימוש בפרוטוקול לא תקני עבור הדברים הנמוכים הללו. בשאר המערכות משתמשים ב־fastboot (פרוקוטול דומה לזה של adb). הקוד זמין ב־lk. זה מה שיש בשימוש במכשירי נקסוס.

עריכה:
העירו לי שכותבים אנדרואיד ולא אנדרויד אז לטובת SEO אני תיקנתי את הפוסט הזה.

Share