Tips en Trucs 2025

Raspberry Pi OS klonen en Tasmota scanner

Reservekopie maken van Raspberry Pi project

Raspberry Pi gebruikers rekenen op hun creaties. Het is dus belangrijk om reservekopies te hebben, voor als er iets fout gaat.

De Desktop versie van Raspberry Pi OS bevat in het menu Hulpmiddelen het programma SD Card Copier waarmee je een kopie van het besturingssysteem naar een tweede SD kaart of USB stick kunt schrijven. Handig, maar je hebt wel steeds een extra SD kaart/USB stick nodig.

Met klassieke systeembackup software gaan we een reservekopie van een Raspberry Pi project opslaan in een bestand op een NAS server.

Eerst hebben we software nodig waarmee we een compleet bestandssysteem efficient kunnen opslaan in een bestand (image). FSArchiver is daarvoor uitermate geschikt.

FSArchiver

Installeer FSArchiver met de opdracht:

dany@pindabook:~$ sudo apt install fsarchiver
[sudo] wachtwoord voor root: 
Pakketlijsten worden ingelezen... Klaar
Boom van vereisten wordt opgebouwd... Klaar
De statusinformatie wordt gelezen... Klaar 
Het volgende pakket is automatisch geïnstalleerd en is niet langer nodig:
  linux-image-6.1.0-27-amd64
Gebruik 'sudo apt autoremove' om het te verwijderen.
Voorgestelde pakketten:
  xfsprogs reiserfsprogs reiser4progs jfsutils ntfsprogs btrfs-progs
De volgende NIEUWE pakketten zullen geïnstalleerd worden:
  fsarchiver
0 opgewaardeerd, 1 nieuw geïnstalleerd, 0 te verwijderen en 0 niet opgewaardeerd.
Er moeten 105 kB aan archieven opgehaald worden.
Na deze bewerking zal er 285 kB extra schijfruimte gebruikt worden.
Ophalen:1 http://deb.debian.org/debian bookworm/main amd64 fsarchiver amd64 0.8.7-1 [105 kB]
105 kB opgehaald in 0s (1.631 kB/s)
Voorheen niet geselecteerd pakket fsarchiver wordt geselecteerd.
(Database wordt ingelezen ... 178867 bestanden en mappen momenteel geïnstalleerd.)
Uitpakken van .../fsarchiver_0.8.7-1_amd64.deb wordt voorbereid...
Bezig met uitpakken van fsarchiver (0.8.7-1) ...
Instellen van fsarchiver (0.8.7-1) ...
Bezig met afhandelen van triggers voor man-db (2.11.2-2) ...

De reservekopieën slaan we op een netwerkschijf (NAS) op. Om gedeelde mappen op een NAS te koppelen, installeren we het volgende pakket:

dany@pindabook:~$ sudo apt install cifs-utils
Pakketlijsten worden ingelezen... Klaar
Boom van vereisten wordt opgebouwd... Klaar
De statusinformatie wordt gelezen... Klaar 
Het volgende pakket is automatisch geïnstalleerd en is niet langer nodig:
  linux-image-6.1.0-27-amd64
Gebruik 'sudo apt autoremove' om het te verwijderen.
De volgende extra pakketten zullen geïnstalleerd worden:
  keyutils
Voorgestelde pakketten:
  winbind
De volgende NIEUWE pakketten zullen geïnstalleerd worden:
  cifs-utils keyutils
