[ANLEITUNG] User Script für Pi Image und Shrink per SSH


Recommended Posts

Hier ein kurzer Guide zu einem User Script um von einem Pi eine Sicherungsimage zu erstellen und zu verkleinern.

 

Da ich selbst recht neu mit Unraid unterwegs bin und total unerfahren im Bereich Linux, Termina, Befehle, etc... bitte ich Fehler zu entschuldigen und gerne zu Verbessern und/oder brauchbares zu ergänzen. 

 

Als Basis habe ich das Script von Lukas Knöller - hobbyblogging.de genommen und um ein paar Variablen und PiShrink ergänzt.

Das Script verbindet sich per SSH auf den Pi, erstellt ein Image davon und legt es im Backup Share ab. Danach werden überfällige Backups gelöscht und das erstellte Backup verkleinert.

 

-Backup Share als Ziel einrichten.

Falls mehrere Pi's gesichert werden sollen, empfehle ich für jeden Pi einen eigenen Unterordner im Share zu erstellen.

 

 

-Unterordner im Share erstellen:

Im Unraid Terminal folgenden Befehl ausführen

mkdir -p /mnt/user/DEIN-BACKUP-SHARE/PI-UNTERORDNER

 

 

-sshpass downloaden, /extra/ Ordner auf dem Stick erstellen, sshpass in den Ordner /extra/ verschieben und sshpass installieren:

Im Unraid Terminal folgenden Code ausführen.

wget https://packages.slackonly.com/pub/packages/14.2-x86_64/network/sshpass/sshpass-1.06-x86_64-1_slonly.txz && mkdir /boot/extra && mv sshpass-1.06-x86_64-1_slonly.txz /boot/extra/ && installpkg /boot/extra/sshpass-1.06-x86_64-1_slonly.txz

Alternative, falls die Quelle nicht erreichbar ist:

Spoiler
wget https://slack.conraid.net/repository/slackware64-current/sshpass/sshpass-1.09-x86_64-1cf.txz
 && mkdir /boot/extra && mv sshpass-1.06-x86_64-1_slonly.txz /boot/extra/ && installpkg /boot/extra/sshpass-1.09-x86_64-1cf.txz

 

 

Dadruch dass wir das sshpass im /extra/ Ordner des Unraid Sticks liegen haben, wird sshpass mit jedem Unraid Start installiert.

Wer das "Fix Common Problems" Plugin nutzt, wird nun eine Meldung bekommen, diese kann man mit dem Button rechts ignorieren:

image.thumb.png.0633af487d387463df6f63166514c4c5.png

 

 

-PiShrink download, verschieben nach /mnt/user/appdata/, ausführbar machen:

Im Unraid Terminal folgenden Code ausführen.

wget -O /mnt/user/appdata/pishrink.sh https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh && chmod +x /mnt/user/appdata/pishrink.sh

 

 

-User Script Plugin installieren:

image.thumb.png.ad0c39655d78765459323f6f7d0c3299.png

 

-User Script Plugin aufrufen und neue User Script erstellen:

image.png.18b4bc96213621500e37f50ccf3a5fff.png

 

-Script ins leere Feld kopieren und Variablen anpassen:

#!/bin/bash


#Variablen
PI_IP="XXX.XXX.XXX.XXX"
SSH_USER="PI-USER"
SSH_PW="DEIN-SUPER-PASSWORT-VOM-PI-USER"
BACKUP_PFAD="/mnt/user/DEIN-BACKUP-SHARE/PI-UNTERORDNER" #ohne / am Ende
BACKUP_ANZAHL="5"
BACKUP_NAME="pi_image"
SHRINK_SCRIPT_PFAD="/mnt/user/appdata/pishrink.sh"
DATUM="$(date +%Y%m%d)"

#Backup erstellen
sshpass -p ${SSH_PW} ssh ${SSH_USER}@${PI_IP} sudo "dd if=/dev/mmcblk0" | dd of=${BACKUP_PFAD}/${BACKUP_NAME}-${DATUM}.img bs=1MB

