Het Yocto project zorgt voor een gestandaardiseerde methode om een Linux systeem te bouwen op basis van de broncode. Het project levert je daarvoor alle benodigde tools en recepten. Daarmee genereer je eenvoudig een Linux systeem voor bekende bordjes, zoals de Raspberry Pi of BeagleBone. Hoewel je Yocto normaal gesproken in embedded omgevingen tegenkomt, houdt niets je tegen om het voor een PC te gebruiken. Zelfs desktopomgevingen, containers of virtualisatie zijn beschikbaar.

Kernbegrip van Yocto is de layer. Die bepaalt een logisch deel van het bouwproces. Je moet hierbij denken aan bouwrecepten voor een applicatie, configuraties voor hardware of het genereren van een kant-en-klaar image. De layers liggen als het ware boven op elkaar om tot een volledig bouwplan te komen.

Omdat een layer instellingen van onderliggende layers overneemt, aanvult of zelfs aanpast, komt Yocto in eerste instantie ingewikkeld over. Daarom gebruiken we in dit artikel Toaster. Dit is een webapplicatie die op de achtergrond veel voor je regelt. Door de overzichtelijke interface is het bouwen van je eigen systeem aanzienlijk makkelijker. Hiermee gaan we een image voor de Raspberry maken.

 

Installatie

Het bouwsysteem van Yocto heet Poky. Dit is met zo’n 60 MB weliswaar klein, maar tijdens het bouwen heb je al snel enkele tientallen GB’s nodig. Zorg daarom voor voldoende schijfruimte. Allereerst moet je een aantal noodzakelijke pakketten installeren. Op de site van Yocto vind je in de Reference Manual onder “System Requirements” voor enkele bekende distributies een overzicht. In geval van Fedora bijvoorbeeld voer je het volgende uit:

sudo dnf install gawk make wget tar bzip2 gzip python3 unzip perl patch diffutils diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath ccache perl-Data-Dumper perl-Text-ParseWords perl-Thread-Queue perl-bignum socat python3-pexpect findutils which file cpio python python3-pip xz which

 

Dat lijkt heel wat, maar veel daarvan staat waarschijnlijk al op je systeem. Even verderop testen we de omgeving sowieso nog. Download vervolgens Poky:

git clone git://git.yoctoproject.org/poky

 

Ga dan naar de directory poky en installeer voor Toaster een aantal extra componenten:

cd poky

pip3 install –user -r bitbake/toaster-requirements.txt

 

Deze komen in je home directory terecht onder:

$HOME/.local/

 

Hiermee zorg je ervoor dat voor Toaster precies de juiste versies van bepaalde Python pakketten aanwezig zijn. Deze lokale pakketten conflicteren overigens niet met eventueel al geïnstalleerde officiële pakketten op je systeem. Zet nu de omgeving op:

source oe-init-build-env

 

Je bent nu automatisch in de nieuw aangemaakte directory build. Toaster produceert nauwelijks bruikbare informatie als de omgeving niet correct is. Doe daarom eerst op de commandoregel een test door het volgende componentje te bouwen:

bitbake quilt-native

 

Dit is in nog geen minuut klaar. In geval van problemen zie je hier wel een duidelijke melding, bijvoorbeeld deze dat het pakket chrpath ontbreekt:

ERROR: The following required tools (as specified by HOSTTOOLS) appear to be unavailable in PATH, please install them in order to proceed: 

chrpath

 

Als het bouwen succesvol verloopt, start dan de webapplicatie op:

source toaster start

 

Standaard luistert Toaster op poortnummer 8000. Is dat al in gebruik, geef dan als volgt een ander nummer op:

source toaster start webport=<mijn_poortnummer>

 

De eerste start duurt even, omdat Toaster enkele initiële acties uitvoert. Een volgende start gaat alweer veel sneller. Om Toaster netjes af te sluiten gebruik je:

source toaster stop

 

Bouwproject

Ervan uitgaande dat je het standaard poortnummer gebruikt, ga je in de browser naar:

http://127.0.0.1:8000

 

De “resultaten” rechts zijn schijn. Dat is slechts een voorbeeldplaatje dat verdwijnt door je eerste project aan te maken. Doe dat door te klikken op To start building, create your first Toaster project. Geef een naam, bijvoorbeeld mijn_project. Houd bij Release als optie Yocto Project master aan. Hierdoor toont Toaster straks informatie over alle ondersteunde hardware. Klik linksonder op Create project.

