Slimme installatie Raspberry Pi

Als je een Raspberry Pi gaat gebruiken, is het erg praktisch als de singleboardcomputer automatisch wordt ingesteld zodra je deze aanzet. Op zijn minst wil je dat het apparaat op het wifi-netwerk wordt aangemeld en bijvoorbeeld via een service als ssh bereikbaar is. Dat is met name praktisch als je de Pi zonder scherm, toetsenbord en muis gaat gebruiken. In deze masterclass leer je hoe je dit voor elkaar krijgt!

Auteur Gertjan Groen

Na het installeren van het besturingssysteem ben je vaak nog wel even zoet met het instellen daarvan en het naar je hand zetten van het systeem. Als je dit heel vaak moet doen, zul je op een gegeven moment naar oplossingen gaan zoeken om dat te automatiseren. Zeker bij de Raspberry Pi loont dat. Ze worden regelmatig ingezet voor allerlei projecten en in veel gevallen worden ze ook nog ‘headless’ gebruikt, dus zonder scherm, toetsenbord en muis. Dan is het wel zo fijn als de Pi bijvoorbeeld direct op afstand via het netwerk bereikbaar is via ssh met een veilig wachtwoord en met de juiste toetsenbordindeling en tijdzone. Dan kun je het verdere beheer op afstand overnemen. De officiële tool voor het maken van geheugenkaartjes voor de Pi (Raspberry Pi Imager) heeft een handigheidje om vooraf de configuratie vast te leggen. Het script dat hier op de achtergrond voor wordt gebruikt kun je bovendien verder naar je hand zetten. In deze masterclass leggen we uit hoe je dat doet.

De Raspberry Pi kun je relatief eenvoudig al vooraf configureren.

01 Raspberry Pi OS

We gaan uit van een installatie van Raspberry Pi OS, dat je misschien nog kent onder de oude naam Raspbian. Er zijn meerdere manieren om dit besturingssysteem op een geheugenkaartje te zetten. Een bekende optie is het gebruik van een tool als Win32DiskImager. Daarin verwijs je eerst naar het image voor Raspberry Pi OS, die je apart moet downloaden. Vervolgens selecteer je het geheugenkaartje en wordt het beschreven. In deze masterclass gebruiken we een andere en meer praktische tool: de officiële configuratietool Raspberry Pi Imager. Daarmee kun je eenvoudig een van de ondersteunde besturingssystemen kiezen en tevens, via een verborgen menu, extra configuratieparameters opgeven. Feitelijk wordt daarbij een script gemaakt, dat je verder kunt tweaken om de setup te perfectioneren. Dan wordt de Pi echt plug-and-play.

02 Software installeren

We beginnen met het downloaden van Raspberry Pi Imager via www.raspberrypi.com/software. Deze tool is behalve voor Windows ook voor macOS en Ubuntu beschikbaar. Je kunt hem desgewenst zelfs op een (andere) Raspberry Pi gebruiken. Zorg dat je de recentste versie hebt. Hier gebruiken we 1.6.2. Uiteraard heb je een sd-kaartlezer nodig en een microSD-kaartje. Het iso-bestand voor Raspberry Pi OS hoef je in dit geval niet te downloaden, dit doet de tool zelf op de achtergrond.

02 Via de officiële Raspberry Pi-website download je de Raspberry Pi Imager.

03 Basisopties

De basismogelijkheden van de tool spreken voor zich. Op het openingsscherm kies je om te beginnen een besturingssysteem en opslagapparaat. De standaardkeuze is Raspberry Pi OS (32-bit), de volledige versie inclusief de desktopomgeving. In het submenu Raspberry Pi OS (other) kun je ook andere varianten kiezen, zoals de Lite-versie zonder de desktopomgeving. Voor een serveromgeving zal deze variant meestal de voorkeur krijgen. Je hebt dan immers niet de extra last van de desktopomgeving nodig. Andere noemenswaardige opties zijn Ubuntu in diverse varianten, de uitgebreide mediaspeler LibreELEC en het besturingssysteem RetroPie dat ouderwetse spelconsoles weet te emuleren. Een klik op de knop Schrijf schrijft het gekozen besturingssysteem op de standaard manier naar het geheugenkaartje. 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 opties opgeven, dan kun je vóór dat je gaat schrijven een verborgen menu oproepen.

03 Op het openingsscherm kies je een besturingssysteem en opslagapparaat.

