Backup σε εξωτερικό δίσκο χωρίς ZFS; Που πας χωρίς το κρυφό σου όπλο!

Ήρθε η μεγάλη μέρα όπου θα χρησιμοποιήσουμε εξωτερικούς δίσκους, διαμορφωμένους σε ZFS mirror για backup των αρχείων μας… με ολίγη κρυπτογράφηση. Στο τέλος θα έχουμε και εφαρμογή που αυτοματοποιεί την διαδικασία… Τι, έτσι θα σας άφηνα ;

Προφανώς και σας έχω ζαλίσει μέχρι τώρα για το πόσο σούπερ είναι το ZFS, πόσο μπροστά από την εποχή του είναι, πόσο αξιόπιστο είναι και πόσο, ακόμα και τώρα, δεν υπάρχει σύστημα αρχείων που μπορεί να το ανταγωνιστεί… Το μόνο πρόβλημα του ZFS είσαι εσύ… εγώ.. και ο άμπαλος ενθουσιώδης χρήστης που θα πάει να το χρησιμοποιήσει σε production χωρίς να έχει αφιερώσει χρόνο σε διάβασμα, σε δοκιμές και πιλοτική χρήση του ZFS. Μόλις γίνει η χαζομάρα… «ε… μεγάλη απάτη το ZFS και ο cerebrux»

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

Διαφημίσεις

Μα δεν έχω πολλούς δίσκους για ZFS…

Το ZFS είπαμε ότι είναι είναι συχνά η καλύτερη επιλογή για αποθήκευση αρχείων όταν η ακεραιότητα των δεδομένων είναι κρίσιμη. Αυτό γιατί, το ZFS υπολογίζει ένα άθροισμα ελέγχου (checksum) για κάθε μπλοκ δεδομένων που είναι γραμμένο σε μια μονάδα δίσκου και συγκρίνει αυτό το άθροισμα ελέγχου όταν τα δεδομένα διαβάζονται ξανά στη μνήμη. Σε περίπτωση που βρει αλλοίωση τότε αρχίζει η «αυτοΐαση».

Στον σημερινό οδηγό θα σας δείξω πως χρησιμοποιούμε δυο εξωτερικούς δίσκους σε ZFS mirror και πως κάνω καθημερινό backup των αρχείων μου. Σε περίπτωση που δεν έχετε δυο δίσκους αλλά έναν, δεν πειράζει… δεν αλλάζει τίποτα στις οδηγίες (εκτός από τα σημεία που χρησιμοποιώ διαδρομές δυο δίσκων).

Ναι αλλά για να δουλέψει η αυτοΐαση δεν θα πρέπει να το χρησιμοποιώ 2 ή και περισσότερους δίσκους; Δεν μπορώ να εκμεταλλευτώ το ZFS σε μονούς δίσκους;

Πράγματι χάνεις την αυτο-ίαση, αλλά εξακολουθείς να κερδίζεις σε όλα τα υπόλοιπα προαιρετικά χαρακτηριστικά που μπορείς να ενεργοποιήσεις όπως η αυτόματη συμπίεση, αυτόματη κατάργηση διπλότυπων, στιγμιότυπα, zvols, κρυπτογράφηση, η αποστολή των ZFS Datasets σε άλλους/απομακρυσμένους δίσκους κ.λπ. Άρα, όχι, δεν είναι «εντελώς άσκοπο». Απλώς πρέπει να κατανοήσεις τους περιορισμούς της λύσης σε αυτήν τη διαμόρφωση σε σχέση με πολλαπλές μονάδες δίσκου που βρίσκονται σε κατοπτρική ή άλλη διαμόρφωση RAID (όπως κάναμε σε αυτό το λινκ) όπου οποιαδήποτε διαπιστωθείσα βλάβη επιδιορθώνεται αυτόματα.

Οπότε αν για την συνέχεια του οδηγού έχεις έναν μόνο εξωτερικό δίσκο δεν πειράζει συνέχισε. Σε περίπτωση που θέλεις να πάρεις φθηνούς δίσκους για πιλοτική χρήση, τότε προαιρετικά, μπορείς να στηρίξεις το cerebrux αγοράζοντας τους επιπρόσθετους δίσκους από τον παρακάτω σύνδεσμο – κουπόνι:

Διαθέσιμες επιλογές 160GB/250GB
🎉 Τιμή κουπονιού[11,19€]
👉 link: https://temu.to/k/ezb3xlrvhsv
⚠️ Η έκπτωση μπορεί να διαφέρει, ανατρέξτε στην εμφάνιση της σελίδας.

