[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

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.

 

 

-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

 

 

  • Like 5
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
59 minutes ago, i-B4se said:

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

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

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

@sonic6 Ich hätte da zwei Fragen zu einem Teil von deinem Script:

 

Quote

sudo "dd if=/dev/mmcblk0" | dd of=${BACKUP_PFAD}/${BACKUP_NAME}-${DATUM}.img bs=1MB


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

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

Link to comment
Posted (edited)

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 1
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.