04 Verborgen menu

Het verborgen menu is op dit moment niet via de grafische interface beschikbaar, maar kun je alleen oproepen met de toetscombinatie Ctrl+Shift+X. Bovenaan bepaal je of de aangepaste instellingen die je gaat opgeven alleen voor deze sessie gebruikt moeten worden of elke keer dat je deze tool gebruikt.

De optie Disable overscan gebruik je om een zwarte rand rond het beeld wil voorkomen. Bij Set hostname geef je de Pi een andere naam in je netwerk. De standaardnaam is raspberrypi.local. Via dat adres kun je een Pi meestal opsporen in je netwerk zonder het ip-adres te hoeven kennen. Als je meerdere Pi’s gebruikt is het handig ze een eigen, unieke en herkenbare naam te geven.

De optie Enable SSH gebruik je om ssh-toegang mogelijk te maken. Je kunt dan op afstand inloggen met een programma als PuTTY. Je kunt hierbij ook het wachtwoord voor de pi-gebruiker opgeven. Als alternatief voor een wachtwoord kun je ook een publieke sleutel opgeven. Met een vinkje bij Configure wifi kun je de SSID en het wachtwoord voor je wifi-netwerk opgeven en de landcode. Voor Nederland is dat NL. Als je de Pi alleen via een vaste netwerkkabel gaat aansluiten, hoef je uiteraard geen wifi-of netwerkinstellingen op te geven. Bij Set locale settings kun je een tijdzone (zoals Europe/Amsterdam) en toetsenbordindeling kiezen.

05 Verdere aanpassingen

04 In een verborgen menu kun je extra opties instellen.

Na het maken en eventueel verifiëren van het geheugenkaartje kun je die desgewenst direct in de Pi steken en het apparaat opstarten. De gemaakte instellingen worden dan automatisch toegepast. Het heeft dan bijvoorbeeld internettoegang via wifi en je kunt inloggen met ssh. Daarbij kun je in principe de gekozen hostnaam gebruiken (zoals raspberrypi.local). Let er wel op dat het de eerste keer wat langer duurt voordat de Pi volledig is opgestart, omdat er op de achtergrond wat onderhoudstaken worden uitgevoerd. Interessant is natuurlijk wát er op de achtergrond gebeurt en hoe je de configuratiewijzigingen kunt inzien of zelfs uitbreiden. Daarvoor koppelen we de kaartlezer even los nadat het geheugenkaartje is beschreven en sluiten deze meteen weer aan. Je hebt nu direct toegang tot het bestandssysteem en zie je de bestandenlijst van de boot-partitie. Onder Linux vind je dezelfde bestanden als je naar de locatie /boot navigeert met cd /boot.

05 In de hoofdmap vind je de nieuwe bestanden cmdline.txt en firstrun.sh.

06 Handmatige aanpassingen

Wellicht ben je bekend met aanpassingen die je handmatig op de boot-partitie kunt maken. Een bekende methode om ssh-toegang aan te zetten, is bijvoorbeeld het plaatsen van een leeg bestandje met de naam ssh (zonder extensie) in de hoofdmap. Tijdens het booten van de Pi zal ssh dan worden geactiveerd. Ook kun je een configuratiebestandje wpa_supplicant.conf met daarin de gewenste wifi-instellingen plaatsen, zoals de SSID en het wachtwoord. Dankzij de Raspberry Pi Imager hoef je dat nu allemaal niet meer te doen. Op de achtergrond heeft die tool een bash-script genaamd firstrun.sh toegevoegd na het schrijven van het geheugenkaartje, dat zorgt voor de aangepaste configuratie. Wel kun je eventueel aanpassingen maken in het bestand config.txt (zie kader ‘Systeemconfiguratie voor de Pi’), dat hier ongemoeid is gelaten. In deze masterclass richten we ons vooral op het script firstrun.sh.

Systeemconfiguratie voor de Pi

Het configuratiebestand config.txt in de hoofdmap van het bestandssysteem voor de Pi kun je zien als het equivalent van een BIOS. Het bevat namelijk de systeemconfiguratie. Je kunt in dit bestand bijvoorbeeld de allocatie van geheugen voor de gpu regelen of beeldschermproblemen oplossen via parameters voor HDMI. Eventueel kun je aanpassingen in het configuratiebestand config.txt maken nadat je het geheugenkaartje met de in deze masterclass besproken tool hebt aangemaakt. In de masterclass zullen we ook laten zien hoe je via een script bij de eerste start automatisch aanpassingen aan config.txt kunt maken.