0 opgewaardeerd, 2 nieuw geïnstalleerd, 0 te verwijderen en 0 niet opgewaardeerd.
Er moeten 149 kB aan archieven opgehaald worden.
Na deze bewerking zal er 489 kB extra schijfruimte gebruikt worden.
Wilt u doorgaan? [J/n] 
Ophalen:1 http://deb.debian.org/debian bookworm/main amd64 cifs-utils amd64 2:7.0-2 [94,9 kB]
Ophalen:2 http://deb.debian.org/debian bookworm/main amd64 keyutils amd64 1.6.3-2 [54,5 kB]
149 kB opgehaald in 0s (2.059 kB/s) 
Voorheen niet geselecteerd pakket cifs-utils wordt geselecteerd.
(Database wordt ingelezen ... 178874 bestanden en mappen momenteel geïnstalleerd.)
Uitpakken van .../cifs-utils_2%3a7.0-2_amd64.deb wordt voorbereid...
Bezig met uitpakken van cifs-utils (2:7.0-2) ...
Voorheen niet geselecteerd pakket keyutils wordt geselecteerd.
Uitpakken van .../keyutils_1.6.3-2_amd64.deb wordt voorbereid...
Bezig met uitpakken van keyutils (1.6.3-2) ...
Instellen van cifs-utils (2:7.0-2) ...
update-alternatives: /usr/lib/x86_64-linux-gnu/cifs-utils/idmapwb.so wordt gebruikt om in de automatische modus in /etc/cifs-utils/idmap-plugin (idmap-plugin) te voorzien
Instellen van keyutils (1.6.3-2) ...
Bezig met afhandelen van triggers voor man-db (2.11.2-2) ...

Om een gedeelde NAS map te koppelen, moeten we beschikken over een lege map. Een veel gebruikte map om netwerkmappen te koppelen is /mnt/. Hoewel wordt aangeraden in deze map afzonderlijke mappen aan te maken voor elke netwerkmap, mag je deze map ook gebruiken als je maar één enkele netwerkmap wenst te gebruiken. Deze moet wel leeg zijn en dit controleer je met de opdracht:

dany@pindabook:~$ ls -l /mnt/
totaal 0

Indien deze niet leeg is maak je eerst als beheerder (bijvoorbeeld: sudo mkdir /mnt/backup) een submap aan. Vervang dan wel in de volgende opdrachten /mnt door /mnt/backup.

Een publieke (zonder gebruikersnaam en wachtwoord en dus voor iedereen toegankelijk) netwerkmap koppel je aan de /mnt map met de opdracht:

dany@pindabook:~$ sudo mount -t cifs //hostnaamNAS/netwerkmap /mnt
Password for root@//hostnaamNAS/netwerkmap:

Bij de vraag naar een wachtwoord (Password) druk je Return, publieke netwerkmappen gebruiken geen wachtwoorden. Controleer de inhoud van de gekoppelde netwerkmap met:

dany@pindabook:~$ ls -l /mnt/
totaal 287120564
-rwxr-xr-x 1 root root     20378122  9 jan 13:35 main.nvme0n1p1.fsa
-rwxr-xr-x 1 root root 212888683399  9 jan 15:36 main.nvme0n1p3.gz
-rwxr-xr-x 1 root root  81102349150  9 jan 13:36 main.nvme0n1p7.fsa
-rwxr-xr-x 1 root root         1338  9 jan 13:32 main.nvme0n1.table.txt

Je merkt dat in de publiek gedeelde map op mijn netwerkschijf (NAS) vier bestanden staan.

Plaats de SD kaart (of USB stick) met het te kopiëren Raspberry Pi project in de computer. De koppeling gaat automatisch en kan je controleren met de opdracht:

