Zo start je je Raspberry Pi vanaf usb of je netwerk

© PXimport

Zo start je je Raspberry Pi vanaf usb of je netwerk

Geplaatst: 4 mei 2017 - 03:20

Aangepast: 24 januari 2023 - 18:47

Koen Vervloesem

Een Raspberry Pi opstarten doe je normaal vanaf een (micro-)sd-kaart. Maar soms is dat niet zo handig. Sinds kort hebben de ontwikkelaars van de familie minicomputertjes twee nieuwe bootmodi toegevoegd: usb en netwerk. Met de usb-modus start je de Raspberry Pi vanaf een besturingssysteem op een usb-stick of harde schijf die je via usb aansluit.

Met de netwerkmodus heb je zelfs geen lokaal opslagapparaat nodig: de Raspberry Pi downloadt zijn besturingssysteem via het netwerk van een andere computer. Zo kun je ook eenvoudig meerdere Raspberry Pi’s laten opstarten via een besturingssysteem op een centrale computer. Update je dat centrale besturingssysteem, dan draaien al je Raspberry Pi’s automatisch de nieuwste versie.

01 Experimentele bootmodi

De nieuwe bootmodi zijn experimenteel en ontwikkeld voor de Raspberry Pi 3. De bootcode die daarvoor nodig is, zit in de BCM2837: de processor van de Raspberry Pi 3. Heb je een Raspberry Pi 1, 2 of Zero, dan kun je ook van de nieuwe bootmodi gebruikmaken, maar via een omweg: formatteer een sd-kaart met fat32, kopieer het bestand bootcode.bin naar het kaartje en start je Pi van dit kaartje op. Dat is dan wel niet volledig zonder sd-kaart, maar je kunt je Pi wel vanaf usb of het netwerk opstarten.

02 Mogelijke problemen met usb

Opstarten van usb lukt niet altijd. Zo schakelen sommige usb-sticks zich te traag in. Ook externe harde schijven reageren niet altijd binnen de twee seconden, de tijd die de bootcode standaard wacht. Je kunt die time-out wel verhogen naar vijf seconden, maar sommige schijven zijn dan zelfs nog niet klaar. Andere usb-sticks stellen heel specifieke eisen aan het communicatieprotocol, waaraan de (tot 32 kB rom beperkte) bootcode van de Raspberry Pi 3 niet voldoet. Je zult dus misschien enkele schijven moeten uitproberen.

Media has no description

© PXimport

03 Firmware upgraden

We gaan ervan uit dat je Raspbian op je Raspberry Pi draait. Indien niet, download dan een image en zet het op een sd-kaart met het programma Win32DiskImager en start de Pi ervan op. Ververs eerst alle pakketbronnen met sudo apt-get update. Als je Raspbian Lite draait (de versie zonder grafische interface), voer dan eerst sudo apt-get install rpi-update uit omdat die minimale versie van Raspbian het pakket rpi-update niet heeft. Voer dan een update van de firmware uit de ‘next’-branch uit met sudo BRANCH=next rpi-update.

04 Usb-modus inschakelen

Open het opstartconfiguratiebestand met sudo nano /boot/config.txt en voeg de opdracht program_usb_boot_mode=1 toe aan het einde. Sla het bestand op met Ctrl+O en sluit nano af met Ctrl+X. Herstart je Pi met sudo reboot, en controleer na de herstart of de usb-modus is ingeschakeld. Dat doe je met de opdracht vcgencmd otp_dump | grep 17:, die als resultaat een getal moet tonen dat eindigt op 0x3020000a. Open daarna weer het opstartconfiguratiebestand en verwijder de opdracht program_usb_boot_mode=1, zodat je niet per ongeluk de usb-bootmodus inschakelt op een andere Pi waarin je deze sd-kaart steekt.

Media has no description

© PXimport

05 Usb-opslag partitioneren

Sluit nu je usb-opslagapparaat op je Pi aan. Partitioneer dit apparaat met sudo parted /dev/sda. Maak een nieuwe partitietabel aan met mktable msdos en bevestig met Yes dat je alle gegevens op de schijf wilt vernietigen. Maak daarna een fat32-partitie van 100 megabyte aan met mkpart primary fat32 0% 100M en een ext4-partitie die de rest van de schijf inneemt met mkpart primary ext4 100M 100%. Bekijk de wijzigingen met print en sluit parted af met quit. Creëer dan het bootbestandssysteem met sudo mkfs.vfat -n BOOT -F 32 /dev/sda1 en het rootbestandssysteem met sudo mkfs.ext4 /dev/sda2.

06 Raspbian kopiëren