Η δημιουργία μονάδων δίσκου ZFS δεν είναι δύσκολη. Ωστόσο, υπάρχουν σημαντικές λεπτομέρειες που απαιτούν προσοχή, ιδιαίτερα για εξωτερικούς δίσκους. Μόλις δημιουργηθούν, η διαχείριση μονάδων δίσκου ZFS είναι εξαιρετικά εύκολη.

Προετοιμασία των εξωτερικών δίσκων

Υπάρχουν πολλοί διαφορετικοί τρόποι για να κρατάτε 2 ή περισσότερους δίσκους σε μια θήκη, είτε σε κάποιο NAS, είτε σε enclosure, είτε σε docking station είτε σε κάποιο DIY σύστημα. Αυτό είναι δικό σου θέμα και δεν μας απασχολεί εδώ. Προσωπικά έχω και σε δικτυακό NAS και σε docking station.

Για το παρόν όμως οδηγό θα χρησιμοποιήσω το docking station με 2 δίσκους το οποίο συνδέεται με USB στον υπολογιστή μου. Σύνδεσε το USB στον υπολογιστή σου για να ξεκινήσουμε.

Προειδοποίηση: η ακόλουθη διαδικασία θα καταστρέψει όλα τα αρχεία στην εξωτερική μονάδα δίσκου. Βεβαιώσου ότι γνωρίζεις ποια μονάδα είναι η εξωτερική μονάδα.

Αφού το συνδέσεις, χρησιμοποίησε το πρόγραμμα Gparted για να εντοπίσεις την εξωτερική μονάδα δίσκου. Αυτή δεν πρέπει να έχει partitions και όλος ο χώρος θα πρέπει να είναι unallocated. Αφαίρεσε τα partitions εάν είναι υπάρχουν οπότε και η κατάσταση του δίσκου/ων θα πρέπει να μοιάζει όπως η παρακάτω εικόνα.

Εάν ξεκινάς με μια νέα αχρησιμοποίητη μονάδα δίσκου, πρέπει να δημιουργήσεις έναν πίνακα διαμερισμάτων GPT. Αυτό μπορεί να γίνει χρησιμοποιώντας το Gparted: Συσκευή > Δημιουργία πίνακα διαμερισμάτων

Δημιουργία ZFS pool

Εφόσον ολοκλήρωσες την προετοιμασία του δίσκου αλλά και έχεις κάνει τις ασκήσεις που έγραψα στο δεύτερο μέρος (ναι… ξέρεις ότι μιλάω για εσένα…) ήρθε η ώρα να χρησιμοποιήσεις αυτά που έμαθες σε κανονικούς δίσκους.

Η δουλειά μας τώρα θα γίνεται στο τερματικό οπότε βρες τα ονόματα των δίσκων με την εφαρμογή lsblk

lsblk

Πολύ πιθανόν να είναι /dev/sdb και /dev/sdc. Οπότε πάμε να φτιάξουμε μαι ομάδα (pool) με όνομα zones από αυτούς τους δύο δίσκους οι οποίοι θα είναι κατοπτρικοί (ότι αντιγράφουμε στον έναν θα πηγαίνει αυτόματα στον άλλον)

sudo zpool create zones mirror /dev/sdb /dev/sdc 

αν έχεις έναν δίσκο για σένα και μόνο για εσένα η εντολή θα είναι :

sudo zpool create zones /dev/sdb 

Αυτό ήταν… πραγματικά. Θα μπορούσες να σταματήσεις εδώ και να μην συνεχίσεις. Είναι έτοιμο για να αντιγράψεις αρχεία. Το ZFS σου θα το βρεις στην διαδρομή στο /zones.

Όμως δεν είναι κρίμα να χάσεις όλα αυτά που μπορείς να δοκιμάσεις ; Όπως κρυπτογράφηση… συμπίεση κλπ;

Η ονομασία των συνδεδεμένων δίσκων

Πάρε μια ανάσα και πάμε πιο βαθιά…

Δες λίγο το αποτέλεσμα του lsblk πάλι

Το pool σου δημιουργήθηκε με mirroring των sdb1 και sdc1 partitions οπότε αυτά μας ενδιαφέρουν αφού τα άλλα partitions είναι του ZFS και των μαγικών που κάνει.

Όπα… για κάτσε μισό λεπτό…