dany@pindabook:~$ sudo dmesg -T 
[sudo] wachtwoord voor root:
... [ma jan 13 18:41:39 2025] usb 3-2: new SuperSpeed USB device number 2 using xhci_hcd
[ma jan 13 18:41:39 2025] usb 3-2: New USB device found, idVendor=0781, idProduct=5583, bcdDevice= 1.00
[ma jan 13 18:41:39 2025] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ma jan 13 18:41:39 2025] usb 3-2: Product:  SanDisk 3.2Gen1
[ma jan 13 18:41:39 2025] usb 3-2: Manufacturer:  USB
[ma jan 13 18:41:39 2025] usb 3-2: SerialNumber: 0101638727adb9f46d8c8397105a679bbd263ece19dff12e122f21d39d4a174088500000000000000000
00005ec831ebff137300835581071530d3ca
[ma jan 13 18:41:39 2025] usb-storage 3-2:1.0: USB Mass Storage device detected
[ma jan 13 18:41:39 2025] scsi host4: usb-storage 3-2:1.0
[ma jan 13 18:41:39 2025] usbcore: registered new interface driver usb-storage
[ma jan 13 18:41:39 2025] usbcore: registered new interface driver uas
[ma jan 13 18:41:40 2025] scsi 4:0:0:0: Direct-Access      USB      SanDisk 3.2Gen1 1.00 PQ: 0 ANSI: 6
[ma jan 13 18:41:40 2025] sd 4:0:0:0: Attached scsi generic sg1 type 0
[ma jan 13 18:41:40 2025] sd 4:0:0:0: [sdb] 120164352 512-byte logical blocks: (61.5 GB/57.3 GiB)
[ma jan 13 18:41:40 2025] sd 4:0:0:0: [sdb] Write Protect is off
[ma jan 13 18:41:40 2025] sd 4:0:0:0: [sdb] Mode Sense: 43 00 00 00
[ma jan 13 18:41:40 2025] sd 4:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ma jan 13 18:41:40 2025]  sdb: sdb1 sdb2
[ma jan 13 18:41:40 2025] sd 4:0:0:0: [sdb] Attached SCSI removable disk

Linux koppelde in mijn geval de USB stick aan het apparaat /dev/sdb. Deze waarneming is zeer belangrijk. Mocht je straks bijvoorbeeld het verkeerde apparaat gebruiken, dan kan dit verstrekkende gevolgen hebben, zoals het niet meer opstarten van het systeem of het verliezen van complete partities met waardevolle gegevens. Een gewaarschuwde mens, is er twee waard.

Om niet toevallig of per ongeluk belangrijke gegevens kwijt te spelen, heb ik in de volgende opdrachten /dev/sdb vervangen door /dev/sdX. Vervang dus in elke opdracht /dev/sdX door /dev/ gevolgd door het bij jouw gekoppelde apparaat (zie sudo dmesg -T opdracht).

Nu we weten dat onze bron gekoppeld is aan dev/sdX, kunnen we verder. Alleen als systeembeheerder kan je reservekopieën maken. Om tijdelijk als systeembeheerder te werken, gebruik je de volgende opdracht (in sommige distributies moet je daarvoor de opdracht sudo -i of sudo -s gebruiken):

dany@pindabook:~$ su
Wachtwoord: 

De root gebruiker (systeembeheerder) gebruikt een # als prompt, gewone gebruikers $. De meeste distributies maken dit ook duidelijk aan de hand van kleuren.

Eerst gaan we de structuur (partitietabel) van het bron apparaat kopiëren:

root@pindabook:/home/dany# /sbin/sfdisk -d /dev/sdX > /mnt/rpiproject.sdX.partition.table.txt

Dit gaat zeer snel. Elke USB stick (SD kaart) met een Raspberry Pi project bevat twee partities: één om op te starten (boot) en één met het besturingssysteem en jouw project. Met de volgende opdracht maak je van de twee partities /dev/sdX1 en /dev/sdX2 een reservekopie met de naam rpiproject.fsa op de NAS:

root@pindabook:/home/dany# /sbin/fsarchiver savefs /mnt/rpiproject.fsa /dev/sdX1 /dev/sdX2
Statistics for filesystem 0
* files successfully processed:....regfiles=380, directories=2, symlinks=0, hardlinks=0, specials=0
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0
Statistics for filesystem 1
* files successfully processed:....regfiles=71941, directories=6814, symlinks=7227, hardlinks=404, specials=9
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0

