Εύκολα byte per byte Backups για το Raspberry Pi ;

:uk: The English version from this article can be found there: (TBD)

Το άρθρο αυτό αποτελεί μέρος της σειράς Raspberry Pi Server, υποστηριζόμενο από την επίσημη αντιπροσωπία του Raspberry Pi στην Ελλάδα, το nettop.gr το οποίο με προμήθευσε με το Raspberry Pi 5 ώστε να δημιουργήσω περισσότερο περιεχόμενο για τις δυνατότητες και τα Project που μπορούν να τρέξουν self-hosted πάνω στο Raspberry Pi στα Ελληνικά. Ευχαριστώ πάρα πολύ το nettop.gr για την υποστήριξη!!!

Εύκολο Backup/Restore/Clone στο Raspberry Pi σας, byte προς byte

Ένας από τους μεγαλύτερους φόβους που επικρατεί όταν συντηρούμε έναν server σε κάποιο Raspberry Pi, ιδιαίτερα όταν χρησιμοποιούμε κάποια κάρτας SD, είναι το γεγονός του σχετικά χαμηλού προσδόκιμου ζωής των καρτών SD, αλλά και την ευπάθεια τους στο να “χτυπάνε” συγκριτικά ευκολότερα από τους μηχανικούς δίσκους ή SSD και να γίνονται corrupted.
Mε αυτό τον τρόπο, μπορεί ο τέλεια setuρισμένος server μας, να καταλήξει μη λειτουργικός και ενδεχομένως να πρέπει να τα στήνουμε και πάλι από την αρχή.
Επιπλέον, αυτή η λύση μπορεί να μας βοηθήσει να μεταβούμε σε έναν μεγαλύτερο αποθηκευτικό χώρο.

Συνεπώς, τα πολλαπλά Backups σε οποιαδήποτε ηλεκτρονική συσκευή κρίνονται αναγκαία

Λύσεις σχετικά με το backup υπάρχουν δεκάδες, από το rsync και το επίσημο εργαλείο SD Card Cloner που υπάρχει στα Accessories του Raspberry Pi OS, μέχρι και enterprise solutions εργαλεία.
image

Ωστόσο, προσωπικά ήθελα να εργαλείο οπού:

  1. Θα έφτιαχνε έναν τέλειο κλώνο της SD Card μου, byte προς byte, με τα partition στην ακριβώς την ίδια διάταξη, ως ένα εννιαίο αρχείο img, από τον υπολογιστή μου (χωρίς σύνδεση στο Raspberry Pi)
  2. Θα μείωνε σημαντικά το ρίσκο κάτι να ήταν αδύνατο να γίνει restore,
  3. Θα είχα πάντα ένα fixed size img αρχείο ως backup το οποίο θα έπιανε πάντα τον ίδιο χώρο ώστε να μπορούσα πιο εύκολα να κάνω management τα full disk backups μου,
  4. Να αποτελεί το κύριο backup του server μου ώστε να γίνει άμεσα λειτουργικός ως την απολύτως βασική υποδομή, ώστε μετά να κάνω με restore μόνο τα volumes του docker/podman οπού περιέχουν τα σημαντικά αρχεία των υπηρεσιών που τρέχουν στον server μου. Με αυτό το σύστημα, ο χρόνος για recover σε περίπτωση βλάβης και ανάγκης αποκατάστασης έχει δοκιμαστεί με τα BCP/DRP (πλάνα) οπού έχουν σχεδιαστεί προηγουμένως και είχα αποκατάσταση λειτουργίας σε λιγότερο από 15 λεπτά για αθροιστικά όλες τις υπηρεσίες που hostάρω (περισσότερα στους επόμενους οδηγούς).

Εδώ βλέπουμε παλιότερα img backups που κρατούνται στο αρχείο στο nextcloud, παρατηρούμε ότι είναι fixed size όλα τα αρχεία μιας και αντιγράφω πάντα την ίδια MicroSD (στα 59.5GB).

Δημιουργώντας το RaspberryPiDiskBackupClone.sh

Η διαδικασία που ακολουθώ είναι πάρα πολύ εύκολη, χρησιμοποιώντας το γνωστό εργαλείο dd.
Αφού πειραματίστηκα στην αρχή, τελικά δημιούργησα ένα scriptάκι που να πραγματοποιεί ακριβώς αυτή την δουλεία όσο το δυνατόν πιο αυτοματοποιημένα αλλά και με ένα βασικό UI, ώστε να μην χρειάζεται να θυμάμαι τίποτα!

Το script αυτό μπορεί να βρεθεί εδώ: random_unix_projects/RaspberryPiDiskBackupClone.sh at main · sv1sjp/random_unix_projects · GitHub

Το scriptάκι αυτό μπορεί να δουλέψει σε οποιοδήποτε Unix based σύστημα που έχει bash,dialog και dd. Ωστόσο μιας και το αρχείο που θα παραχθεί θα έχει μέγεθος ίσο με το μέγεθος του αποθηκευτικού χώρου που δημιουργείται το backup, για πολύ μεγάλους δίσκους, ενδεχομένως να μην θεωρείται βολικό.