… νομίζω ότι υπάρχει ένα μικρό προβληματάκι με αυτή την προσέγγιση ονομάτων. Τι θα συμβεί εάν κάποια μέρα θέλεις να συνδέσεις αυτό το zpool σε άλλο μηχάνημα; Στο άλλο μηχάνημα, η μονάδα δίσκου που περιέχει το pool μπορεί να εκχωρηθεί σε sdd1, sde1 και όχι όπως το είχαμε φτιάξει στην αρχή… Θα βρεθεί το pool μας; Αυτό είναι ένα υπαρκτό πρόβλημα με τις εξωτερικές μονάδες δίσκου.

Ευτυχώς, υπάρχει μια εύκολη λύση την οποία ακολουθούν τα «μεγάλα παιδιά» σε storage servers για να ξέρουν ποιος δίσκος πνέει τα λοίσθια και πρέπει να αντικατασταθεί. Αντί λοιπόν να αναφερόμαστε στη θέση του pool με το κοινό όνομα του διαμερίσματος sdb1, θα αναφερθούμε σε αυτήν με ένα όνομα που περιέχει τον σειριακό αριθμό της μονάδας δίσκου το οποίο είναι μοναδικό για τον δίσκο.

Ο σειριακός αριθμός δεν θα αλλάξει ανεξάρτητα από το μηχάνημα στο οποίο είναι συνδεδεμένη η μονάδα. Θα είναι πάντα ο ίδιος με τον σειριακό αριθμό που είναι τοποθετημένη στην ετικέτα της μονάδας δίσκου. Στο Linux μπορούμε να δούμε αυτές τις ονομασίες στον φάκελο /dev/disk/by-id

ls -alF /dev/disk/by-id | grep usb

Tο όνομα που με ενδιαφέρει είναι αυτών των δίσκων που βρίσκονται ως συντόμευση (softlink) προς το sdb1 και sdc1 (είναι τα part1 -> sdc1 κλπ). Το όνομα περιέχει τον τύπο της μονάδας δίσκου, τον αριθμό μοντέλου, τον σειριακό αριθμό και τον αριθμό διαμερίσματος.

Παράδειγμα οι δικοί μου δίσκοι εμφανίζονται ως

  • usb-ST950042_0AS_00A1234567C4-0:0-part1 -> ../../sdb1
  • usb-TOSHIBA_MQ01ABF050_00A1234567C4-0:1-part1 -> ../../sdc1

Άρα με ενδιαφέρει να δω ένα όνομα τύπου ΧΧΧΧΧΧ-0:0-part1 ->../../sdb1 για να δω πως είναι διασυνδεδεμένο το pool μου.

Πάμε τώρα να επαναχαρακτηρίσουμε το διαμέρισμα του pool μας με το by-id όνομα του για να μην έχουμε θέμα στο μέλλον. Για να το κάνουμε αυτό θα χρησιμοποιήσουμε ένα κόλπο. Αυτό θα το κάνουμε μόνο μία φορά.

Εξάγω το pool από το σύστημά μου

sudo zpool export zones

Τέλος είναι καλό να αποσυνδέσεις και να απενεργοποιήσεις τους δίσκους και μετά να συνδέσεις ξανά το USB. Μέχρσι στιγμής, έκανα αποσύνδεση του pool και τώρα θα το επανασυνδέσω με το label του:

sudo zpool import \
-d /dev/disk/by-id/usb-ST950042_0AS_00A1234567C4-0:0-part1 \
-d /dev/disk/by-id/usb-TOSHIBA_MQ01ABF050_00A1234567C4-0:1-part1 \
zones -N

μετά τσεκάρω την κατάσταση:

zpool status

Η εντολή κατάστασης του zpool (zpool status) θα πρέπει να δείχνει ότι το pool αναφέρεται τώρα με το by-id όνομά του. Από εδώ και πέρα θα χρησιμοποιείς πάντα το import όπως η παραπάνω όταν θέλεις να εισαγάγεις το pool σου. Ποτέ μην χρησιμοποιήσεις ξανά ένα κοινό όνομα όπως το sdb1.

Με λίγα λόγια όπως θα σου δείξω παρακάτω, ΔΕΝ ΥΠΑΡΧΕΙ ΑΣΦΑΛΗ ΚΑΤΑΡΓΗΣΗ στο ZFS με δεξί κλικ. Σοβαρέψου. !! Η αποσύνδεση πρώτα γίνεται με εξαγωγή του ZFS pool και μετά απενεργοποίηση των δίσκων

Προσθήκη συμπίεσης στο pool μας