Aangezien we met deze opdracht een reservekopie maken kan dit even duren, zeker voor de tweede partitie. Wees geduldig en wacht tot de FSArchiver klaar is.

Daarna is het veiliger om terug als gewone gebruiker te werken. Stop het werken als systeembeheerder met:

root@pindabook:/home/dany# exit
exit

Bekijken we nu opnieuw de inhoud van de gekoppelde gedeelde netwerkmap:


dany@pindabook:~$ ls -lh /mnt/
totaal 276G
-rwxr-xr-x 1 root root  20M  9 jan 13:35 main.nvme0n1p1.fsa
-rwxr-xr-x 1 root root 199G  9 jan 15:36 main.nvme0n1p3.gz
-rwxr-xr-x 1 root root  76G  9 jan 13:36 main.nvme0n1p7.fsa
-rwxr-xr-x 1 root root 1,4K  9 jan 13:32 main.nvme0n1.table.txt
-rwxr-xr-x 1 root root 1,5G 13 jan 19:02 rpiproject.fsa
-rwxr-xr-x 1 root root  198 13 jan 18:58 rpiproject.sdX.partition.table.txt

Let op het feit dat de reservekopie rpiproject.fsa maar 1,5 GB groot is, terwijl de gebruikte USB stick met het Raspberry Pi project een capaciteit van 64 GB heeft.

Raspberry Pi project met reservekopie herstellen

Een reservekopie (procedure) is pas betrouwbaar als je ze ook hebt getest.

Verwijder de bron USB stick (of SD kaart) veilig.

Controleer met ls -lh /mnt/ de gekoppelde netwerkmap. Indien nodig koppel je de gedeelde netwerkmap met de reservekopieën opnieuw met sudo mount -t cifs //hostnaamNAS/netwerkmap /mnt.

Plaats een doel SD kaart (of USB stick) waarop we de reservekopie gaan terugzetten. Opnieuw gaan we na aan welk apparaat ons doel werd gekoppeld:

dany@pindabook:~$ sudo dmesg -T 
[sudo] wachtwoord voor root:
... [di jan 14 16:03:23 2025] usb 3-2: new SuperSpeed USB device number 3 using xhci_hcd
[di jan 14 16:03:23 2025] usb 3-2: New USB device found, idVendor=8564, idProduct=4000, bcdDevice= 0.38
[di jan 14 16:03:23 2025] usb 3-2: New USB device strings: Mfr=3, Product=4, SerialNumber=5
[di jan 14 16:03:23 2025] usb 3-2: Product: Transcend
[di jan 14 16:03:23 2025] usb 3-2: Manufacturer: TS-RDF5  
[di jan 14 16:03:23 2025] usb 3-2: SerialNumber: 000000000037
[di jan 14 16:03:23 2025] usb-storage 3-2:1.0: USB Mass Storage device detected
[di jan 14 16:03:23 2025] scsi host4: usb-storage 3-2:1.0
[di jan 14 16:03:24 2025] scsi 4:0:0:0: Direct-Access     TS-RDF5  SD  Transcend    TS38 PQ: 0 ANSI: 6
[di jan 14 16:03:24 2025] sd 4:0:0:0: Attached scsi generic sg1 type 0
[di jan 14 16:03:24 2025] sd 4:0:0:0: [sdb] 15613952 512-byte logical blocks: (7.99 GB/7.45 GiB)
[di jan 14 16:03:24 2025] sd 4:0:0:0: [sdb] Write Protect is off
[di jan 14 16:03:24 2025] sd 4:0:0:0: [sdb] Mode Sense: 23 00 00 00
[di jan 14 16:03:24 2025] sd 4:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[di jan 14 16:03:24 2025]  sdb: sdb1
[di jan 14 16:03:24 2025] sd 4:0:0:0: [sdb] Attached SCSI removable disk