07 Opstartscript

Heb je met Raspberry Pi Imager een aangepaste configuratie opgegeven, dan worden na het maken van na het geheugenkaartje twee bestanden toegevoegd: het eerder genoemde firstrun.sh en het bestand cmdline.txt. In cmdline.txt zie je de opdrachten:

systemd.run=/boot/firstrun.sh
systemd.run_success_action=reboot

De eerste opdracht zorgt er voor dat het script firstrun.sh wordt uitgevoerd. Dit script is verantwoordelijk voor het aanpassen van de configuratie. De tweede opdracht zal het systeem herstarten nadat de aanpassingen succesvol zijn uitgevoerd. Het bash-script firstrun.sh zorgt voor de daadwerkelijke aanpassingen. Je kunt het met een teksteditor openen om de inhoud te bestuderen en eventueel veranderingen aan te brengen. We zullen enkele opdrachten uit het script toelichten en je tips geven hoe je het zelf kunt uitbreiden!

07 Via het bash-script firstrun.sh worden aanpassingen aan je Pi doorgevoerd.

08 Commando cat

De systeemcommando’s kunnen wat cryptisch overkomen. Neem bijvoorbeeld het commando cat. Hiermee kan de inhoud van een bepaald bestand worden gelezen. Het is een van de meestgebruikte commando’s in Linux. Als je hebt gevraagd om een hostnaam in te stellen, zie je een goed voorbeeld van cat in het script. Het wordt hierin namelijk 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"`

De inhoud van het bestand wordt geprint, maar daarna direct met een staand streepje, de zogenoemde 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 einde-regelkarakters (\n en \r).

09 Commando echo

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 demopi:

echo demopi >/etc/hostname

Je kunt eenvoudig wat experimenteren met bijvoorbeeld echo en de eerdergenoemde pipe (|) en tr. Geef je bijvoorbeeld deze opdracht via een opdrachtregel in Linux:

echo "hallo" | tr -d "l"

Dan wordt hao op het scherm getoond.

10 Zoeken en vervangen

Nadat de nieuwe hostnaam is ingesteld door het script in /etc/hostname, dan zal ook het bestand /etc/hosts worden bijgewerkt. Hier gaat het script iets voorzichtiger te werk, omdat het daar niet klakkeloos de nieuwe hostnaam in kan zetten. Het zal met het sed-commando (Stream Editor) 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 commando met sed -i wordt vaak, zoals hier, gebruikt om bepaalde teksten te zoeken en vervangen in een bepaald bestand. Wat er moet worden gezocht en vervangen, staat in een zogenoemde reguliere expressie. Er wordt gezocht naar het adres 127.0.1.1 gevolgd door een of meerdere willekeurige karakters (.*) gevolgd door de huidige hostnaam (.*$CURRENT_HOSTNAME). Dit wordt vervangen door 127.0.1.1 gevolgd door een Tab (/t) gevolgd door de gewenste hostnaam demopi. Je kunt het commando sed ook op een opdrachtregel 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.

10 Via een opdrachtregel binnen Linux kun je eenvoudig experimenteren.

11 Services beheren

In het script zie je hoe met een simpele opdracht de toegang via ssh wordt geactiveerd:

systemctl enable ssh

Als je bent ingelogd op een Pi kun je dat controleren met:

systemctl status ssh

Wil je controleren welke services op de Pi beschikbaar zijn, dan geef je de opdracht:

systemctl list-units --type=service

Zo zie je direct welke andere services je eventueel kunt uitschakelen. Wil je bijvoorbeeld bluetooth uitschakelen, omdat je het niet nodig hebt, dan kun je aan het script firstrun.sh deze opdrachten toevoegen:

systemctl disable hsiuart.service
systemctl disable bluetooth.service

Aanvullend is het overigens slim om de ingebouwde bluetooth nog te deactiveren via een aanpassing in config.txt. Dit zullen we paragraaf 16 toelichten.

12 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.

13 Script zelf uitbreiden

