Vraag:
Netbooting van meerdere "workers" RPi vanuit een "master" RPi
Longwelwind
2018-07-22 13:53:05 UTC
view on stackexchange narkive permalink

Mijn vraag is, denk ik, een beetje ingewikkeld, en ik denk dat het beter is om volledig te beschrijven wat ik heb en wat ik wil bereiken, met wat ik kan.

Wat ik heb

Ik heb een groep RPi 3B +, met één RPi die dienst doet als meester van het cluster en de anderen als arbeiders. Het doel is om een ​​cluster van RPi te creëren die beheersbaar zijn vanuit de master RPi om gedistribueerde berekeningen uit te voeren. Ze zijn allemaal verbonden via Ethernet via een schakelaar. Ik heb een netwerk opgezet met een DHCP-server op de Master RPi (met dnsmasq ) en ik kan probleemloos SSH naar elke Worker RPi sturen.

Ik heb ook een TFTP-server op de Master RPi, om redenen die ik in de volgende sectie zal uitleggen.

Wat ik wil bereiken

Ik wil de SD-kaarten van de Workers kunnen flashen op afstand en zonder enige fysieke interactie met de Workers RPi, allemaal vanuit de master. Ik kan handmatig een speciaal systeem naar de SD-kaarten van de Workers flashen, maar ik zou dan graag het OS van de Workers willen updaten zonder iets te hoeven verplaatsen, zoals hierboven vermeld.

De "plan" dat ik nu heb is het volgende:

  • Flash the Workers SD-kaarten met een speciaal systeem dat bestaat uit 2 systemen:
    • Een piCore (TinyCore) -systeem dat, op boot, start een script dat controleert of een nieuwe afbeelding beschikbaar is op de Master RPi, en zo ja, downloadt het met TFTP, flitst het en start opnieuw op.
    • Een tweede partitie die een "normale" zou bevatten systeem, opgezet door het piCore-systeem. Idealiter zou piCore elk soort besturingssysteem kunnen opzetten (Raspbian, een ander piCore-systeem of wat dan ook).

Wat ik kan doen

Ik kan een SD-kaart flashen met piCore, fdisk gebruiken om een ​​nieuwe partitie te maken die bedoeld is voor het "normale" systeem. Ik kan een script in piCore opzetten dat controleert of er een nieuwe afbeelding aanwezig is op de Master RPi, en deze downloaden.

Wat ik niet weet hoe ik moet doen

Hoe kan ik, zodra ik de afbeelding op de piCore-partitie heb, deze flashen in de tweede partitie? Ik ken alleen het unix-commando dd waarmee ik een hele SD-kaart kan flashen vanuit een .img -bestand, en ik wil natuurlijk niet de hele SD-kaart flashen van de Worker, maar alleen de speciale partitie die aan het "normale" systeem is toegewezen.

Hoe kan ik de bootloader van de SD-kaart configureren om ervoor te zorgen dat deze altijd de piCore-partitie opstart, en hoe kan ik, vanuit de speciale script in de piCore-partitie, zorg er dan voor dat wanneer ik opnieuw opstart, het nieuw geflitste "normale" systeem wordt opgestart en niet opnieuw het piCore-systeem.

Ik denk dat ik een correct plan heb, tenminste "conceptueel" , om het probleem op te lossen, maar ik heb niet de technische kennis over welke tool ik moet gebruiken en hoe ik ze moet configureren. Ik heb helaas niet veel ervaring met dit soort dingen op laag niveau.

Ik heb ook gehoord van het proces van "netbooting" van de Worker naar een bestandssysteem dat zich op de Master bevindt, maar ik ' Ik weet niet zeker of het zou voldoen aan de vereisten van mijn probleem. Hoofdzakelijk, ik weet niet of het mogelijk is voor meerdere om netboot naar hetzelfde te doen (en meer specifiek, hetzelfde externe bestandssysteem tegelijkertijd te gebruiken) en of het mogelijk is om de Worker zo in te stellen dat het opnieuw opstart op het lokale bestandssysteem op de SD-kaart nadat deze heeft gecontroleerd of er een nieuwe afbeelding beschikbaar is op de Master RPi.