Προσωπικά χρησιμοποιώ μία 64GB Micro SD κάρτα για το λειτουργικό και έχω δεύτερο μηχανικό δίσκο για τα υπόλοιπα αρχεία που είναι εκτός του βασικού συστήματος.
Φυσικά το scriptάκι δουλεύει και με USB sticks, HDD, SSD και NVMe δίσκους. Και οτιδήποτε άλλο ξέχασα σε συσκευή!! :slight_smile:

Οδηγίες Χρήσης:

Εισαγωγή

Αρχικά, για να εκτελέσουμε το script (αφού φυσικά το κατεβάσουμε) δίνουμε:

sudo bash RaspberryPiDiskBackupClone.sh

Υπενθυμίζεται ότι μιας και σκαλίζουμε partitions και συσκευές, απαιτούνται δικαιώματα root. Επίσης, θα πρέπει να έχουμε κάνει unmount την συσκευή μας από το σύστημα (προσοχή: όχι Eject)

Δημιουργώντας Ένα Backup:

Επιλέγουμε την πρώτη επιλογή που δημιουργεί backup

Έπειτα, θα πρέπει να επιλέξουμε τον αποθηκευτικό χώρο οπού θέλουμε να δημιουργήσουμε το backup. Το εργαλείο θα μας εμφανίσει αυτόματα όλες τις διαθέσιμες συσκευές/partitions καθώς και τον συνολικό τους αποθηκευτικό χώρο.
(Στο παραδειγμά μας, γράφουμε /dev/sda1 οπού είναι η SD κάρτα μας):

Τώρα γράφουμε την τοποθεσία οπού θέλουμε να αποθηκευτεί το backup.
Δεν χρειάζεται να εισάγουμε όνομα αρχείου, αυτό θα γίνει αυτόματα βάση την ημερομηνία της ημέρας μας.

Και αφού πατήσουμε πάλι Okay, θα ξεκινήσει να δημιουργείται το backup.
Θα πάρει αρκετή ώρα αν η SD σας είναι αρκετά μεγάλης αποθηκευτικότητας, οπότε εξοπλιστείτε με αρκετή υπομονή.

Μόλις ολοκληρωθεί το backup, θα εμφανιστεί αυτό εδώ το μήνυμα και το script θα ολοκληρώσει την εκτέλεσή του.

Στον φάκελο που επιλέξαμε θα δούμε να δημιουργείται το img backup αρχείο με
όνομα την ημερομηνία της ημέρας για ευκολότερη αποθήκευση.

6

Συμπίεση/Αποσυμπίεση του img backup αρχείου

Αν θέλουμε να γλυτώσουμε αποθηκευτικό χώρο αν το αρχείο img που δημιουργήθηκε πρακτικά έχει πολύ ελεύθερο χώρο εντός του που καταλαμβάνεται χωρίς λόγο, μπορούμε να το συμπιέσουμε δίνοντας σε ένα τερματικό επιπλέον:

tar -czvf backup_image.tar.gz /path/to/your/image.img

Αντίστοιχα, μπορούμε να αποσυμπιέσουμε εκτελώντας:

tar -xzvf backup_image.tar.gz -C /destination/path

Κάνοντας Restore σε ένα Backup:

Kάνουμε unmount την συσκευή που θέλουμε να κάνουμε restore από το σύστημα (προσοχή: όχι Eject)
Έπειτα, εκτελούμε και πάλι το script ως root:

sudo bash RaspberryPiDiskBackupClone.sh

Επιλέγοντας αυτή την φορά, την επιλογή για Restore:

Δίνουμε ως είσοδο το full path του backup αρχείου μας (control+v για επικόληση):
Στην περίπτωση μου, όπως είδαμε και πριν π.χ.:
/var/home/sv1sjp/Backups/TuxServerBackup_January_14_2024.img
Και σε επόμενο βήμα:


Επιπλέον, θα πρέπει να επιλέξουμε τον αποθηκευτικό χώρο οπού θέλουμε να επαναφέρουμε το backup. Το εργαλείο θα μας εμφανίσει αυτόματα όλες τις διαθέσιμες συσκευές/partitions καθώς και τον συνολικό τους αποθηκευτικό χώρο.

(Στο παραδειγμά μας, γράφουμε /dev/sda1 οπού είναι η SD κάρτα μας):

Βεβαιωνόμαστε ότι επιλέξαμε την σωστή συσκευή και ότι δεν έχουμε δεδομένα στην συσκευή οπού θέλουμε να επαναφέρουμε από το img αρχείο διότι θα πραγματοποιηθεί format άρα απώλεια σε ο,τι δεδομένα ήταν αποθηκευμένα στη συσκευή αυτή!!