#Alte Sicherung löschen
pushd ${BACKUP_PFAD}; ls -tr ${BACKUP_PFAD}/${BACKUP_NAME}* | head -n -${BACKUP_ANZAHL} | xargs rm; popd

sync -f ${BACKUP_PFAD}

#shrink
${SHRINK_SCRIPT_PFAD} ${BACKUP_PFAD}/${BACKUP_NAME}-${DATUM}.img

Im falle von Raspberry Pi OS sollte der User "Pi" sein. Das Passwort habt ihr bei der Installation von Raspberry Pi OS selbst festgelegt.

Am Ende der Variablen BACKUP_PFAD darf kein "/" gesetzte sein, da dieses schon im Code enthalten ist.

 

Solltet Ihr "root" nutzen, oder das Script aufgrund von sporadischen erneutem Abfragen des Passwortes abbrechen, haben @dan4UR und @Anym001 vielleicht die Lösung für euch:

   root User

   Erneute Passwortabfrage bei sudo

 

-Script mit dem "SAVE CHANGES" Button abspeichern.

 

 

-Cron anpassen:

image.thumb.png.071db138810bed132d5f973853786d85.png

in meinem Beispiel läuft das Script zur 15. Minute in der 23. Stunde am 11. und 26. Tages jeden Monat, an egal welchem Wochentag.

Oder kurz: jeden 11. und 26. um 23:15Uhr.

Hilfe zu Cron: https://crontab.guru/

 

 

-Einstellungen unten mit dem Button "APPLY" sichern.

 

Wie Anfangs schon erwähnt, bin ich nicht sehr Erfahren und bitte um Rücksicht bei Fehlern.

Danke auch an @ich777, @alturismo und @Anym001 für Idee, Ratschläge, Testen und Wissen.

 

Ansonsten, Happy Backup!

 

 

 

*CHANGELOG*

25.08.2021 20:20 - Variable DATE hinzugefügt

30.11.2021 09:35 - Troubleshooting Ergänzung für root und sudo

26.12.2021 14:22 - Alternative Quelle für sshpass. Danke @mgutt

 

 

Edited by sonic6
  • Like 8
  • Thanks 1
Link to comment

Cooles Tutorial!

Eine Sache die mich daran ein wenig stört, dass das PW und der User in der Datei steht.

Ich hatte das über Public-Key-Authentifizierung gelöst. 

So kann man dann per 

ssh user@ip befehl.....

alles ausführen ohne die Daten hinterlegen zu müssen.

  • Like 1
Link to comment

Da ich mit sonic in Kontakt stand und ich ursprünglich vorhatte Pi's zu sichern kam dieses jetzt hier raus, ohne jeden Pi mit einem eigenen Skript zu versehen. Ebenso das Shrinken kann ruhig die unraid Kiste machen, da die vermeintlich mehr Power zur verfügung hat als der kleine Pi.

 

@i-B4se Wie würde das denn konkret aussehen, da die Frage glaub ich auch bei @sonic6 aufkam ?!

Link to comment

An eine Möglichkeit das Passwort nicht im Klartext ins Script zu packen, hatte ich auch schon gedacht.

 

Aber zum jetzigen Zeitpunkt sprachen zwei Gründe für mich dagegen:

1. Passwort als Klartext war sehr Einsteigerfreundlich und für diese Nachvollziehbar. Jemand der Fit in der Materie ist, wird das Script mit Leichtigkeit anpassen.

2. Es überstieg bisher einfach meine Fähigkeiten :D

  • Like 1
Link to comment
1 hour ago, dan4UR said:

@i-B4se Wie würde das denn konkret aussehen, da die Frage glaub ich auch bei @sonic6 aufkam ?!

Da gibt einige Tutorials.

Ich glaube 😅 ich habe das damals nach dieser Anleitung gemacht.
https://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/

Ansonsten einfach mal nach "SSH-Key-Authentifizierung" gucken.

Mittlerweile arbeite ich so nicht mehr. Der Backupserver hat Leserechte auf einige Ordner und "zieht" dann die Daten.  

 

1 hour ago, ich777 said:

Wäre auch möglich und wäre auch meine Lösung... aber kann man so oder so machen, denk mal drüber nach wieviele Passwörter in den Docker Templates gespeichert sind... :D