Uit deze gegevens blijkt dat het doel bij mij opnieuw gekoppeld werd aan apparaat /dev/sdb. Let ook op het feit dat dit doel slechts een capaciteit van 7.45 GiB heeft. We kunnen dus niet zomaar de partitiestructuur van de bron overnemen. Gelukkig werd de partitiestructuur opgeslagen als een tekstbestand en dit kunnen we aanpassen met een teksteditor zoals nano:

dany@pindabook:~$ sudo nano /mnt/rpiproject.sdX.partition.table.txt
[sudo] wachtwoord voor root:

Dit is de partitiestructuur van de bron op een 64 GB USB stick:

 GNU nano 7.2        /mnt/rpiproject.sdX.partition.table.txt                   
label: dos
label-id: 0x60f95da8
device: /dev/sdX
unit: sectors
sector-size: 512

/dev/sdX1 : start=        8192, size=     1048576, type=c
/dev/sdX2 : start=     1056768, size=   119107584, type=83


^G Hulp      ^O Opslaan   ^W Zoeken    ^K Knippen   ^T Opdracht  ^C Positie
^X Afsluiten ^R Inlezen   ^\ Vervangen ^U Plakken   ^J Uitvullen ^/ Naar regel

Als we de bij de tweede partitie (laatste regel) de grootte verwijderen (size) zal de partitioneer opdracht sfdisk straks de resterende ruimte toekennen aan de tweede partitie. De laatste regel passen we aan en lijkt dan op:

/dev/sdX2 : start=     1056768, type=83

Sla de aanpassing op met de sneltoets Ctrl+o, gevolgt door Return. Verlaat de nano teksteditor met de sneltoets Ctrl+x.

Je kunt de doel SD kaart (USB stick) nu partitioneren met:

dany@pindabook:~$ sudo sfdisk /dev/sdb < /mnt/rpiproject.sdX.partition.table.txt
Checking that no-one is using this disk right now ... OK

Disk /dev/sdX: 7,45 GiB, 7994343424 bytes, 15613952 sectors
Disk model: SD  Transcend    
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x40b3de31

Old situation:

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdX1        8192 15613951 15605760  7,4G  e W95 FAT16 (LBA)

>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Script header accepted.
>>> Created a new DOS (MBR) disklabel with disk identifier 0x60f95da8.
/dev/sdX1: Created a new partition 1 of type 'W95 FAT32 (LBA)' and of size 512 MiB.
Partition #1 contains a vfat signature.
/dev/sdX2: Created a new partition 2 of type 'Linux' and of size 6,9 GiB.
/dev/sdX3: Done.

New situation:
Disklabel type: dos
Disk identifier: 0x60f95da8

Device     Boot   Start      End  Sectors  Size Id Type
/dev/sdX1          8192  1056767  1048576  512M  c W95 FAT32 (LBA)
/dev/sdX2       1056768 15613951 14557184  6,9G 83 Linux

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Nu het doel gepartitioneerd is, kunnen we de twee partities met FSArchiver terugzetten (restore):

dany@pindabook:~$ sudo fsarchiver restfs /mnt/rpiproject.fsa id=0,dest=/dev/sdX1 id=1,dest=/dev/sdX2
Statistics for filesystem 0
* files successfully processed:....regfiles=380, directories=2, symlinks=0, hardlinks=0, specials=0
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0
Statistics for filesystem 1
* files successfully processed:....regfiles=71941, directories=6814, symlinks=7227, hardlinks=404, specials=9
* files with errors:...............regfiles=0, directories=0, symlinks=0, hardlinks=0, specials=0

Opnieuw moet je geduld oefenen. Na het voltooien van het terugzetten, kan je de publieke netwerkmap afkoppelen met de opdracht:

dany@pindabook:~$ sudo umount /mnt/

En als laatste test verwijder je de doel SD kaart (of USB stick) veilig en plaats deze in een Raspberry Pi waarmee je jouw project en de terugezette reservekopie kunt testen. Het enige wat eigenlijk kon fout gaan was dat de doel SD kaart te weinig ruimte had om het project te bevatten.