Πριν ξεκινήσουμε να αντιγράφουμε αρχεία στο pool μας, θα δοκιμάσουμε μερικές επιλογές που παρέχει το ZFS. Ένα από αυτά είναι το compression. Μπορείς να προσθέσεις συμπίεση στο pool σου και σε ενθαρρύνω να το κάνεις. Μην ανησυχείς ότι η συμπίεση θα επιβραδύνει την ταχύτητα ανάγνωσης/εγγραφής των αρχείων. Στις περισσότερες περιπτώσεις, η συμπίεση επιταχύνει πραγματικά έναν δίσκο ZFS. Αυτό οφείλεται στο γεγονός ότι η ενίσχυση της επίδοσης μέσω του μειωμένου μεγέθους αρχείου αντισταθμίζει το «κόστος» επίδοσης της συμπίεσης/αποσυμπίεσης των αρχείων.

Η μόνη περίπτωση που μπορεί να μην θέλεις να χρησιμοποιήσεις συμπίεση είναι όταν τα περισσότερα από τα δεδομένα σου είναι φωτογραφίες ή βίντεο. Ο αναλογία συμπίεσης για αυτόν τον τύπο δεδομένων είναι χαμηλός για όλα τα συστήματα αρχείων, συμπεριλαμβανομένου του ZFS. Σε αυτήν την περίπτωση, η συμπίεση δεν θα μειώσει σημαντικά το μέγεθος των δεδομένων.

Τέλος πάντων για να ενεργοποιήσεις σε «ριζικό» επίπεδο την συμπίεση όλων των DATASETS (φακέλων – ομάδων φακέλων – συστημάτων αρχείων… θα τα πούμε παρακάτω) που μπορεί να δημιουργήσεις τρέχεις:

sudo zfs set compression=on atime=off zones

με το παραπάνω ενεργοποιούμε συμπίεση και απενεργοποιούμε την ενημέρωση των timestamp πρόσβασης για την ελαχιστοποίηση του I/O:

  • compression=on
  • atime=off

Αυτό ήταν. Από εδώ και πέρα όσες εγγραφές γίνουν στο pool θα συμπιεστούν. Αν όμως κοτέψεις… και δεν το κάνεις τώρα αλλά να το κάνεις στο μέλλον, να θυμάσαι ότι τα παλιά δεδομένα δεν θα συμπιεστούν αλλά μόνο αυτά που εγγράφηκαν στο pool μετά την ενεργοποίηση.

An θέλεις να μάθεις και άλλες παραμέτρους διάβασε το επίσημο εγχειρίδιο: OpenZFS Workload Tuning

Ομαδοποίηση, οργάνωση αρχείων και κρυπτογράφηση

Μέχρι στιγμής δουλεύουμε με το ριζικό pool ονόματι zones και δεν χρησιμοποιήσαμε κάποιου είδους ZFS partition ή διαμέρισμα. Είχαμε αναφερθεί στα προηγούμενα άρθρα για τα DATASETS και εδώ θα θυμίσουμε ότι αποτελούν ένα τύπο δεδομένων στον οποίο τοποθετείς τα αρχεία σου.

Όταν διαβάζεις για το ZFS στο Διαδίκτυο, οι όροι «datasets» και «σύστημα αρχείων» χρησιμοποιούνται συχνά ως συνώνυμα, κάτι που μπορεί να προκαλέσει σύγχυση. Ένα «σύστημα αρχείων» ZFS είναι στην πραγματικότητα και αυτό ένας τύπος δεδομένων. Άλλοι τύποι περιλαμβάνουν π.χ. τα στιγμιότυπα ενώ άλλα τους κλώνους που κάνεις με το ZFS. Επέλεξα να χρησιμοποιήσω τον γενικότερο όρο «dataset» αντί για «σύστημα αρχείων» για να είναι πιο κατανοητό.

Σε μπερδεύει ακόμα αυτό; Δεν έχει σημασία τόσο διότι σε εμάς τους τελικούς χρήστες εμφανίζονται ως φάκελοι. Με άλλα λόγια τα datasets μοιάζουν με τους κοινούς φακέλους στην διαδρομή /zpool/όνομα_φακέλου1, /zpool/όνομα_φακέλου2, /zpool/όνομα_φακέλου3 κλπ αλλά παρέχουν τρομερή ευελιξία. Ένα από τα ποιο σημαντικά είναι ότι μπορούν να έχουν τις δικές τους παραμέτρους όπως π.χ. την κρυπτογράφηση των δεδομένων.