Installeer het programma rsync met sudo apt-get install rsync. Maak daarna een nieuwe directory aan met sudo mkdir /mnt/usb en koppel het ext4-bestandssysteem van de usb-opslag daarop aan met sudo mount /dev/sda2 /mnt/usb/. Maak dan een boot-directory aan met sudo mkdir /mnt/usb/boot en koppel het bootbestandssysteem erop aan met sudo mount /dev/sda1 /mnt/usb/boot/. Kopieer nu het Raspbian-systeem dat je vanaf de sd-kaart draait naar het bestandssysteem op je usb-opslag. Dat doe je met de opdracht sudo rsync -ax --progress / /boot /mnt/usb. Heb even geduld, want dat kan een tijdje duren.

07 Chroot

De usb-opslag bevat nu een kopie van je draaiende Raspbian, maar niet alles mag identiek zijn. Zo heeft het nieuwe systeem andere ssh-sleutels nodig. Ga daarom naar de usb-opslag met cd /mnt/usb en koppel een aantal speciale bestandssystemen aan met sudo mount --bind /dev dev, sudo mount --bind /sys sys en sudo mount --bind /proc proc. Voer daarna een chroot (change root) uit met sudo chroot .. Alle opdrachten die je nu uitvoert, worden in het systeem op de usb-opslag uitgevoerd, niet meer in het systeem op de sd-kaart.

Media has no description

© PXimport

08 Nieuwe ssh-sleutels

Je bent nu root-gebruiker in de chroot. Verwijder eerst de bestaande ssh-sleutels, want dat zijn degene die we van het systeem van de sd-kaart hebben gekopieerd. Dat doe je met rm /etc/ssh/ssh_host*. Genereer daarna nieuwe ssh-sleutels door de OpenSSH-server te herconfigureren met dpkg-reconfigure openssh-server. Verlaat daarna de chroot met exit. Alle opdrachten die je nu uitvoert, worden weer in het systeem op de sd-kaart uitgevoerd. Ontkoppel dan de speciale bestandssystemen met sudo umount dev, sudo umount sys en sudo umount proc.

Media has no description

© PXimport

09 Rootbestandssysteem aanpassen

Zorg nu dat de Pi het rootbestandssysteem op de usb-opslag gebruikt in plaats van dat op de sd-kaart. Daarvoor pas je het bestand /boot/cmdline.txt aan met sudo sed -i "s,root=/dev/mmcblk0p2,root=/dev/sda2," /mnt/usb/boot/cmdline.txt. Doe hetzelfde in het bestand /etc/fstab: sudo sed -i "s,/dev/mmcblk0p,/dev/sda," /mnt/usb/etc/fstab. Ga daarna naar je home-directory met cd, ontkoppel de bestandssystemen van de usb-opslag met sudo umount /mnt/usb/boot en sudo umount /mnt/usb en schakel de Pi uit met sudo poweroff. Trek de voedingskabel uit, verwijder de sd-kaart en steek de voedingskabel er terug in. Als alles goed gaat, start je Pi nu op van je usb-opslag.

Media has no description

© PXimport

10 Mogelijke problemen met ethernet

Voor opstarten vanaf het netwerk is er een belangrijke beperking: dit werkt niet vanaf wifi, alleen vanaf de ingebouwde ethernetpoort. Maar sommige switches zijn te traag met hun reactie op de dhcp-aanvraag van de bootcode van de Pi. Bovendien duurt het soms lang voor de bootcode van een time-out is hersteld. Hoe meer computers er op je netwerk hangen, hoe sneller de Pi ontwaakt door een willekeurig netwerkpakket. Verder geldt hetzelfde als bij usb: je moet eerst je firmware upgraden. En op een Raspberry Pi 1, 2 of Zero kun je experimentele bootcode op de sd-kaart installeren.

11 Client en server

Om een Pi op te starten vanaf het netwerk, heb je een server nodig. Die server biedt het bestandssysteem met Raspbian aan een of meerdere Pi’s aan, die het bestandssysteem via het netwerk downloaden en ervan opstarten. Dat heeft heel wat voordelen. Een Pi met klassieke opstartmodus die bijvoorbeeld niet correct is uitgeschakeld, kan met een corrupte sd-kaart te maken krijgen en niet meer opstarten. Download je het bestandssysteem via het netwerk, dan kan dat probleem niet voorkomen. Bovendien kun je hetzelfde bestandssysteem delen met meerdere Pi’s: één keer upgraden is dan voldoende.

Media has no description

© PXimport

12 Client en bestandssysteem prepareren

Op de client installeer je Raspbian, upgrade je de firmware en schakel je de usb-modus in (zie stappen 3 en 4). Haal de sd-kaart (met een capaciteit van minimaal 16 GB) uit de client. Als server gebruiken we ook een Pi met Raspbian. Steek de sd-kaart in de server en start die op. Voer sudo raspi-config uit en breid het rootbestandssysteem uit zodat het de hele sd-kaart inneemt. Herstart de Pi en installeer het programma rsync met sudo apt-get install rsync. Maak daarna een nieuwe directory aan met sudo mkdir -p /nfs/client1. Kopieer je volledige Raspbian-systeem naar die directory met sudo rsync -xa --progress --exclude /nfs / /nfs/client1.

