Buildroot היא הדרך המהירה ביותר מלוח חשוף ללינוקס שעולה
מערכת לינוקס משובצת היא ארבעה דברים: שרשרת כלים לקומפילציה צולבת, מטעין אתחול, קרנל, ומערכת קבצים שורשית עם בדיוק התוכניות שאתם צריכים ולא דבר מעבר להן. אפשר להרכיב כל אחד מהם ביד. אנשים עשו זאת, במשך שנים, וכל אחד מהם כתב ערימת תסריטי מעטפת שרק הוא הבין. Buildroot היא ערימת התסריטים הזו שנעשתה פעם אחת, כמו שצריך, בשביל כולם.
Buildroot לוקחת קובץ תצורה אחד ומייצרת כל אחד מארבעת הדברים האלה, באופן שניתן לשחזור, מקוד המקור. הפוסט הזה הוא הסיור הקצר ביותר שאני יכול לתת באיך זה עובד.
להשיג אותה
הורידו קובץ tarball של גרסה או שבטו את המאגר, ופרקו אותו במקום שיש בו הרבה מקום בדיסק. הבניות גדולות, מפני שגם שרשרת הכלים נבנית מהמקור.
wget https://buildroot.org/downloads/buildroot-2014.02.tar.gz
tar xzf buildroot-2014.02.tar.gz
cd buildroot-2014.02
אתם צריכים את כלי המארח הרגילים: מהדר C, make, patch, wget, וכותרות הפיתוח של ncurses אם
אתם רוצים את ממשק התפריטים. Buildroot בודקת אותם ואומרת לכם מה חסר.
להתחיל מ-defconfig
Buildroot מגיעה עם תצורת ברירת מחדל ללוחות נפוצים רבים. הציגו אותן:
make list-defconfigs
בחרו את הקרובה ביותר לחומרה שלכם וטענו אותה. עבור Raspberry Pi, למשל:
make raspberrypi_defconfig
זה כותב קובץ .config בראש העץ. כל מה שבא אחר כך קורא אותו. אם הלוח שלכם אינו ברשימה, התחילו
מהקרוב המשפחתי ביותר ושנו את הארכיטקטורה ואת הגדרות הקרנל; זו עדיין הרבה פחות עבודה מלהתחיל מכלום.
לכוונן עם menuconfig
make menuconfig
התפריט הוא אותו תפריט שהקרנל משתמש בו, והוא מאורגן לפי ארבעת הרכיבים שלמעלה:
- Target options: ארכיטקטורה, גרסת מעבד, ממשק נקודה צפה.
- Toolchain: לבנות אחת מהמקור, או להצביע על חיצונית שכבר יש לכם. הבנייה נמשכת יותר פעם אחת; המסלול החיצוני מהיר יותר אבל אתם יורשים את בחירותיו בספריית C ובכותרות הקרנל.
- Kernel: איזו גרסה, איזה defconfig, אם לבנות device tree.
- Bootloader: U-Boot, Barebox, או כלום אם ללוח יש משלו.
- Target packages: התוכנה שנכנסת למערכת הקבצים השורשית. Busybox מופעל כברירת מחדל ונותן לכם מעטפת ואת כלי העזר הסטנדרטיים בקובץ בינארי קטן אחד. כל השאר לפי בחירה.
- Filesystem images: ext4, squashfs, קובץ tarball, initramfs.
שמרו וצאו. קובץ ה-.config הוא המצב היחיד, אז שמרו אותו בניהול גרסאות.
לבנות
make
לכו לעשות משהו אחר. הבנייה הראשונה מביאה כל tarball של מקור, בונה את שרשרת הכלים, אחר כך את הקרנל, אחר כך כל חבילה, ואז מרכיבה את מערכת הקבצים השורשית ואורזת אותה לתמונה. בניות מאוחרות יותר הן תוספתיות ומהירות בהרבה.
כשזה מסתיים, כל מה שאתם רוצים נמצא בתיקייה אחת:
output/images/
תמצאו את תמונת הקרנל, את קובץ ה-device tree אם יש, את מטעין האתחול, ואת מערכת הקבצים השורשית בפורמט
שבחרתם. כתיבתם לכרטיס SD או צריבתם ללוח תלויה בלוח, ול-defconfig מצורף בדרך כלל readme.txt
ב-board/<vendor>/<board>/ שאומר איך.
להוסיף חבילה
נניח שאתם צריכים תוכנית ש-Buildroot אינה מכירה. כל חבילה היא תיקייה תחת package/ עם שני קבצים.
Config.in שמוסיף אותה לתפריט:
config BR2_PACKAGE_HELLO
bool "hello"
help
A small example program.
ו-hello.mk שאומר מאין מגיע המקור ואיך לבנות אותו:
HELLO_VERSION = 1.0
HELLO_SITE = http://example.org/downloads
HELLO_LICENSE = GPL-2.0
$(eval $(autotools-package))
אם התוכנית משתמשת ב-autotools, השורה האחרונה הזו היא כל מתכון הבנייה. יש מקבילות ל-CMake, ל-Makefile
פשוט, לחבילות פייתון ולעוד כמה. הוסיפו שורת source "package/hello/Config.in" ל-package/Config.in,
הריצו make menuconfig, סמנו את התיבה, ובנו מחדש.
Buildroot או Yocto
האפשרות הרצינית האחרת היא Yocto, וההשוואה מסתכמת בשאלה אחת: האם זה מוצר אחד או משפחת מוצרים?
Buildroot בונה תמונה אחת מתצורה אחת. קל להבין אותה, כל העניין הוא make ו-Kconfig רגילים, מתחיל
נעשה יצרני בתוך יום, ובנייה מחדש מאפס היא התשובה לרוב הבעיות. היא אינה עושה חבילות בינאריות, אינה
מנהלת כמה תמונות שמשתפות שכבות, ואם שיניתם את התצורה באופן מהותי אתם בונים הכול מחדש.
Yocto בונה מאגר חבילות ומרכיבה ממנו תמונות. היא מטפלת במשפחות מוצרים, בעדכונים ובשכבות של תמיכת יצרנים, ועקומת הלמידה שלה נמדדת בשבועות. לצוות שמשווק סדרה של התקנים קשורים היא הכלי הנכון. ללוח אחד, תמונה אחת, ואדם אחד שרוצה שהיא תעלה אחר הצהריים, זו הרבה מאוד מכונה לסחוב.
אני מושיט יד ל-Buildroot קודם ועובר רק כשהפרויקט מוכיח שהוא צריך יותר. רובם לעולם אינם מוכיחים.