Stimmt, aber durch den Key wird es auch ein wenig einfacher :D

  • Like 1
Link to comment

nochmal vorweg:

Primär habe ich nur den Guide zusammen geschrieben und die Befehle zusammengetragen, um Variablen ergänzt und ausprobiert. Deswegen kann ich nur vermuten, warum die Befehle so sind, wie sie sind.

Sollte ich quatsch erzählen, bitte ich dass die von Jemanden der es "weiß", korrigiert wird.

 

55 minutes ago, Anym001 said:

Warum bs=1MB und nicht bs=4MB?

Das habe ich so aus dem Script von Lukas Knöller übernommen. Laut diesem Artikel schien mir keine Anpassung von nöten.

 

55 minutes ago, Anym001 said:

Warum Anführungszeichen nur über den if Befehl von dd und nicht über den kompletten dd Befehl?

Ich denke es liegt daran, dass das 

dd if=/dev/mmcblk0

 im Ziel ausgeführt wird, dann per pipe an 

dd of=${BACKUP_PFAD}/${BACKUP_NAME}-${DATUM}.img

 übergeben wird, welches lokal ausgeführt wird.

 

Edited by sonic6
  • Like 2
Link to comment
  • ich777 changed the title to [ANLEITUNG] User Script für Pi Image und Shrink per SSH

Leider komme ich an einer Stelle nicht weiter, bzw. wird garkein Backup erzeugt. Eine Datei im korrekten Pfad wird zwar angelegt aber eben mit 0kb.

 

Wenn ich das angepasste Skript ausführe erscheint folgendes:

Script location: /tmp/user.scripts/tmpScripts/Pihole_Backup/script
Note that closing this window will abort the execution of this script

0+0 records in
0+0 records out
0 bytes copied, 3.23965 s, 0.0 kB/s
/mnt/user/Backup/Pihole /
rm: missing operand
Try 'rm --help' for more information.
/
pishrink.sh v0.1.2
pishrink.sh: Gathering data ...
Error: The device /mnt/user/Backup/Pihole/pi_image-20210903.img is so small that it cannot possibly store a file system or partition table. Perhaps you selected the wrong device?
pishrink.sh: ERROR occurred in line 281: parted failed with rc 1
pishrink.sh: Possibly invalid image. Run 'parted /mnt/user/Backup/Pihole/pi_image-20210903.img unit B print' manually to investigate ...

 

Mit @sonic6 bereits getestet, ob ich überhaupt Zugriff per ssh habe und JA, habe ich. Sowohl per ssh als auch per sshpass. Sonderzeichen " # " im Passwort schließe ich aus, da ich ja Zugriff bekomme. Evtl. bereitet es ja Probleme im Skript ...

Flotte Überprüfung ob ich für diverse Dinge root Rechte bzw. Passwort benötige ergabt:

pi@UniPi:~ $ sudo crontab -e
no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
1. /bin/nano        <---- easiest
2. /usr/bin/vim.tiny
3. /bin/ed
Choose 1-3 [1]: 

(Ich weiss nicht inwieweit das helfen könnte, aber ich Poste es einfach mal) :D

 

Vielleicht kommt ja einer von euch schlauen Köpfen zur Lösung des Problems.

Link to comment
2 hours ago, dan4UR said:

Vielleicht kommt ja einer von euch schlauen Köpfen zur Lösung des Problems.

 

Das gleiche Problem hatte ich auch. 

Es liegt an der Rechtevergabe des benutzten Nutzers bzw. daran wenn ein sudo Befehl abgesetzt wird, er noch einmal das Passwort bestätigen muss. Somit wird der dd Befehl nicht ausgeführt und läuft auf Fehler. 

 

Lösung: (Gegenteil hier ausführlich erklärt)

88d72b17e5a303098f22cc327c42abdc05a35d58a3ebbb1c41c26a69287a.thumb.png.8a1a2dbe9a1a7304910b48890ea16b1b.png

 

Kurzfassung: 

1. Einloggen in deinen Pi

2. Befehl "sudo visudo" ausführen

