Geheugenkaartjes maken met Raspberry Pi Imager
In maart 2020 werd de Raspberry Pi Imager geïntroduceerd waarmee je simpel geheugenkaartjes voor de Raspberry Pi kunt ‘branden’. In de tool kun je direct de gewenste software selecteren. Op de achtergrond wordt dan het vereiste installatiebestand voor de gekozen software gedownload. Maar er is meer. Zo kun je ook meteen talloze opstartopties meegeven. Stel bijvoorbeeld alvast het wifi-netwerk in, zodat je meteen internet hebt. Of activeer toegang via ssh, zodat je op afstand kunt inloggen. Ook handig als je de Pi zonder monitor en toetsenbord (‘headless’) gaat gebruiken. Het verantwoordelijke script kun je bovendien nog aanpassen, om de opstartconfiguratie volledig naar je hand te zetten!
Hoe werkt het?
De Raspberry Pi Imager maakt het eenvoudig om een geheugenkaartje met software voor de Raspberry Pi te maken. De tool zelf automatisch de gewenste software installeren. Je hoeft het vereiste installatiebestand (veelal .iso of .img) dus niet zelf te downloaden. Dat maakt het makkelijker dan alternatieven als Etcher en Win32DiskImager. Als de gewenste software niet in de lijst staat kun je eventueel handmatig een bestand kiezen. Gebruik dit bijvoorbeeld voor een HyperBian-image (bestaande uit Raspberry Pi OS Lite en de software Hyperion). Ook dan kun je gewoon extra opstartopties kiezen.
De tool maakt een initialisatiescript met de naam firstrun.sh dat wordt uitgevoerd als je de Pi de eerste keer opstart. Via dat script worden alle instellingen afgedwongen. Dat script maakt nog meer ‘maatwerk’ mogelijk, omdat je het handmatig kunt aanpassen. In deze workshop laten we zien hoe je Raspberry Pi Imager gebruikt, wat het script doet, én hoe je dit kunt aanpassen, zodat je de opstartconfiguratie volledig in de hand hebt!
Software installeren
We beginnen met het downloaden van de Raspberry Pi Imager. De software is beschikbaar voor Windows maar ook voor macOS en Ubuntu Je kunt hem desgewenst zelfs op een (andere) Raspberry Pi gebruiken. In die situatie kun je in een terminalscherm de opdracht sudo apt install rpi-imager
geven. We gaan er van uit dat je de laatste versie gebruikt. Op het moment van schrijven is dat v1.7.3. Om een geheugenkaart te maken heb je uiteraard ook een sd-kaart lezer nodig en het microSD-kaartje dat je in de Pi gaat gebruiken.
Eerste stappen
Als je de tool opent kun je op het eerste scherm een besturingssysteem kiezen en het opslagapparaat (je geheugenkaart). Standaard wordt het volledige Raspberry Pi OS (32-bit) voorgesteld inclusief de desktopomgeving. In het menu Raspberry Pi OS (other) kun je varianten kiezen, zoals de Lite-versie zonder de desktopomgeving. Die kies je doorgaans voor een serveromgeving. Je hebt dan niet de last van de desktopomgeving. Andere noemenswaardige opties zijn Ubuntu in diverse varianten, de uitgebreide mediaspeler LibreELEC en het besturingssysteem RetroPie dat ouderwetse spelconsoles weet te emuleren.
Een tik op Schrijf zal het besturingssysteem op de standaard manier voor je op het geheugenkaartje zetten. Na het schrijven wordt de inhoud ook geverifieerd zodat je zeker weet dat er geen fouten zijn. Je kunt dat proces eventueel annuleren, maar met het risico op onvoorziene fouten. Wil je extra opstartopties opgeven, dan kun je vóór dat je gaat schrijven op het instellingenicoontje tikken.
Let op: bij oudere versies van Raspberry Pi Imager vond je de extra opstartopties in een verborgen menu met de sneltoets Ctrl+Shift+X. Die werkt overigens nog steeds.
Extra opstartopties
Als je het menu met opstartopties opent (via het instellingenicoontje of de sneltoets Ctrl+Shift+X) kun je als eerste kiezen of de aangepaste instellingen die je gaat opgeven alleen voor deze sessie gebruikt moeten worden of elke keer dat je deze tool gebruikt. Kies je voor het laatste, dan worden je opstartopties opgeslagen voor later gebruik, waarbij je uiteraard nog steeds aanpassingen kunt maken. Je zet steeds een vinkje bij de opstartopties die je wilt wijzigen, waarna je daarachter de opties invult. We zullen de belangrijkste hier toelichten:
- Achter Hostnaam kun je de Pi een naam in je netwerk geven, bijvoorbeeld raspberrypi.local. Via dat adres kun je een Pi (meestal) opsporen in je netwerk zonder dat je het ip-adres hoeft te gebruiken. Als je meerdere Pi’s gebruikt is het handige ze een eigen, unieke en herkenbare naam te geven.
- Met een vinkje bij SSH inschakelen kun je ervoor zorgen dat toegang via ssh mogelijk is. Je kunt dan op afstand inloggen met een programma als PuTTY. Je kunt kiezen of dit op basis van een wachtwoord mogelijk moet zijn of (veiliger) middels een publieke sleutel.
- Je kunt een gebruikersnaam en wachtwoord instellen. Daarmee kun je inloggen, eventueel op afstand met ssh als je dit hebt aangezet in combinatie met wachtwoord-authenticatie.
- Bij Wifi instellen kun je de ssid en het wachtwoord opgeven van je wifi-netwerk. De Pi zal dan na het opstarten direct verbinding met dat netwerk maken, zodat het toegang tot internet heeft. Stel ook het land in waarin je je bevindt (voor de juiste wifi-kanalen). Voor Nederland is dat uiteraard NL. Als je de Pi via een vaste netwerkkabel gaat aansluiten hoef je uiteraard geen wifi-of netwerkinstellingen op te geven.
- Je kunt achter Regio instellingen aangeven in welke tijdzone je je bevindt (zoals Europe/Amsterdam) en wat de indeling is van je toetsenbord.
Handmatig aanpassingen maken
Je kunt het geheugenkaartje nu natuurlijk direct in de Pi steken en deze starten. De gemaakte instellingen worden dan automatisch toegepast. Let er wel op dat het opstarten de eerste keer wat langer duurt, vanwege enkele achtergrondtaken. Interessant is natuurlijk wat er nu precies gebeurt en hoe je eventueel de wijzigingen die worden gedaan kunt bekijken, veranderen of uitbreiden. Hiervoor koppel je eerst de kaartlezer los nadat het geheugenkaartje is beschreven. Sluit deze daarna meteen weer aan. Je hebt nu toegang tot het bestandssysteem. Je ziet de bestandenlijst van de boot-partitie. Onder Linux zie je deze bestanden als je met cd /boot
naar de locatie /boot navigeert.
Raspberry Pi Imager heeft feitelijk een bash-script met de naam firstrun.sh gemaakt. Dat script zorgt voor het aanpassen van de configuratie. Het wordt eenmalig uitgevoerd, als je de Pi de eerste keer start. Je ziet ook het bestand config.txt. Dat bestand is ongemoeid gelaten. Hier kun je eventueel wel aanpassingen in maken als dat nodig is (zie kader).
Aanpassingen in config.txt
Het bestand config.txt bevat de systeemconfiguratie en kun je zien als het equivalent van een bios. Je regelt hierin bijvoorbeeld de allocatie van geheugen voor de gpu en vindt er parameters voor hdmi. Eventueel kun je aanpassingen in dit configuratiebestand zelf maken nadat je het geheugenkaartje met Raspberry Pi Imager hebt aangemaakt. Maar je kunt ook via het firstrun.sh-script aanpassingen aan config.txt (laten) maken. In de workshop laten we zien hoe je dat kunt doen.
Opstartscript
Heb je opstartopties gebruikt dan worden twee bestanden aan je verse geheugenkaartje toegevoegd: de genoemde firstrun.sh en het bestand cmdline.txt. In cmdline.txt zie je de opdrachten systemd.run=/boot/firstrun.sh
en systemd.run_success_action=reboot
. De eerste opdracht zorgt er voor dat het script firstrun.sh wordt uitgevoerd, waarmee de configuratie wordt aangepast. De tweede opdracht zal je Pi herstarten na het (succesvol) uitvoeren van de aanpassingen.
Het bestand firstrun.sh kun je met een tekst-editor openen om de inhoud te bestuderen, zoals Visual Studio Code (https://code.visualstudio.com/). Je kunt in het script eventueel ook veranderingen aanbrengen. Het risico is beperkt omdat je de Pi immers toch helemaal opnieuw inricht. Start deze niet goed op, dan kun je een gecorrigeerde versie maken. Het is handig om een Pi die je nog hebt liggen te gebruiken om commando’s uit te proberen! We zullen nu enkele opdrachten uit het script toelichten en tips voor aanpassingen geven.
Let op: Zet je eigen commando’s vóór de regel waarin het script firstrun.sh wordt verwijderd (rm -f /boot/firstrun.sh
).
Uitleg over systeemcommando’s
De systeemcommando’s in het script kunnen wat cryptisch overkomen. Neem bijvoorbeeld het commando cat
. Hiermee kan de inhoud van een bepaald bestand worden gelezen. Het is één van de meest gebruikte commando’s in Linux. Heb je bijvoorbeeld ervoor gekozen om een hostnaam in te stellen? Dan wordt cat
gebruikt om de huidige hostnaam die in het bestand /ect/hostname staat te bewaren in een variabele:
CURRENT_HOSTNAME=cat /etc/hostname | tr -d " \t\n\r"
Bij bovenstaande opdracht wordt de inhoud van het bestand /etc/hostname geprint en dan direct met een staand streepje, de zogeheten pipe (|
), doorgezet naar het commando tr
. Met dit commando, voluit trim genoemd, kunnen bepaalde karakters worden verwijderd. Daar zorgt de parameter -d
(delete) voor. Welke karakters worden verwijderd, geef je aan met een string, in dit voorbeeld " \t\n\r"
. Het gaat hier om alle spaties (
) alsmede eventuele tabs (\t
) en einderegelkarakters (\n
en \r
).
Met echo
kan een bepaalde tekst worden uitgevoerd op het scherm. Door hier >
achter te zetten wordt de inhoud echter niet op het scherm getoond maar naar een bepaald bestand geschreven. In het script zie je de volgende regel voor het wijzigen van de hostnaam naar de door ons gekozen hostnaam demopi:
echo demopi >/etc/hostname
Tip: Je kunt zelf wat experimenteren met bijvoorbeeld echo en de eerder genoemde pipe en tr. Geef je bijvoorbeeld de opdracht echo "hallo" | tr -d "l"
via een opdrachtprompt in Linux, dan wordt hao op het scherm getoond.
Zoek en vervang
Nadat de nieuwe hostnaam in /etc/hostname is bijgewerkt zal ook het bestand /etc/hosts worden bijgewerkt. Hier gaat het script wat voorzichtiger te werk, omdat het daar niet klakkeloos de nieuwe hostnaam in kan zetten. Het zal met een zogeheten sed
de oude hostnaam (die eerder in een variabele werd bewaard) vervangen door de nieuwe:
sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\tdemopi/g" /etc/hosts
Een sed -i
wordt vaak zoals hier gebruikt om bepaalde teksten te zoeken en vervangen in een bestand. Wat er moet worden gezocht en vervangen staat in een zogeheten reguliere expressie. Hier wordt gezocht naar het adres 127.0.1.1
gevolgd door één of meerdere willekeurige karakters (.*
) gevolgd door de huidige hostnaam (die komt uit de eerder gemaakte variabele $CURRENT_HOSTNAME
). Dit wordt vervangen door 127.0.1.1
gevolgd door een tab (\t
) gevolgd door de gewenste hostnaam demopi
.
Tip: Je kunt het commando sed
ook weer op de opdrachtprompt uitproberen, bijvoorbeeld met een opdracht als echo "hallo" | sed 's/al/el/'
. Dit zorgt er in feite voor dat in de tekst hallo de combinatie al door el wordt vervangen zodat er hello wordt uitgevoerd.
Services beheren
In het script zien je hoe met een simpele systemctl enable ssh
de toegang via ssh wordt geactiveerd. Als je bent ingelogd op een Pi kun je de status controleren met systemctl status ssh
. Wil je controleren welke services op de Pi beschikbaar zijn, dan kun je in een opdrachtprompt op de Pi het commando systemctl list-units --type=service
geven. Je ziet dan direct welke andere services je eventueel uit kunt schakelen. Wil je bijvoorbeeld bluetooth uitschakelen omdat je het niet nodig hebt, dan kun je aan het script firstrun.sh de opdrachten systemctl disable hsiuart.service
en systemctl disable bluetooth.service
toevoegen. Aanvullend is het overigens slim om de ingebouwde bluetooth ook nog hardwarematig te deactiveren via een aanpassing in config.txt. Dit zullen we verderop toelichten.
Meer opdrachten
Als je verder door het script bladert, zie je de opdracht rm
waarmee je bepaalde bestanden kunt verwijderen. Hierbij wordt de parameter -f
(force) gebruikt om bestanden die niet bestaan te negeren. Interactie met de gebruiker is tijdens de uitvoer van het script immers niet mogelijk. Verder zie je hoe de configuratie voor wifi met cat
in het bestand wpa_supplicant.conf wordt weggeschreven waarna met chmod
de juiste toegangsrechten worden ingesteld. Op het einde zal het script zichzelf verwijderen alsmede de aanroep in cmdline.txt. Het wordt dus maar één keer uitgevoerd bij de eerste start en niet meer bij een volgende (her)start.
Voorbeelden van uitbreidingen
Om het bash-script uit te breiden open je het bestand firstrun.sh met een editor, zoals het eerder genoemde Visual Studio Code. Die herkent de opdrachten in het script en past een mooie opmaak toe.
Wil je bijvoorbeeld dat de Pi direct een update krijgt, zodat de nieuwste software er op staat, dan kun je de onderstaande opdrachten toevoegen. Normaal moet je deze opdrachten (voor de gebruiker pi) vooraf laten gaan door sudo
, maar omdat firstrun.sh met verhoogde rechten wordt uitgevoerd is dat in dit geval niet nodig. Let er op dat door het updateproces de hele procedure wel wat meer tijd kost. Je moet dus even geduld hebben voordat je met de Pi kunt werken. De parameter -y
zorgt dat de opdrachten geen input van de gebruiker zullen vragen.
apt-get update && apt-get upgrade -y
apt-get autoremove -y
apt-get autoclean -y
Aanpassingen configuratiebestand
We zullen ook een voorbeeld geven van het aanpassen van het configuratiebestand config.txt via een opdracht in firstrun.sh. Als alternatief zou je natuurlijk ook het configuratiebestand zelf met een editor kunnen aanpassen. Het staat in dezelfde map als de firstrun.sh. Maar als je bijvoorbeeld in batch een serie Pi’s wil maken is een aanpassing in firstrun.sh makkelijker.
Stel dat je geen beeld hebt bij het aansluiten van een monitor via hdmi en je kunt dat niet oplossen met bijvoorbeeld een betere voedingsadapter. Dan werkt het in enkele gevallen door bepaalde parameters voor hdmi te veranderen in de systeemconfiguratie. Als voorbeeld gaan we het commentaarteken weghalen bij de opdracht: #hdmi_safe =1
.
We gaan het eerder genoemde sed
gebruiken voor een simpele zoek- en vervangactie. We willen in feite zoeken naar #hdmi_safe=1
en dit vervangen door hdmi_safe=1
. Dat kan met de volgende opdracht:
sed -i "s/#hdmi_safe=1/hdmi_safe=1/g" /boot/config.txt
Je kunt sed
niet alleen gebruiken om bepaalde teksten te vervangen maar ook om een regel voor of na een bepaalde tekst toe te voegen. We zullen een voorbeeld geven voor het deactiveren van bluetooth. Feitelijk moet je hiervoor dtoverlay=disable-bt
toevoegen onder de regel die begint met # Additional overlays
zoals in het voorbeeld hieronder:
# Additional overlays and parameters are documented /boot/overlays/README
dtoverlay=disable-bt
Wil je dit via firstrun.sh automatiseren dan kun je ook weer sed
gebruiken. We gebruiken het nu om te zoeken naar de bewuste regel en voegen dan daaronder de optie dtoverlay=disable-bt
toe. Dit kan met de volgende opdracht:
sed -i '/# Additional overlays and parameters.*/a dtoverlay=disable-bt' /boot/config.txt
In het bovenstaande voorbeeld zorgt de a
(append) voor het toevoegen van de regel. Wil je een regel invoegen vóór het gevonden resultaat, dan kun je een i
gebruiken.
Tip: Je kunt via het configuratiebestand config.txt nog veel meer aanpassingen maken met betrekking tot de hardware. Veel uitleg over de verschillende parameters vind je in het bestand README. Dat kun je openen op de Pi in de map /boot/overlays. In Windows kun je op de boot-partitie direct naar die map overlays bladeren.
Meer handige configuratieparameters
De meeste parameters in config.txt zul je onveranderd laten, maar een enkele keer is het nuttig om aanpassingen te maken. Als je een hele goede koeling hebt op je Raspberry Pi, zou je bijvoorbeeld kunnen overwegen deze te overklokken, door het voltage via de parameter over_voltage
te verhogen, en de kloksnelheid via de parameter arm_freq
wat hoger te zetten. Ook de snelheid van het geheugen (sdram_freq
) en de gpu (gpu_freq
) kun je handmatig aanpassen. En zo zijn er nog wel wat hardware-gerelateerde aanpassingen.
Lees je bij het aanpassen van de configuratie wel goed in het onderwerp in, zodat je geen schade kan toebrengen aan de Raspberry Pi. Zeker de Pi 4 is van zichzelf al een heethoofd, en zal niet automatisch beter presteren met hogere waardes. In enkele gevallen, als de bewuste Pi niet veel taken heeft, kun je natuurlijk ook onderklokken. Ook zou je ervoor kunnen kiezen om bepaalde hardware-features uit te schakelen. Ook dan doe je dat meestal via het configuratiebestand config.txt. Wil je meer weten over de verschillende configuratieparameters die er zijn, dan kun je die ook nalezen op https://www.raspberrypi.com/documentation/computers/config_txt.html.
Aanpassingen controleren
Als je wilt controleren of er aanpassingen in config.txt correct zijn gemaakt door het script, kun je inloggen op je Raspberry Pi en met sudo nano /boot/config.txt
het bestand bekijken en eventueel aanpassen. De sudo
is overigens alleen nodig om aanpassingen te kunnen maken. Ook kun je zoals je in deze workshop hebt geleerd de opdracht cat /boot/config.txt
geven als je alleen de inhoud wil zien.
Je kunt eventueel ook de tool vcgencmd
gebruiken om alleen de waarde van een bepaalde (video-gerelateerde) parameter op te vragen. Om bijvoorbeeld de waarde van hdmi_safe
op te vragen geef je dan de opdracht sudo vcgencmd get_config hdmi_safe
. Je kunt overigens tijdens het starten van de Pi de berichten eventueel volgen, als een monitor is aangesloten. Dat is handig voor het opsporen van fouten. Zo kun je bijvoorbeeld de kernel-berichten zichtbaar maken. Hiervoor haal je in het bestand cmdline.txt het woord quiet
weg. Verder kun je in het bestand /var/log/boot.log achteraf het bootproces nog eens nalopen.
Ten slotte
Je hebt nu een idee hoe je een geheugenkaartje voor de Raspberry Pi kunt maken en hoe je de opstartopties ook nog helemaal naar je hand kunt zetten! Al hoef je natuurlijk niet zo ver te gaan als wij zijn gegaan. Alleen al voor het maken van een geheugenkaart met enkele standaard opstartopties is al erg praktisch om deze tool te gebruiken.