Crearea de distribuții de Linux în sisteme Embedded. Yoco-OpenEmbedded-Bitbake

Yocto

Compilare cu Yocto

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

Exerciții

1. Bootarea unei imagini pe NFS

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!

2. Adăugarea de pachete. Interfața grafică pentru Bitbake

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:

  1. Selectați platforma pe care lucrați (MACHINE)
  2. Selectați imaginea de la care vreți să porniți
  3. Adăugați rețete noi la imagine
    • Imaginea conține mai multe pachete (.deb, .rpm etc. în funcție de selecția din conf/local.conf), formate în urma execuției unor rețete
    • Trebuie să adăugați rețetele pentru avahi și screen
  4. După pasul de 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
  5. După construirea imaginii, actualizați imaginea de pe server-ul NFS cu cea nouă
  6. Bootați noua imagine și verificați funcționalitatea Avahi și screen!

3. Modificarea rețetelor Bitbake

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:

  • Variabila 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
  • funcția do_install(), care instalează fișiere și directoare în imagine
  • funcția do_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 loc
  • Alte variabile utile:
    • WORKDIR 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
  • Identificați locul în care se află fișiere referite de 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:

  • Se adaugă în path-ul de fișiere al rețetei noi fișiere, adăugate de noul layer

Pentru a adăuga un fișier hostname în imagine trebuie să

  • aveți un fișier hostname în locația unde sunt toate fișiere de inclus
  • modificați fișierul .bbappend (adăugirea la rețetă), adăugând în variabila SRC_URI noul fișier (cu +=) și implementând o funcție cu numele do_install_append(), care se va executa în cadrul rețetei după do_install
  • Rulați apoi bitbake rpi-basic-image
  • Verificați rezultatul pe RPi!

4. Adăugarea de layer-e noi. Adăugarea unei aplicații custom în Bitbake

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:

hello.bb
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() {
 
}
  • Scrieți rețeta într-un folder potrivit, pregătiți un fișier hello.c Hello World și scrieți funcțiile do_compile și do_install
  • Pachetul cu aplicația 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
rpi-hello-image.bb
include recipes-core/images/rpi-basic-image.bb
  • Această nouă rețetă pentru imaginea rpi-hello-image trebuie pusă în layer-ul nou
  • Noua imagine trebuie să adauge pachete noi pentru aplicația hello și avahi-daemon, adăugând (cu += în variabila IMAGE_INSTALL)
  • Layer-ul nou trebuie adăugat în ../build-raspberrypi/conf/bblayers.conf
  • Apelați bitbake cu noua imagine și verificați pe RPi rezultatul obținut!

Punctaje

  • 1. 2p
  • 2. 2p
  • 3. 3p
  • 4. 3p

Referințe

si/lab/2020/hidden/lab4.txt · Last modified: 2021/08/10 18:32 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0