Pentru dezvoltarea acestui exercițiu s-au folosit instrucțiunile inițiale de aici aici . Yocto a fost deja instalat pe calculatoarele din laborator și s-a făcut o primă compilare (care poate dura până la 3 ore pe PC-urile acestea). Părțile importante, care trebuie menționate, sunt următoarele:
source oe-init-build-env ../build-raspberrypi/
Comanda aceasta preia environmentul de compilare și inițiază un “working directory” în ../build-raspberrypi
.
În fișierul conf/local.conf
au fost setate următoarele variabile:
BB_NUMBER_THREADS = "4" PARALLEL_MAKE = "-j 4" MACHINE ?= "raspberrypi" BBMASK = "meta-raspberrypi/recipes-multimedia/libav|meta-raspberrypi/recipes-core/systemd"
Variabila BB_NUMBER_THREADS
denotă numărul de thread-uri de bitbake care să ruleze, iar PARALLEL_MAKE
se referă la modul în care să se facă compilarea (cu opțiunea -j 4 se vor face 4 task-uri de compilare, variantă recomandată pentru procesoare dual-core). Variabila MACHINE
este setată la o valoare default raspberrypi
, iar unele pachete sunt mascate cu BBMASK
În fișierul conf/layers.conf
se selectează layer-ele cu care dorim să lucrăm în acest environment:
BBLAYERS ?= " \ /home/student/......./poky-rasp/meta \ /home/student/......./meta-yocto \ /home/student/......./meta-yocto-bsp \ /home/student/......./meta-raspberrypi \ "
În acest caz se adaugă layer-ul cu rețetele specifice raspberrypi
(meta-raspberrypi
).
Pe o distribuție de Fedora, este suficient să se ruleze
$ sudo yum groupinstall "development tools"
pentru a putea să compilăm cu bitbake.
În final, comanda care pornește procesul lung de compilare este
$ bitbake rpi-basic-image
Executabilul bitbake nu poate fi rulat decât după ce a fost setat environmentul!
rezultatul îl puteți vedea în .../build-raspberrypi/tmp/deploy/images
. Acolo se regăsesc toate imaginile compilate, atât în format sdimg care poate fi copiat direct pe un card, cât și imagini de sisteme de fișiere (.ext3) sau imagini de kernel
Așa cum am văzut în laboratorul doi, se pot face diferite modificări la linia de comandă a unui kernel pentru a încărca un sistem de fișiere root din diferite surse. Pentru acest laborator s-a folosit
rpi$ cat /proc/cmdline dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 ip=10.0.0.5:10.0.0.255:10.0.0.254:255.255.255.0:rpi:eth0:off root=/dev/nfs nfsroot=10.0.0.15:/tmp/export elevator=deadline rootwait
Fiecare placă va folosi alt server, folosind aceeași tehnică din laboratorul 2, în care fiecare plăcuță are IP de tip 10.0.0.x și serverul are IP de forma 10.0.0.1x. Nu am fi putut folosi Avahi pentru că la acel stadiu în pornirea sistemului DNS-ul (și cu atât mai puțin mDNS) nu este disponibil.
Folosind serverul NFS instalat pe calculatoare, și știind că fiecare rpi caută un server NFS cu un export în folder-ul /tmp/export
, bootați imaginea compilată deja pe calculatoarele voastre. Puteți seta un IP static modificând etc/network/interfaces
din imaginea pe care o bootați, dar înainte de a porni Pi-ul!
O interfață grafică dezvoltată anul acesta pentru Bitbake se numește HOB
și se poate porni din directorul de lucru (cu environment setat de yocto)
$ hob
Pașii pe care trebuie să-i urmați pentru a forma o imagine custom cu ajutorul HOB sunt următorii:
MACHINE
)conf/local.conf
), formate în urma execuției unor rețeteavahi
și screen
Build Packages
, se pot selecta pachetele care să facă parte din imagine. Astfel, e nevoie să selectați pachetul ce conține daemon-ul de avahi (dependențele vor fi selectate automat) și utilitarul screen
Pentru a modifica numele pe care îl publică un RaspberryPi este suficient să modificăm /etc/hostname
. Pentru aceasta am putea modifica fișierul din imagine, dar dezavantajul este că ar trebui să facem această modificare la fiecare recompilare. Am prefera să obținem direct o imagine cu numele nou, iar ca să obținem acest lucru trebuie să modificăm rețetele Bitbake care stau la baza pachetelor instalate în imagine.
Structura unui layer de rețete este următorul:
meta-layer: - conf - recipes-core - important_recipe - x.bb - recipes-category1 - recipe-1a - y.bb - t.bbappend - recipe-1b - ... - recipes-category2 - recipe-2a - ... - recipe-2b - ...
Directorul layer-ului are un conf
ce conține diferite fișiere de configurare. Unul dintre aceste fișiere de configurare, layer.conf
, modifică variabila BBFILES
, ceea ce spune sistemului Bitbake care sunt rețetele disponibile. Se adaugă la această variabilă
${LAYERDIR}/recipes*/*/*.bb \ ${LAYERDIR}/recipes*/*/*.bbappend
,
ceea ce ne spune că fișierele rețetă se găsesc în directoare care încep cu recipe…
și care un conțin directoare pentru rețeta respectivă. Fișierele .bb
sunt rețetele Bitbake, .bbappend
sunt adăugiri la rețete.
Ca exemplu, noi vom umbla în rețeta base-files. O descriere și implementarea o puteți găsi în …yocto/meta/recipes-core/base-files/base-files_3.0.14.bb
Ce este important de observat în acel fișier:
SRC_URI
, care identifică fișierele care trebuiesc incluse în directorul de lucru special făcut pentru rețeta respectivă (care se găsește în build-raspberrypi/tmp...)hostname
, variabilă care este setată la openembedded
do_install()
, care instalează fișiere și directoare în imaginedo_install_basefilesissue()
, funcție care setează hostname-ul. Observați de asemenea că unele fișiere sunt copiate din diverse surse (în loc de file: putem avea http:), iar altele sunt create pe locWORKDIR
este directorul de lucru pentru rețeta curentăD
este variabilă ce conține path-ul de deployment (acolo unde va fi instalat totul)sysconfdir
este etc
file://....
Alte layer-e de rețete pot modifica rețeta de mai sus, folosind fișiere .bbappend
. Spre exemplu, urmăriți fișierul ..yocto/meta-raspberry/recipes-core/base-files/base-files_3.0.14.bbappend
:
Pentru a adăuga un fișier hostname în imagine trebuie să
hostname
în locația unde sunt toate fișiere de inclus.bbappend
(adăugirea la rețetă), adăugând în variabila SRC_URI
noul fișier (cu +do_install_append()
, care se va executa în cadrul rețetei după do_install
bitbake rpi-basic-image
Pentru a adăuga un layer nou, vă trebuie un directorul în root-ul yocto (meta-labsi
) cu fișierul conf/layer.conf
identic cu cel din meta-raspberrypi
. Iată apoi scheletul unei rețete pentru o aplicație hello world:
DESCRIPTION = "Hellow Orld" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" PR = "r0" SRC_URI = "file://hello.c" S = "${WORKDIR}" do_compile() { } do_install() { }
do_compile
și do_install
hello
nu va fi instalat nicăieri dacă o imagine nu are nevoie de el. Trebuie făcută o nouă imagine, pe modelul ../meta-raspberrypi/recipes-core/images/rpi-basic-image.bb
include recipes-core/images/rpi-basic-image.bb
rpi-hello-image
trebuie pusă în layer-ul nouhello
și avahi-daemon
, adăugând (cu += în variabila IMAGE_INSTALL)../build-raspberrypi/conf/bblayers.conf