Ένα άλλο είναι ότι μπορούμε να τα προσαρτήσουμε όπου μας βολεύει! Αυτό είναι σημαντικό ειδικά όταν χρησιμοποιείς κάποιο system backup λογισμικό όπως το TimeShift. Όταν το Timeshift κάνει ένα snapshot, αποκλείει αυτόματα τους καταλόγους /mnt και /media που είναι κοινά σημεία προσάρτησης για εξωτερικές μονάδες δίσκου. Άρα για να μην προκαλέσουμε πρόβλημα σε τέτοια λογισμικά καλύτερα είναι να χρησιμοποιούμε αυτές της διαδρομές για προσάρτηση του pool

Πάμε λοιπόν να αλλάξουμε το σημείο προσάρτησης της ριζας του pool μας και να το πάμε στο /mnt

sudo zfs set mountpoint=/mnt/zone zones 

Από εδώ και πέρα ό,τι datasets φτιάξουμε θα το βρούμε στην διαδρομή /mnt/zones/ δηλαδή θα κληρονομήσουν το νέο σημείο προσάρτησης. Πρόσεξες κάτι; Με το ZFS δεν χρειάζεται να ενημερώσουμε αρχεία FSTAB κλπ… Το zpool ξέρει που θα προσαρτήσει τα datasets…

Dataset για Backup

Φυσικά δεν είναι ωραίο να αποθηκεύεις αρχεία χύμα στο /mnt/zones. Το σωστό είναι, όπως βάζεις τα αρχεία σου σε φακέλους για να τα οργανώσεις έτσι πρέπει να οργανώσεις και το ZFS σου. Να φτιάχνεις ομάδες δηλαδή για διαφορετικές δουλειές.

Ας φτιάξουμε ένα νέο Dataset στο οποίο θα στέλνουμε τα backup μας.

sudo zfs create zones/backup
sudo chown $USER /mnt/zones/backup

Φτιάξαμε το Dataset μας και αυτόματα κληρονομεί την διαδρομή του ριζικού pool. Επίσης δώσαμε το δικαίωμα εγγραφής στον χρήστη μας.

Dataset για Απόρρητα αρχεία

Πριν προχωρήσουμε σε δημιουργία backup θα μιλήσουμε για την δυνατότητα κρυπτογράφησης. Θέλω λοιπόν μια ομάδα αρχείων με όνομα private_files να κρυπτογραφείται αυτόματα. Oπότε αν πέσει σε λάθος χέρια… να μην μπορεί κανείς να έχει πρόσβαση σε αυτά.

Να σημειώσω εδώ, ότι υπάρχει ένας εξαιρετικός λόγος να χρησιμοποιήσεις την εγγενή κρυπτογράφηση του ZFS. Ο λόγος είναι αυτό που ονομάζεται «raw send». Η δημιουργία αντίγραφου (replication) του ZFS είναι απίστευτα γρήγορη και αποτελεσματική — συχνά πολλές τάξεις μεγέθους ταχύτερη από τα ουδέτερα εργαλεία του συστήματος αρχείων, όπως το rsync — και η raw αποστολή καθιστά δυνατή όχι μόνο το replication κρυπτογραφημένων dataset και zvol, αλλά και χωρίς να εκτίθεται το κλειδί στο απομακρυσμένο σύστημα.

Τον ξαναλέω αργά για να το χωνέψουμε… με μια εντολή το ZFS μπορεί να στέλνει τμήματα του ή ολόκληρα zvol αλλού… Είτε αυτό το αλλού είναι σε άλλους δίσκους είτε είναι στο cloud. Αυτή η εντολή θα «αναπαράγει» block by block όλο το σύστημα αρχείων. Αυτό σημαίνει ότι μπορείτε να χρησιμοποιήσετε την αναπαραγωγή ZFS για να δημιουργήσετε αντίγραφα ασφαλείας των κρυπτογραφημένων δεδομένων σας σε μια μη αξιόπιστη τοποθεσία, χωρίς να ανησυχείτε για την ανάγνωση των προσωπικών σας δεδομένων. Με την raw send, τα δεδομένα σας αναπαράγονται χωρίς ποτέ να αποκρυπτογραφηθούν και χωρίς ο εφεδρικός στόχος να μπορεί ποτέ να τα αποκρυπτογραφήσει, ακόμα κι αν η ίδια η υπηρεσία έχει παραβιαστεί.

Επί του παρόντος όμως, δεν μας ενδιαφέρει να στείλουμε το ZFS μας κάπου αλλού. Εμείς θέλουμε ένα απλό Dataset που, όταν είναι un-mounted, τα αρχεία να είναι κρυπτογραφημένα:

sudo zfs create \
-o encryption=on \
-o keylocation=prompt \
-o keyformat=passphrase \
zones/private_data