Automatiseer deze procedure met behulp van een script om zo efficiënt reservekopieën te maken en terug te zetten. Zelfs naar doelen met meer of minder capaciteit.

Tasmota apparaten op het lokale netwerk scannen

Veel thuisnetwerken werken met DHCP. M.a.w. de op het netwerk aangesloten apparaten krijgen niet altijd hetzelfde IP adres. Indien je weet wat je zoekt en weet hoe het gezochte apparaat reageert op een bepaald specifiek bericht, kan je heel eenvoudig en snel het IP adres van het apparaat achterhalen.

Als voorbeeld maken we een script om alle Tasmota apparaten op het netwerk op te sporen. Tasmota apparaten reageren op opdrachten die je via HTTP verstuurt. op de Tasmota opdracht status 5 reageert een Tasmota apparaat met het doorgeven van zijn netwerk eigenschappen. Andere apparaten reageren niet als een Tasmota apparaat en kunnen we dus negeren. Het Tasmota antwoord bevat onder andere de Hostname van het apparaat. In het script gebruiken we dit om het IP adres te koppelen aan het Tasmota apparaat met zijn Hostname.

Met een teksteditor als nano:

dany@pindabook:~$ nano netwerkscan.sh

Voeren we het volgende script in:

 GNU nano 7.2                             netwerkscan.sh                                       
#!/bin/bash
# We scannen enkel de eerste 50 IP adressen.
# Vervang 50 door 254 om het volledige  netwerk te scannen.
for ip in {1..50}; do
 # Stuur een door de gezochte apparaten herkend bericht.
 status=$(wget -qO- http://$1.$ip/cm?cmnd=status%205)
 # Filter uit het antwoord de hostname (enkel bruikbaar voor Tasmota apparaten).
 hostname=$(echo $status | grep -o '"Hostname":"[^"]*' | grep -o '[^"]*$')
 # Indien het apparaat een zinnig antwoord gaf, drukken we het IP adres en de hostname af.
 if [ "$?" -eq 0 ]; then
   echo $1.$ip $hostname
 fi
done

^G Hulp        ^O Opslaan     ^W Zoeken      ^K Knippen     ^T Opdracht    ^C Positie
^X Afsluiten   ^R Inlezen     ^\ Vervangen   ^U Plakken     ^J Uitvullen   ^/ Naar regel

Sla de aanpassing op met de sneltoets Ctrl+o, gevolgt door Return. Verlaat de nano teksteditor met de sneltoets Ctrl+x.

Om te achterhalen in welk netwerk je werkt, kan je de volgende opdracht uitvoeren:

dany@pindabook:~$ ip -o -f inet addr show | awk '/scope global/ {print $4}' | sed 's/\(.*\)\..*/\1/'
192.168.168

Met dit gegeven, kunnen we het netwerk scannen op aangesloten Tasmota apparaten:

dany@pindabook:~$ bash netwerkscan.sh 192.168.168
192.168.168.5 tasmota-C4FF79-4873
192.168.168.8 tasmota-810EE4-2272
192.168.168.10 tasmota-512B63-1866
192.168.168.16 tasmota-A1C5E2-9955
192.168.168.21 tasmota-76D444-5772
192.168.168.33 tasmota-31F487-4810
192.168.168.34 tasmota-E629C3-7425
192.168.168.36 tasmota-CA6087-5182
192.168.168.38 tasmota-FB785D-7381
192.168.168.40 tasmota-142518-6567
192.168.168.42 tasmota-2E037A-5836
192.168.168.45 tasmota-BB98DF-7914
192.168.168.48 tasmota-FB020C-7615

Hoewel er netwerkscanners bestaan die zeer veel verschillende apparaten kunnen identificeren, werkt deze methode sneller. Dit komt vooral omdat je gericht zoekt.

Opruimen