Je komt in het configuratiescherm. Hier zie je links opties om lijsten met beschikbare recepten en ondersteunde hardware op te halen. Daarmee bepaal je welke software voor welke hardware je wil bouwen. Klik op Machines en tik in het zoekveld raspberry in. Klik op Search en vervolgens in de resultaatlijst bij de juiste versie van de Raspberry Pi op Add layer rechts. Wij kiezen raspberrypi3. In een pop-up venster krijg je een melding welke benodigde layers ontbreken. Klik op Add layers om die alsnog toe te voegen aan je project. Nu verandert de knop Add layer bij raspberrypi3 in Select machine. Klik hierop, zodat Toaster straks gaat bouwen voor de Raspberry Pi 3. Je komt weer terug in het configuratiescherm.

 

Standaard krijg je een losse kernel plus een apart image van het bestandssysteem met de overige software. Dat laatste heet het rootfs. We willen echter één enkel bestand met een compleet, bootable image. Ga daarom in het menu naar BitBake variables. Klik op het edit icoontje naast IMAGE_FSTYPES en voeg het volgende toe:

rpi-sdimg

 

Hiermee bepaal je dat je een image wil voor een SD-kaartje. Klik op Save. Standaard genereert Toaster rpm-pakketten. Als je liever deb-pakketten wil, pas je dat aan via PACKAGE_CLASSES. Het image is echter standaard niet voorzien van pakketbeheer. Voeg daartoe bij Add variable de variabele IMAGE_FEATURES toe met als waarde package-management. De hoofdletters zijn verplicht!

Kies nu in het menu Image recipes. Zoek wederom op raspberry en klik bij rpi-basic-image op Build recipe rechts. Dit is een minimaal Linux systeem, maar wel met de Dropbear SSH server, zodat je ook remote toegang hebt. De eerste keer lijkt er aanvankelijk niets te gebeuren, omdat Toaster zijn bouwomgeving opzet. Bij volgende projecten begint Toaster vrijwel meteen de recepten te laden. Vervolgens voert hij de benodigde taken uit om je image te bouwen. Houd voor de eerste build rekening met één uur of meer om te bouwen. Volgende builds voor dezelfde hardware verlopen veel sneller, omdat Toaster niet alles opnieuw hoeft te downloaden en te bouwen.

 

Resultaat

Als Toaster klaar is, klik je op rpi-basic-image in de kolom Recipe om naar het resultaat van de build te gaan. Hier staat veel informatie tot je beschikking. Klik bijvoorbeeld in het menu links op rpi-basic-image. Je ziet dan twee tabbladen. Het eerste bevat een overzicht van alle pakketten in het image. Door op een pakketnaam te klikken, krijg je een overzicht van alle bestanden van het betreffende pakket. Klik op een bestand, zodat Toaster het tweede tabblad met de hele directory structuur van je image toont. Hierin staat achter elk bestand de bijbehorende pakketnaam evenals de grootte en permissies.

Je vindt hier overigens onder de directory /boot niets. De kernel met aanverwante zaken staat namelijk op een aparte boot-partitie. Toaster toont die niet, maar de boot-partitie is wel aanwezig in het gebouwde image dankzij het rpi-sdimg formaat.

Verder zijn via het menu details te zien over het bouwproces zelf, zoals gebruikte recepten, uitgevoerde taken en CPU-gebruik. Ga voor een inkijkje in de werking van layers naar Configuration. Klik hier op tabblad BitBake variables en zoek vervolgens op image_fstypes. Hieraan hebben we boven voor ons project rpi-sdimg toegevoegd. Klik in de resultaatlijst op IMAGE_FSTYPES. Nu zie je in welke bestanden deze variabele gemanipuleerd is, met regelnummer en wat de uiteindelijke waarde is.

 

Booten

Ga links in het menu terug naar Build summary en klik bij Image files op rpi-sdimg om het te downloaden. Zet dit vervolgens op een SD-kaartje:

sudo dd bs=4M if=<mijn_rpi-sdimg> of=/dev/mmcblk0

 

In ons geval is dat het device mmcblk0, maar achterhaal voor je eigen systeem de juiste naam via het commando lsblk bijvoorbeeld. Forceer voor de zekerheid het wegschrijven van eventuele data in de cache naar het kaartje:

sudo sync

 

Steek het SD-kaartje in je Raspberry Pi en start hem op. Log in als root. Een wachtwoord is niet nodig et voilà, je eigen gebouwde Linux systeem!

 

En verder

Extra software toevoegen is gemakkelijk. Definieer in je project via New custom image een image op basis van rpi-basic-image, voeg de gewenste applicaties toe en bouwen maar. Dankzij Toaster is een maatwerksysteem voor je favoriete bordje bijna geen kunst meer.

 

Links

Yocto Project: yoctoproject.org