Όταν δημιουργηθεί το dataset private_data, θα σου ζητηθεί να δώσεις ένα συνθηματικό. Η μέθοδος κρυπτογράφησης του dataset private_data είναι aes-256. Να θυμάσαι μόνο ότι η κρυπτογράφηση παρέχει ασφάλεια μόνο για «δεδομένα σε κατάσταση αδράνειας» (datasets που δεν είναι προσαρτημένα).

Όσον αφορά τις παραμέτρους που χρησιμοποίησα είναι οι πιο εύκολες. Στην πραγματικότητα μπορούμε να το πάμε τέρμα και να ορίσουμε, αλγόριθμο κρυπτογράφησης, αρχείο κλειδιού ως κρυπτογράφηση (αντί για συνθηματικό) κλπ. Όποιος θέλει φυσικά το ψάχνει παραπέρα.

Προσάρτηση των Datasets

Τώρα θέλω να δω τα dataset από τα οποία αποτελείται το pool μου :

Για να δω και την κατάσταση της προσάρτησης τους:

sudo zfs get mounted

Ωραία, έστω ότι κανένα dataset μας δεν είναι προσαρτημένο. Πως στο καλό το προσαρτάμε στο σύστημά μας για να μεταφέρουμε αρχεία σε αυτά;

Το ZFS κάνει την προσάρτηση/αποπροσάρτηση εξαιρετικά εύκολη υπόθεση. Κάθε dataset του ZFS προσαρτάται σύμφωνα με τις ιδιότητες που του έχουν εκχωρηθεί όπως ακριβώς κάναμε στην δημιουργία του. Με την προϋπόθεση ότι το pool μας είναι συνδεδεμένο, τότε για το backup dataset τρέχουμε:

sudo zfs mount zones/backup

αντιστοίχως για το dataset κρυπτογράφησης προσθέτουμε απλά την παράμετρο -l

sudo zfs mount -l zones/private_data

Τώρα μπορείς να διαβάσεις/εγγράψεις στα dataset σου τα οποία αν θυμάσε είναι στην διαδρομή /mnt/zones/. Να θυμίσω ότι τα dataset που προσαρτώνται για πρώτη φορά ανήκουν στο root. Θυμήσου να αλλάξεις τα δικαιώματα του.

Αποπροσάρτηση και απενεργοποίηση λειτουργίας των δίσκων

Για να γίνει μια «υγιής» αποσύνδεση των USB δίσκων θα πρέπει να ακολουθήσεις κάποιους κανόνες.

  1. Συγχρονίζεις δεδομένα της προσωρινής μνήμης

    sync
  2. Αποσυνδέεις τα dataset

    sudo zfs unmount -a
  3. Εξάγεις το pool

    sudo zpool export zones
  4. Απενεργοπηείς τους δίσκους
sudo udisksctl power-off \
-b /dev/disk/by-id/usb-ST950042_0AS_00A1234567C4-0:0-part1 \
-b /dev/disk/by-id/usb-TOSHIBA_MQ01ABF050_00A1234567C4-0:1-part1

Εναλλακτικά η απενεργοποίηση μπορεί να γίνεται και από την εφαρμογή Disks του Gnome

Η χρήση των παραπάνω βημάτων θεωρείται ως «βέλτιστη πρακτική». Ωστόσο, εάν παραλείψεις ή ξεχάσεις κάποια στιγμή κάποια από αυτά τα βήματα, το πιθανότερο είναι ότι θα την γλυτώσεις. Το ZFS είναι αρκετά στιβαρό και ανθεκτικό στην ανθρώπινη βλακεία… οπότε… χαλαρά.

Backup του /home/user στο ZFS

Φτάσαμε επιτέλους στο σημείο για το οποίο κάναμε τόση φασαρία… Να χρησιμοποιήσουμε το ZFS στους εξωτερικούς δίσκους για backup αρχείων. Ο καθένας φυσικά έχει τον τρόπο του και εγώ τον σωστό… :P

Για backup το σενάριο που ακολουθώ και θα δείξω εδώ είναι :

  • Έχω το ZFS pool μου στους εξωτερικούς δίσκους, όπως σου έδειξα
  • Όταν θέλω να κάνω backup το βράδυ, συνδέω το USB στο PC
  • Κάνω import το Pool και προσαρτώ το zones/backup
  • Χρησιμοποιώ το rsync για να αντιγράψω ΜΟΝΟ τις αλλαγές που έχουν γίνει στο /home/salih από την τελευταία φορά που έκανα backup (οπότε είναι σχεδόν στιγμιαίο)
  • Αποσυνδέω το pool και απενεργοποιώ τους δίσκους