Bij voorbaat dank!

Een zeer goed verklaarde vraag (^. ^) D Maar het gebruik van een piCore en het spelen met partities om een ​​nieuw rootbestandssysteem naar het te kopiëren, lijkt me een beetje ingewikkeld en vatbaar voor fouten. Je hebt al onderzoek gedaan naar netbooting. Ik zou daar de voorkeur aan geven omdat het een bekende technologie is met het gebruik van `nfs` (het belangrijkste door de Unix gebruikte netwerkbestandssysteem) om het rootbestandssysteem lokaal te mounten vanaf een externe server. Het enige nadeel is dat je een stabiel netwerk nodig hebt, want als het niet werkt, lopen de Workers vast. Ik heb het nog niet gedaan, maar ik ben geïnteresseerd. Als het een alternatief is, begin ik met een antwoord dat we kunnen verbeteren.
Uw terminologie is verwarrend. U kunt een SD-kaart in de Pi ** NIET ** "flashen". U ** KUNT ** partities kopiëren en / of OS-images installeren of kopiëren, maar ** NIET ** een werkend besturingssysteem wijzigen. Zie [PINN] (https://github.com/procount/pinn/blob/master/README_PINN.md) die wordt gebruikt om iets soortgelijks te doen, hoewel gecontroleerd door het toetsenbord.
@Milliways Sorry voor de mogelijk verkeerde terminologie. Met "knipperen" bedoel ik het plaatsen van een nieuw, schoon besturingssysteem op de SD-kaart. Inderdaad, wat ik bedoel is om de inhoud van het `.img` -bestand met een Raspbian-systeem te kopiëren en het op de SD-kaart van de Worker RPi te plaatsen.
@Ingo Hoe meer ik onderzoek deed naar het onderwerp, hoe meer het lijkt alsof netbooting me kan helpen mijn probleem op te lossen. Ik heb echter meerdere vragen: - Zodra de Worker RPi netbooted is op een bestandssysteem dat zich op de Master RPi bevindt (met `nfs`), zal ik in staat zijn om te communiceren met de SD-kaart die in de Worker RPi is geplaatst (zal er een` / dev / mmblk0`?) - Hoe kan ik de Worker RPi vertellen, zodra het knipperen is voltooid, om opnieuw op te starten op het systeem op de SD-kaart en niet opnieuw te proberen net op te starten? Het netwerk zou normaal "stabiel" moeten zijn .
@Longwelwind Ik zal je een antwoord geven, maar ik moet een beetje testen. Een ogenblik aub. In het algemeen: uw netbooted systeem gedraagt ​​zich alsof het is opgestart vanaf een SD-kaart. Het is niet nodig om iets te flitsen. Als je een cd-kaart hebt geplaatst zonder een geflitste afbeelding, zou je deze moeten kunnen monteren zoals elke andere usb-stick. Met een geflitste afbeelding zal het daar vanaf opstarten omdat het voorafgaat aan het opstarten van het netwerk.
Een antwoord:
Ingo
2018-07-25 06:07:32 UTC
view on stackexchange narkive permalink

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?

Bedankt voor het uiterst gedetailleerde antwoord! Het is me gelukt om een ​​RPi net op te starten (wat gemakkelijker was dan ik dacht dat het zou zijn), ik zal later kijken hoe ik met de SD-kaarten zal omgaan (of of ik een externe opslag zal gebruiken).
@Longwelwind Ik heb het de eerste keer gedaan en het is ook een documentatie voor mezelf die met de gemeenschap wordt gedeeld. Als je het gebruikt, zou ik het op prijs stellen als je de kop zou kunnen veranderen, zoiets als: * "Meerdere werkers op een netwerk starten vanaf een master" * of zo? Zodat anderen dit probleem beter kunnen vinden. Geef me hier een opmerking als je in de problemen komt. En ja, als het voor jou loopt, zou je het antwoord kunnen accepteren ;-)


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 4.0-licentie waaronder het wordt gedistribueerd.
Loading...