Uiteraard kun je het bash-script verder uitbreiden met nieuwe opdrachten. Open daarvoor het bestand firstrun.sh met een editor. Gebruik bij voorkeur een editor die de opdrachten herkent en mooie opmaak toepast, zoals Visual Studio Code (https://code.visualstudio.com). Het risico van deze handelingen is heel beperkt, omdat je de Pi immers toch helemaal opnieuw inricht. Start het systeem 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. Zet de commando’s bij voorkeur vóór de regel waarin firstrun.sh wordt verwijderd:

rm -f /boot/firstrun.sh

14 Laatste updates installeren

Wil je bijvoorbeeld dat de Pi direct een update krijgt, zodat de nieuwste software erop 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 erop 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.

apt-get update && apt-get upgrade -y
apt-get autoremove -y
apt-get autoclean -y

15 Aanpassingen configuratiebestand

Als tweede voorbeeld zullen we een aanpassing in config.txt maken. Je zou het tekstbestand gewoon na het schrijven van het geheugenkaartje met een teksteditor kunnen aanpassen. Het staat in de hoofdmap waar ook het bestand firstrun.sh is te vinden. Als je het handiger vindt, kun je de aanpassingen echter ook door firstrun.sh laten maken. Je hoeft er dan niet meer aan te denken, als je steeds na het schrijven van een geheugenkaartje een eigen firstrun.sh naar het kaartje kopieert.

Binnen Linux bevindt het bestand zich op de locatie /boot/config.txt. Stel dat je geen beeld hebt bij het aansluiten van een monitor via HDMI, dan kun je dat soms oplossen door een betere voedingsadapter te gebruiken. Maar in enkele gevallen is het nodig bepaalde parameters voor HDMI te veranderen in de systeemconfiguratie. Als voorbeeld gaan we het commentaarteken weghalen bij de volgende opdracht:

#hdmi_safe =1

Hiervoor kun je zoals eerder aangegeven sed gebruiken voor een zoek- en vervangactie. We zoeken naar #hdmi_safe=1 en vervangen het door hdmi_safe=1 met de volgende opdracht:

sed -i "s/#hdmi_safe=1/hdmi_safe=1/g" /boot/config.txt

Op vergelijkbare wijze kun je andere aanpassingen in het configuratiebestand maken. 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 geven in de volgende paragraaf een voorbeeld voor het deactiveren van bluetooth.

Belangrijkste configuratieparameters

Het bestand config.txt bevat allerlei belangrijke parameters voor de systeemconfiguratie. De meeste zul je onveranderd laten, maar in enkele gevallen is het nuttig om aanpassingen te maken. Als je een heel 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 wel goed over het onderwerp in, zodat je geen schade kan toebrengen aan de Raspberry Pi. Zeker de Pi 4 wordt van zichzelf al best warm 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-mogelijkheden 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 nalezen via https://kwikr.nl/piconfig.

Het bestand config.txt kun je zien als het BIOS voor je Pi.

16 Bluetooth deactiveren

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 vanuit de hoofdmap naar de map overlays bladeren. Om bluetooth uit te schakelen, kun je de volgende regel aan config.txt toevoegen (voeg de regel bij voorkeur toe onder de aangegeven regel).

# Additional overlays and parameters are documented /boot/overlays/README
dtoverlay=disable-bt

Wil je dit via firstrun.sh automatiseren, dan kun je eventueel ook weer sed gebruiken. We willen nu echter niet een bepaalde tekst zoeken en die vervangen, maar juist een extra regel toevoegen op de juiste plek, onder de regel # Additional overlays and parameters. Daarvoor zoeken we naar de bewuste regel en voegen 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 voor het toevoegen (‘append’) van de regel. Wil je een regel invoegen vóór het gevonden resultaat, dan kun je een i gebruiken.

16 In een apart tekstbestand vind je extra parameters voor de systeemconfiguratie.

17 Aanpassingen controleren

Als je wilt controleren of aanpassingen in config.txt correct zijn gemaakt door het script, kun je inloggen op je Raspberry Pi en met de volgende opdracht het bestand bekijken en eventueel aanpassen:

sudo nano /boot/config.txt

De sudo is overigens alleen nodig om aanpassingen te kunnen maken. Zoals je in deze masterclass hebt geleerd, kun je ook deze opdracht geven als je alleen de inhoud wilt zien:

cat /boot/config.txt

Je kunt daarnaast ook nog vcgencmd gebruiken om alleen de waarde van een bepaalde parameter op te vragen. Voor bijvoorbeeld de waarde van hdmi_safe gebruik je dan de opdracht:

sudo vcgencmd get_config hdmi_safe

Tijdens het starten van de Pi kun je eventueel de berichten 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.