Πάμε να στο δείξω βήμα βήμα. Συνδέω το USB στο PC και έπειτα εισάγω το pool:

sudo zpool import \
-d /dev/disk/by-id/usb-ST950042_0AS_00A1234567C4-0:0-part1 \
-d /dev/disk/by-id/usb-TOSHIBA_MQ01ABF050_00A1234567C4-0:1-part1 \
zones -N

Προσαρτώ το dataset που αφορά το backup:

sudo zfs mount zones/backup

Χρησιμοποιώ το rsync με παραμέτρους που με βολεύουν για να κάνω backup :

rsync --archive -hh \
--log-file=/tmp/zfsonusb_backup.log \
--delete-excluded \
--partial \
--info=stats1,progress2 \
--modify-window=1 \
--exclude-from=.rsync-home-exclude.txt \
~/ /mnt/zones/backup

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

Όταν τελειώσω αποσυνδέω το pool και τους δίσκους

sudo udisksctl power-off \
-b /dev/disk/by-id/ata-ST950042_0AS_00A1234567C4-0:0-part1 \
-b /dev/disk/by-id/ata-TOSHIBA_MQ01ABF050_00A1234567C4-0:1-part1

Πολύ φασαρία και πληκτρολόγηση ε;… Εδώ είναι που έρχεται η μαγεία του Shell (bash) Scripting

Εφαρμογή ΖfsOnUsb

Επειδή η τεμπελιά μπορεί να γίνει δημιουργική, όλη την παραπάνω διαδικασία μπορεί κάποιος να την αυτοματοποιήσει με ένα bash script. Αυτό έκανα λοιπόν και το ονόμασα με το … πολύ πρωτότυπο όνομα zfs on usb (τρέμε… μicrosoft…).

Τι κάνει αυτή η εφαρμογή; Μόλις την εγκαταστήσετε σας δίνει 4 επιλογές:

zfsonusb {import|export|list|backup|help}


Options:
  import   : Import the ZFS pool and mount datasets
  export   : Unmount the ZFS pool and power off external disks
  list     : List available disks in /dev/disk/by-id
  backup   : Backup your home folder to the ZFS pool
  help     : Show this help message

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

Ουσιαστικά θα χρειαστεί μετά την εγκατάσταση και πριν το χρησιμοποιήσετε για πρώτη φορά να κάνετε κάποιες ρυθμίσεις:

  1. Να έχετε ήδη ένα pool και να δηλώσετε το όνομά του στο αρχείο ~/.zfsonusb.conf στην μεταβλητή ZFS_POOL_NAME
  2. Να δηλώσετε τα labels των δίσκων που μετέχουν στο pool, στο αρχείο ~/.zfsonusb.conf στην λίστα DISKS
  3. Να ορίσετε ποιόν φάκελο θα κάνει backup στην μεταβλητή BACKUP_SOURCE και που θα το στείλει στην μεταβλητή BACKUP_DESTINATION
  4. Τέλος αν θέλετε, να επεξεργαστείτε το αρχείο ~/.rsync-home-excludes.txt και να αφαιρέσετε τις αγκύλες # από τα αρχεία που θέλετε να μην γίνονται (αγνοούνται) από το backup.

Το χρησιμοποιώ με την εξής σειρά όπως ακριβώς είχα πει στο σενάριο του backup. Άρα αφού συνδέσω το USB με τους δίσκους:

  1. zfsonusb import
  2. zfsonusb backup
  3. zfsonusb export
  4. … καληνύχτα…

Α!…, και θυμήσου! Το ZFS ΔΕΝ αντικαθιστά μια καλή στρατηγική δημιουργίας αντιγράφων ασφαλείας όπως έχω γράψει στο Vorta Borg | Αυτόματο backup αρχείων σε εξωτερικό δίσκο και δικτυακό δίσκο

Συντήρηση και παρακολούθηση υγείας του ZFS

Ωραία όλα αυτά αλλά πως εξετάζω την υγεία των αρχείων μου ; Υπάρχει ένα και μοναδικό εργαλείο ελέγχου υγείας του pool μας και ονομάζεται scrub

sudo zpool scrub zones

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

Μπορείς να ανοίξεις ένα τερματικό και να τρέξεις :

watch zpool status

Για να βλέπεις την πρόοδο. Αν για κάποιο λόγο θέλεις να το σταματήσεις θα τρέξεις:

sudo zpool scrub -s zones

Σε κάθε περίπτωση να ξέρεις ότι, αν το σταματήσεις δεν ξεκινάει από εκεί που έμεινε, αλλά ξεκινάει πάντα από την αρχή.

