Hier is een oplossing met netbooting met sytemd-networkd.
Netwerkopstarten werkt alleen voor de bedrade adapter. Opstarten via draadloos LAN wordt niet ondersteund 1.
Het is ook belangrijk dat er al een werkende DHCP-server op het lokale netwerk is .
We gebruiken RPi 3B + . Het wordt geleverd met "Verbeterd PXE-netwerk en opstarten via USB-massaopslag" 2 . Opstarten met PXE werkt dus uit de doos. Vergeet alsjeblieft alle eigenaardigheden, hints en tijdelijke oplossingen voor netboot met oudere modellen die je op internet kunt vinden. Het is niet nodig om de werknemer voor te bereiden op netbooting. Het zal het gewoon proberen als er geen SD-kaart is geplaatst.
Laten we dus eens kijken wat ik heb getest. Ik heb voornamelijk de officiële tutorial 3 gevolgd voor oudere modellen, maar heb deze aangepast aan de behoeften van deze vraag en voor de RPi 3B + .
Ter referentie heb ik Raspbian Stretch Lite 2018-06-27 geflitst, ssh ingeschakeld en een volledige upgrade uitgevoerd. Deze opstelling kan zonder hoofd worden gedaan. Na de eerste keer opstarten van ssh in de RPi en Raspbian bijwerken:
raspberrypi ~ $ sudo -Esraspberrypi ~ # apt updateraspberrypi ~ # apt full-upgrade
Setup systemd-networkd
Kijk voor gedetailleerde informatie op 4 . Hier slechts in het kort. Voer deze opdrachten uit:
# Installeer helpersraspberrypi ~ # apt --yes installeer rng-tools systemd-containerraspberrypi ~ # systemctl mask networking.serviceraspberrypi ~ # systemctl mask dhcpcd.serviceraspberrypi ~ # mv / etc / netwerk / interfaces / etc / netwerk / interfaces ~ raspberrypi ~ # sed -i '1i resolvconf = NO' /etc/resolvconf.confraspberrypi ~ # systemctl enable systemd-networkd.serviceraspberrypi ~ # systemctl enable systemd-resolved.serviceraspberrypi ~ # ln - sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
We zullen onze master een statisch ip-adres geven omdat het werkt als een server. Mijn meester is bijvoorbeeld op
subnet 192.168.10.0/24static ip-adres 192.168.10.60broadcast-adres 192.168.10.255gateway / router 192.168.10.1dns-server 192.168.10.10
Natuurlijk moet u de ip-adressen van uw netwerk gebruiken. Kijk wat van jou is. Mogelijk vindt u uw DNS-server met cat /etc/resolv.conf
. Bij twijfel kunt u googles dns server 8.8.8.8 gebruiken. Om het statische IP-adres in te stellen, schrijft u dit bestand:
raspberrypi ~ # cat > /etc/systemd/network/04-eth.network <<EOF [Match] Name = e * [Network] Address = 192.168.10.60/24Gateway=192.168.10.1DNS=192.168.10.10EOF
Hernoem hostnaam van raspberrypi naar master:
raspberrypi ~ # sed -i ' s / raspberrypi / master / '/ etc / hostnameraspberrypi ~ # sed -i' s / raspberrypi / master / g '/ etc / hosts
Herstart.
Master configuratie
ssh in je master. Onthoud dat het nu een nieuw statisch ip-adres heeft.
Deze setup zal ook worden gebruikt voor de werker, dus we kopiëren het naar een map die we later zullen aankoppelen als rootpartitie voor de werker.
master ~ $ sudo -Esmaster ~ # mkdir -p / nfs / worker1master ~ # rsync -xa --exclude / nfs / / nfs / worker1
Niet doen maak je nu zorgen. Afhankelijk van uw SD-kaart duurt het kopiëren van 1,1 GByte ongeveer 15 minuten of langer. Kijk naar de groene led op je RasPi.
Als je klaar bent, bereid je het netwerk en de naam van de werknemer voor:
master ~ # rm / nfs / worker1 / etc / systemd /network/04-eth.networkmaster ~ # sed -i 's / master / worker1 /' / nfs / worker1 / etc / hostnamemaster ~ # sed -i 's / master / worker1 / g' / nfs / worker1 / etc / hosts
Nu starten we de werker in een container. Dit is vergelijkbaar met chroot
maar krachtiger. We genereren opnieuw SSH-hostsleutels zodat ssh niet zal klagen over spoofing ("hij heeft al dezelfde host gezien met een ander ip-adres"):
master ~ # systemd-nspawn -D / nfs / worker1 / sbin / init
Log in en voer de volgende opdrachten uit. Hierdoor worden nieuwe SSH2-serversleutels gemaakt en wordt geprobeerd de ssh.service te starten, maar dat mislukt omdat de ethernetinterface al door de master wordt gebruikt. Het starten van de ssh.service (hier met fout) is essentieel omdat we de werker hoofdloos zijn. Als de werker op zijn eigen hardware draait, zou dit foutloos moeten verlopen.
worker1 ~ $ sudo rm / etc / ssh / ssh_host_ * worker1 ~ $ sudo dpkg-reconfigure openssh-serverworker1 ~ $ logout
Verlaat de container met CTRL+
(drie keer kort) ]
.
Configureer tftp-server
Nu gaan we een tftp-server installeren die nodig is om bootbestanden naar de werker te sturen. Het programma dnsmasq
zal hiervoor zorgen. We installeren ook de netwerksniffer tcpdump om te kijken of de werker zijn opstartbestanden op de juiste manier opvraagt:
master ~ # apt --yes install dnsmasq tcpdumpmaster ~ # # Stop met het doorbreken van DNS-resolving door dnsmasq: master ~ # rm /etc/resolvconf/update.d/dnsmasq
Start nu tcpdump zodat je kunt zoeken naar DHCP-pakketten van de werker:
master ~ # tcpdump -i eth0 port bootpc
Zet nu de werk-RPi aan zonder SD-kaart. Dan zou je er pakketten uit moeten halen "DHCP / BOOTP, Request from ..."
IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP / DHCP, Request from b8: 27 : eb: d3: 85: 78
Hier moeten we het mac-adres b8: 27: eb: d3: 85: 78
van de werker-RPi opmerken. Je zou ook moeten zien dat het een antwoord krijgt op een ip-adres van de DHCP-server op je lokale netwerk, hier 192.168.10.1:
IP 192.168.10.1.bootps > 192.168.10.101.bootpc: BOOTP / DHCP, antwoord, lengte 300
Sluit af met CTRL + C
. Vervolgens moeten we dnsmasq
configureren om opstartbestanden te leveren via tftp
. Schrijf dit bestand:
master ~ # cat > /etc/dnsmasq.conf <<EOF
port = 0dhcp-range = 192.168.10.255, proxylog-dhcpenable-tftptftp-root = / tftpboottftp-unique-root = macpxe-service = 0, "Raspberry Pi Boot" EOF
De eerste adres van het dhcp-bereik
is het uitzendadres van uw netwerk. Maak nu een / tftpboot-directory aan. De submap voor de specifieke worker (het mac-adres hebben we opgemerkt met tcpdump) mag alleen kleine letters en streepjes bevatten:
master ~ # mkdir -p / tftpboot / b8-27-eb- d3-85-78master ~ # chmod -R 777 / tftpbootmaster ~ # systemctl enable dnsmasq.servicemaster ~ # systemctl herstart dnsmasq.service
Monitor dnsmasq
:
master ~ # journalctl --unit dnsmasq.service --follow
Schakel nu de werk-RPi uit en weer in. Je zou zoiets als dit moeten zien:
master dnsmasq-tftp [756]: bestand /tftpboot/b8-27-eb-d3-85-78/bootcode.bin niet gevonden
Vervolgens moet u bootcode.bin
en start.elf
kopiëren naar de / tftpboot / b8-27-eb-d3-85- 78 directory. U zou dit moeten kunnen doen door de bestanden van / boot
te kopiëren, aangezien dit de juiste zijn. We hebben een kernel nodig, dus we kunnen net zo goed de hele opstartdirectory kopiëren. Gebruik eerst Ctrl + C
om de bewakingsstatus te verlaten. Typ dan het volgende:
master ~ # cp -r / boot / * / tftpboot / b8-27-eb-d3-85-78
Herstart dnsmasq
voor een goede maatregel:
master ~ # systemctl herstart dnsmasq
Bewerk / tftpboot / b8-27 -eb-d3-85-78 / cmdline.txt
en vanaf root =
en hoger, vervang het door:
root = / dev / nfs nfsroot = 192.168.10.60: / nfs / worker1, vers = 3 rw ip = dhcp rootwait elevator = deadline
Je moet hier het IP-adres vervangen door het statische ip-adres van je master.
NFS-root instellen
Dit zou je Raspberry Pi nu in staat moeten stellen om op te starten totdat hij probeert een rootbestandssysteem te laden dat normaal gesproken op de tweede partitie van de SD-kaart staat (die hij niet heeft). Alles wat we moeten doen om dit werkend te krijgen, is het / nfs / worker1
bestandssysteem exporteren dat we eerder hebben gemaakt.
master ~ # apt install nfs-kernel-servermaster ~ # echo "/ nfs * (rw, sync, no_subtree_check, no_root_squash)" | tee -a / etc / exportsmaster ~ # systemctl enable rpcbindmaster ~ # systemctl herstart rpcbindmaster ~ # systemctl enable nfs-kernel-servermaster ~ # systemctl herstart nfs-kernel-server
Bewerk ten slotte / nfs / worker1 / etc / fstab
en verwijder of becommentarieer de regels PARTUUID = efe16111-01
en PARTUUID = efe16111-02
(alleen proc
moet worden overgelaten).
Schakel nu de werker-RPi uit en weer in en het zou moeten opstarten. U kunt opnieuw monitoren. U zult ook zien welk ip-adres uw werknemer heeft:
master ~ # exitmaster ~ $ journalctl --unit dnsmasq.service --follow
Nu zou in staat moeten zijn om in de werknemer te sshen, bijv met:
master ~ $ ssh pi@192.168.10.101
Wat nu te doen?
Je hebt nu een werkbasis voor één werknemer. Het zou geen probleem moeten zijn om de volgende worker2 toe te voegen met bijv. mac-adres b8: 27: eb: 0e: 3c: 6f. Maak mappen mkdir / tftpboot / b8-27-eb-0e-3c-6f
en mkdir / nfs / worker2
, kopieer opstart- en rootgegevens ernaar en wijzig /tftpboot/b8-27-eb-0e-3c-6f/cmdline.txt
en / nfs / worker2 / etc / fstab
. Dan zou worker2 moeten opstarten.
Je kunt je workers beheren vanaf de master door ze in een container uit te voeren zoals hierboven getoond met sudo systemd-nspawn -D / nfs / worker1 / sbin / init
, bijv voor onderhoud. Maar dit kan alleen worden gedaan als de werknemer wordt uitgeschakeld.
Ja, er is veel te optimaliseren. Maar dit valt hier buiten het bereik en kan als afzonderlijke vragen worden gesteld.
Je hebt wat opslagruimte nodig en je kunt een externe USB-opslag (stick of schijf) op de master aansluiten. De meeste bestanden zijn identiek. Het is wellicht mogelijk om met harde links te werken. Er zijn back-upstrategieën die hiervan gebruik maken. Ik weet niet of het voor dit doel werkbaar is.
U kunt het besturingssysteem van de werknemers terugbrengen tot precies wat ze nodig hebben. De eerste stap zou kunnen zijn het opruimen van oude netwerken (ifupdown), dhcpcd en openresolv 4.
Als de werknemer niet persistent hoeft te zijn na reboot, betekent dat u alle wijzigingen van runtime vergeet, dan kunt u een alleen-lezen root-directory gebruiken. Dit heeft het grote voordeel dat je maar één boot- en root-directory nodig hebt voor alle workers. Probleem is dat de workers verschillende namen op het netwerk nodig hebben (worker1, worker2, ...) maar dit kan opgelost worden met DHCP. Om dit te bereiken, kunt u letten op speciale tijdelijke mappen 5 of met overlay-bestandssystemen 6 .
referenties:
[1] Netwerk opstarten
[2] Raspberry Pi 3 Model B +
[3] Start uw Raspberry Pi via het netwerk
[4] Hoe migreren van netwerken naar systemd-networkd met dynamische failover
[5] Kan een Raspberry Pi worden gebruikt om een back-up van zichzelf te maken?
[6] Hoe zorg ik ervoor dat het besturingssysteem zichzelf reset telkens wanneer het opstart?