Και περιμένουμε να ολοκληρωθεί η επαναφορά. Μόλις μας εμφανιστεί το αντίστοιχο μήνυμα, είμαστε έτοιμοι να αφαιρέσουμε την SD από τον υπολογιστή μας και να την τοποθετήσουμε στο Raspberry Pi μας και να bootάρουμε!

Επαναφορά του Backup μέσω του επίσημου Raspberry Pi Imager Tool

Το img αρχείο που δημιουργήθηκε από την εκτέλεση του script, μπορεί πολύ εύκολα να γίνει restore με το Raspberry Pi Imager Tool από την επίσημη Raspberry Pi. Το εργαλείο αυτό είναι διαθέσιμο και στα Windows αλλά και μέσω snap,flatpak και παραδοσιακά μέσω των package managers (ενδεικτικά για Debian/Ubuntu):

sudo apt install rpi-imager

Μόλις τρέξουμε το Raspberry Pi Imager θα μας πάει σε αυτό το μενού:
12

Στο πρώτο μενού επιλέγουμε το Raspberry Pi οπού έχουμε:
Screenshot from 2024-01-14 16-42-49

Έπειτα στο Choose OS , επιλέγουμε Use custom.
13

Και επιλέγουμε το αρχείο backup μας:
14

Έπειτα, επιλέγουμε την SD στην οποία θέλουμε να γίνει το recover:
15

Στο Use OS customization επιλέγουμε No .
16

Βεβαιωνόμαστε ότι επιλέξαμε την σωστή συσκευή για να πραγματοποιηθεί το restore και επιλέγουμε Yes.
17

Περιμένουμε κάποια ώρα και είμαστε έτοιμοι με μία λειτουργική SD κάρτα, να την τοποθετήσουμε στο Raspberry Pi μας.

Επίλογος

Τα Backups έχουμε μία τάση να τα παραμερούμε, ωστόσο σε περίπτωση προβλήματος, θα μας σώσουν πολύ περισσότερες ώρες αποκατάστασης από τον χρόνο που θα χρειαστεί να πραγματοποιήσουμε τα backups. Και βεβαίως, πραγματοποιούμε πάντα τουλάχιστον 3 backups, τα οποία δεν πρέπει ποτέ να βρίσκονται συνδεδεμένα στο ίδιο σύστημα/δίκτυο, πάντα offline το backup και πάντα και ένα backup σε διαφορετική τοποθεσία από τα υπόλοιπα για να αποτρέψουμε απώλεια δεδομένων σε περίπτωση πλυμμήρας/φωτίας/κλοπής.

~~~~~~~~~~~~~~~~ You have been warned! ~~~~~~~~~~~~~~~~ 
4 «Μου αρέσει»

Συγχαρητήρια @sv1sjp και συγχαρητήρια στην nettop.gr για την επιλογή της
Όσοι έχουμε rpi χρειαζόμαστε πολύ τέτοιους οδηγούς.
Θέλουμε και έναν οδηγό για δημιουργία τοπικού cloud με rpi και πρόσβαση απομακρυσμένη, με port forwarding κλπ. και domain.

1 «Μου αρέσει»

Γιατί όχι και λίγο gzip στο 6 ξέρω γω… Δεν θα αργούσε, γιατί έτσι μπορεί να πιάνεις 5gb και έχεις 60gb image. Αμαρτία χώρου :sweat_smile: [είδα παρακάτω το αναφέρεις]

Προτείνω κάπου να πεις “source” device / disk / partition και εκεί που θα πάει “target” path, για να πέφτει και στο ανάλογο σχετικό-λεξικό, ή έστω folder picker παίζει ;

Νομίζω δέχεται και συμπιεσμένα, το έχεις δοκιμάσει;

1 «Μου αρέσει»

Το Nextcloud που τρέχω έχει στηθεί βάση αυτού από τον @Ippo_Cratis με πρόσθετα δικά μου οπού βρίσκονται ήδη στο οδηγό από σχόλια μου:

Ίσως θέλει μία μετονομασία το άρθρο και μετακίνηση στην νέα στήλη “Άρθρα και Οδηγοί - Raspberry Pi”.


@SomniusX

Όπως είπα και στο post, ο κύριος λόγος είναι για να υπάρχει predefined χώρος ώστε να έχω πάντα χώρο για 2 imgs backup. Αν συμπιέσω, κάποια στιγμή θα αρχίσουν να μαζεύονται junk files και στο επόμενο backup, θα έχω θέμα :slight_smile: .

Είμαι συνδεδεμένος με 1Gbps ethernet τοπικά στο γραφείο μου, οπότε στην πραγματικότητα δεν μου είναι και κάτι τόσο ακραίο.

3 «Μου αρέσει»

Εγώ πάντα έκανα backup με dd και έκανα και τον σταυρό μου (αν και δεν πιστεύω, αλλά ποτέ δεν ξέρεις…).
Δεν του βγήκε το παρατσούκλι “disk destroyer” για πλάκα…

2 «Μου αρέσει»