3. Folgende Zeile hinzufügen "pi ALL=(ALL) NOPASSWD: ALL" -> pi durch den gewünschten Nutzer ersetzen.

(Befehle natürlich ohne "")

Edited by Anym001
  • Thanks 2
Link to comment
  • 2 months later...

Kleines Update meinerseits.

 

Ich hatte bei zwei RPi das Problem, dass das Skript einfach nicht anlaufen wollte (hierbei handelte es sich um Mediaplayer mit Libreelec die von Haus aus nur einen Nutzer haben und das ist der root Nutzer). Hier ein kleiner Workaround wie es jetzt ohne Probleme ging.

 

Zum einen muss man bevor man das Skript das erste mal ausführt sich im unraid internen Terminal (oben rechts in der Statusleiste) per ssh mit dem Pi verbinden.

ssh root@pi-ip Adresse

Dies hat zur folge, dass der Host Key Fingerprint generiert wird und somit der Key zur Identifizierung bzw. Verifizierung auf unraid gebildet wird.

Das ganze bestätigt man mit

yes

und gibt im Anschluss das Passwort für den User root ein.

Dann sollte man soweit erfolgreich verbunden sein.

 

Danach einfach das Fenster mit zweimaliger Eingabe von

exit

schließen und beenden.

 

Um jetzt das Backupskript noch lauffähig zu machen bedarf es noch einer kleinen Modifikation vom Skript.

An der Stelle:

#Backup erstellen
sshpass -p ${SSH_PW} ssh ${SSH_USER}@${PI_IP} sudo "dd if=/dev/mmcblk0" | dd of=${BACKUP_PFAD}/${BACKUP_NAME}-${DATUM}.img bs=1MB

muss das "sudo" vor dem dd rausgenommen werden, dass dies dann so aussieht:

#Backup erstellen
sshpass -p ${SSH_PW} ssh ${SSH_USER}@${PI_IP} "dd if=/dev/mmcblk0" | dd of=${BACKUP_PFAD}/${BACKUP_NAME}-${DATUM}.img bs=1MB

und siehe da. Das Skript läuft ohne murren durch.

 

Vielleicht kann der ein oder andere Experte vielleicht noch erläutern woran es genau liegt, aber root und sudo scheinen sich nicht zu mögen und das Logfile deutet leider auch nicht darauf hin, dass genau hier der Fehler liegt.

  • Thanks 2
Link to comment
8 minutes ago, dan4UR said:

Vielleicht kann der ein oder andere Experte vielleicht noch erläutern woran es genau liegt, aber root und sudo scheinen sich nicht zu mögen und das Logfile deutet leider auch nicht darauf hin, dass genau hier der Fehler liegt.

Ich bin kein Experte, aber ich vermute einfach mal, dass es daran liegt, das man als root ja schon "root" ist und man sich selbst nicht mehr als Superuser identifizieren muss?

Ich muss ja als "normaler" Nutzer (mit root Rechten) sudo nur für Befehle verwenden, die Root oder Superuser Privilegien erfordern und mich auch dabei authentifizieren.

 

 

Danke auf jeden Fall für die Zusammenfassung, werde diese morgen im Tutorial ergänzen.

Link to comment
  • 4 weeks later...
On 8/25/2021 at 6:01 PM, sonic6 said:

 

wget https://packages.slackonly.com/pub/packages/14.2-x86_64/network/sshpass/sshpass-1.06-x86_64-1_slonly.txz && mkdir /boot/extra && mv sshpass-1.06-x86_64-1_slonly.txz /boot/extra/ && installpkg /boot/extra/sshpass-1.06-x86_64-1_slonly.txz

Hi!

Wollte gerade das Script testen, bis jetzt hatte ich immer ein Script auf dem PI, aber über Unraid gefällt mir das viel besser.

Leider ist wohl der Link down?

Connecting to packages.slackonly.com (packages.slackonly.com)|2602:ffc5::ffc6:f752|:443... failed: Network is unreachable.

 

Gibt es eine andere Möglichkeit diese Datei runterzuladen?

 

Grüße 

Vanix

 

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.