13 Statisch netwerk

Voer daarna stap 7 uit, maar met cd /nfs/client1 in plaats van cd /mnt/usb. Voer daarna stap 8 uit, maar voordat je de chroot verlaat, typ je nano /etc/rc.local en voeg je voor de regel met exit 0 de regel /etc/init.d/ssh start toe. Vraag daarna (als je de chroot hebt verlaten) het adres van je gateway op met ip route | grep default | awk '{print $3}' en voer ip -4 addr show dev eth0 | grep inet uit. Na inet krijg je het ip-adres van je server te zien en na brd het broadcastadres van je netwerk.

14 Netwerkaanpassingen

Voer sudo nano /etc/network/interfaces uit en vervang iface eth0 inet manual door iface eth0 inet static. Voeg voor die regel auto eth0 toe en erna address IPADRES, netmask 255.255.255.0 en gateway GATEWAY, met uiteraard de juiste ip-adressen. Schakel de dhcp-client uit met sudo systemctl disable dhcpcd, schakel het standaard netwerk in met sudo systemctl enable networking en herstart met sudo reboot. Voeg daarna het adres van je gateway, die ook je dns-server is, toe aan /etc/resolv.conf. Dat doe je met de opdracht echo "nameserver GATEWAY" | sudo tee /etc/resolv.conf, waarbij je uiteraard het juiste ip-adres invult. Maak het bestand daarna onveranderlijk met sudo chattr +i /etc/resolv.conf.

Media has no description

© PXimport

15 TFTP

Installeer daarna een dhcp-server: sudo apt-get install dnsmasq. Voer dan sudo rm /etc/resolvconf/update.d/dnsmasq uit. Nu moeten we ervoor zorgen dat de dhcp-server het bestandssysteem aan de clients doorstuurt. Voer sudo nano /etc/dnsmasq.conf uit en voeg de volgende regels bovenaan het bestand toe: port=0, dhcp-range=BROADCAST,proxy (met in plaats van BROADCAST je broadcastadres), log-dhcp, enable-tftp, tftp-root=/tftpboot en pxe-service=0, Raspberry Pi Boot". Sla het bestand op met Ctrl+O en sluit nano af met Ctrl+X. Maak de tftp-directory aan met sudo mkdir /tftpboot en geef die de juiste gebruikersrechten met sudo chmod 777 /tftpboot. Schakel dnsmasq in met sudo systemctl enable dnsmasq.

Media has no description

© PXimport

16 NFS-server

Kopieer het bootbestandssysteem met cp -r /boot/* /tftpboot. Het rootbestandssysteem hebben we eerder al gekopieerd, maar moeten we nog beschikbaar stellen. Installeer een nfs-server met sudo apt-get install nfs-kernel-server. Exporteer nu het rootbestandssysteem met echo "/nfs/client1 *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports. Activeer en herstart rpcbind met sudo systemctl enable rpcbind en sudo systemctl restart rpcbind en doe hetzelfde met de nfs-server: sudo systemctl enable nfs-kernel-server en sudo systemctl restart nfs-kernel-server. Voer dan nano /tftpboot/cmdline.txt uit en vervang de configuratie vanaf root= door root=/dev/nfs nfsroot=IPADRES:/nfs/client1 rw ip=dhcp elevator=deadline rootwait.

Media has no description

© PXimport

17 Client opstarten

Voer nu sudo nano /nfs/client1/etc/fstab uit en verwijder de regels met /dev/mmcblkp1 en /dev/mmcblkp2. Alleen de regel met het proc-bestandssysteem mag blijven staan. Sla je wijzigingen op met Ctrl+O en sluit nano af met Ctrl+X. Herstart je server met sudo reboot. Zodra dat is gebeurd, verbind je de client met het netwerk en sluit je de stroomkabel aan. Na ongeveer tien seconden zouden de ledjes op het bordje moeten aangaan. Als alles goed gaat, start je Pi nu op van de kernel in /tftpboot op je server en koppelt die daarna ook het bestandssysteem in /nfs/client1 op je server aan.

Media has no description

© PXimport

18 Troubleshooting

Als je client na een minuutje of zo nog niet online is, installeer dan op de server tcpdump met sudo apt-get install tcpdump en start het programma om te kijken of je een dhcp-pakketje van de client te zien krijgt: sudo tcpdump -i eth0 port bootpc. Als je de client opstart, zou je op de server de boodschap DHCP/BOOTP, Request from ... moeten zien. Lukt dat al, sluit het programma dan af met Ctrl+C en kijk met tail -f /var/log/daemon.log naar foutmeldingen. Overigens kun je tftp ook gebruiken als je al een dhcp-server hebt draaien. Verwijder dan in /etc/dnsmasq.conf de regel die begint met dhcp-range= en voer het ip-adres van je server in de instellingen van je router in bij TFTP-server.

Media has no description

© PXimport

Deel dit artikel
Voeg toe aan favorieten