Η καλές πρακτικές αναφέρουν δύο πράγματα:

  • κράτα ΠΑΝΤΑ 20% ελεύθερο χώρο στο ZFS pool σου
  • κάνε ένα scrub την εβδομάδα

Για περισσότερες καλές πρακτικές, διάβασε το OpenZFS: General recommendations

Επίλογος και σύνοψη

Ας τα μαζέψουμε σιγά σιγά για να πάμε σπίτια μας. Τι κάναμε :

Φτιάξαμε το pool μας

sudo zpool create zones mirror /dev/sdb /dev/sdc

Αλλάξαμε τις ονομασίες

sudo zpool export zones
sudo zpool import \
-d /dev/disk/by-id/usb-ST950042_0AS_00A1234567C4-0:0-part1 \
-d /dev/disk/by-id/usb-TOSHIBA_MQ01ABF050_00A1234567C4-0:1-part1 \
zones -N

Ενεργοποιήσαμε συμπίεση

sudo zfs set compression=on atime=off zones

Αλλάξαμε το σημείο προσάρτησης σε νέα διαδρομή

sudo zfs set mountpoint=/mnt/zone zones

Φτιάξαμε δυο dataset για διαφορετικές δουλειές και τα προσαρτήσαμε

sudo zfs create zones/backup zones
sudo zfs create \
-o encryption=on \
-o keylocation=prompt \
-o keyformat=passphrase \
zones/private_data
sudo zfs mount zones/backup
sudo zfs mount -l zones/private_data

Κάναμε το backup μας και εξετάσαμε την υγεία του ZFS

sudo zpool scrub zones

Όταν τελειώσαμε, κάναμε εξαγωγή και τερματισμό της λειτουργίας των δίσκων. Ούφ !

Σε επόμενο άρθρο που θα αφορά τους πιο hardcore χρήστες και όχι το αθώο κοινό… θα χρησιμοποιήσουμε το ZFS… πιο επικίνδυνα…

Until next time… Εάν βρήκες αυτό τον οδηγό χρήσιμο και έμαθες κάτι και θεωρείς ότι αξίζει να με κεράσεις κάτι για τον χρόνο μου, μπορείς να το κάνεις μέσω του button:

Donate to project

Παραπομπές

7 σκέψεις σχετικά με το “Backup σε εξωτερικό δίσκο χωρίς ZFS; Που πας χωρίς το κρυφό σου όπλο!

  1. καλημερα,
    πολυ χρησιμος οδηγός για ασχετο, με το zfs, χρηστη

    ευχαριστω
    Δημητρης

    1. αυτο στο Arch sudo zfs create zones/backup zones χτυπαγε error οποτε το αλλαξα σε sudo zfs create zones/backup

    2. Έχεις απόλυτο δίκιο ! Εκ παραδρομής μπήκε το zones ενώ δεν έπρεπε. Το διόρθωσα. Ευχαριστώ για την επισήμανση !

    3. καλησπέρα,
      εκτελωντας το sudo zpool import -d /dev/disk/by-id/usb-Generic_STORAGE_DEVICE-0:0-part1 zones -N παιρνω το παρακατω μυνημα
      cannot import ‘zones’: I/O error
      Destroy and re-create the pool from a backup source.

      η αληθεια ειναι οτι το usb που ειχα χρησιμοποιησει το εσβησα/εγραψα/εσβησα και παει λεγοντας…
      οπου εσβησα=create partition table εν ολιγοις το εσκισα!

      βρηκακαποιες αναφορες για το πρόβλημα αλλα δεν βοηθησαν
      υπαρχει καποια λυση ή πρεπει να φτιαξω νεο pool ?

      ευχαριστω

    4. Το έσπασες στο ξύλο ρε συ ΧΑΧΑΧΑΧ
      Καλά κάνεις όμως γιατί έτσι μαθαίνεις. Η αλήθεια είναι αυτό που σου λέει το μήνυμα θα χρειαστεί να το φτιάξεις από κάποιο backup.

  2. Το έσπασες στο ξύλο ρε συ ΧΑΧΑΧΑΧ !!! οντως :)
    να σε ενημερωσω επισης οτι δεν υπαρχει backup
    ξεκινησα τον οδηγο από την αρχή αλλα ματαια :(
    σκεφτομουν μην υπαρχει καποιο συστημικο αρχείο που περιεχει σχετικες πληροφορίες οποτε σβηνοντας προσπερασω το πρόβλημα

    anyway
    ευχαριστω πολυ

Σου άρεσε το άρθρο; Πες την άποψή σου... έστω και Ανώνυμα: