Ήρθε η μεγάλη μέρα όπου θα χρησιμοποιήσουμε εξωτερικούς δίσκους, διαμορφωμένους σε 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 εάν είναι υπάρχουν οπότε και η κατάσταση του δίσκου/ων θα πρέπει να μοιάζει όπως η παρακάτω εικόνα.
![](https://cerebrux.net/wp-content/uploads/2024/09/image-25.png?w=776)
Εάν ξεκινάς με μια νέα αχρησιμοποίητη μονάδα δίσκου, πρέπει να δημιουργήσεις έναν πίνακα διαμερισμάτων GPT. Αυτό μπορεί να γίνει χρησιμοποιώντας το Gparted: Συσκευή > Δημιουργία πίνακα διαμερισμάτων
![](https://cerebrux.net/wp-content/uploads/2024/09/image-26.png?w=662)
Δημιουργία 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 πάλι
![](https://cerebrux.net/wp-content/uploads/2024/09/image-28.png?w=396)
Το 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
![](https://cerebrux.net/wp-content/uploads/2024/09/image-29.png?w=1024)
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 μου :
![](https://cerebrux.net/wp-content/uploads/2024/09/image-31.png?w=856)
Για να δω και την κατάσταση της προσάρτησης τους:
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 δίσκων θα πρέπει να ακολουθήσεις κάποιους κανόνες.
- Συγχρονίζεις δεδομένα της προσωρινής μνήμης
sync
- Αποσυνδέεις τα dataset
sudo zfs unmount -a
- Εξάγεις το pool
sudo zpool export zones
- Απενεργοπηείς τους δίσκους
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
![](https://cerebrux.net/wp-content/uploads/2024/09/image-32-edited.png)
Η χρήση των παραπάνω βημάτων θεωρείται ως «βέλτιστη πρακτική». Ωστόσο, εάν παραλείψεις ή ξεχάσεις κάποια στιγμή κάποια από αυτά τα βήματα, το πιθανότερο είναι ότι θα την γλυτώσεις. Το 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:
Ουσιαστικά θα χρειαστεί μετά την εγκατάσταση και πριν το χρησιμοποιήσετε για πρώτη φορά να κάνετε κάποιες ρυθμίσεις:
- Να έχετε ήδη ένα pool και να δηλώσετε το όνομά του στο αρχείο
~/.zfsonusb.conf
στην μεταβλητήZFS_POOL_NAME
- Να δηλώσετε τα labels των δίσκων που μετέχουν στο pool, στο αρχείο
~/.zfsonusb.conf
στην λίσταDISKS
- Να ορίσετε ποιόν φάκελο θα κάνει backup στην μεταβλητή
BACKUP_SOURCE
και που θα το στείλει στην μεταβλητήBACKUP_DESTINATION
- Τέλος αν θέλετε, να επεξεργαστείτε το αρχείο
~/.rsync-home-excludes.txt
και να αφαιρέσετε τις αγκύλες#
από τα αρχεία που θέλετε να μην γίνονται (αγνοούνται) από το backup.
Το χρησιμοποιώ με την εξής σειρά όπως ακριβώς είχα πει στο σενάριο του backup. Άρα αφού συνδέσω το USB με τους δίσκους:
- zfsonusb import
- zfsonusb backup
- zfsonusb export
- … καληνύχτα…
![](https://cerebrux.net/wp-content/uploads/2024/09/image-33.png?w=896)
Α!…, και θυμήσου! Το 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… πιο επικίνδυνα…
καλημερα,
πολυ χρησιμος οδηγός για ασχετο, με το zfs, χρηστη
ευχαριστω
Δημητρης
αυτο στο Arch
sudo
zfs create zones/backup
zones
χτυπαγε error οποτε το αλλαξα σεsudo
zfs create zones/backup
Έχεις απόλυτο δίκιο ! Εκ παραδρομής μπήκε το zones ενώ δεν έπρεπε. Το διόρθωσα. Ευχαριστώ για την επισήμανση !
Να’σε καλά Δημήτρη, χαίρομαι που το βρήκες χρήσιμο
καλησπέρα,
εκτελωντας το 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 ?
ευχαριστω
Το έσπασες στο ξύλο ρε συ ΧΑΧΑΧΑΧ
Καλά κάνεις όμως γιατί έτσι μαθαίνεις. Η αλήθεια είναι αυτό που σου λέει το μήνυμα θα χρειαστεί να το φτιάξεις από κάποιο backup.
Το έσπασες στο ξύλο ρε συ ΧΑΧΑΧΑΧ !!! οντως :)
να σε ενημερωσω επισης οτι δεν υπαρχει backup
ξεκινησα τον οδηγο από την αρχή αλλα ματαια :(
σκεφτομουν μην υπαρχει καποιο συστημικο αρχείο που περιεχει σχετικες πληροφορίες οποτε σβηνοντας προσπερασω το πρόβλημα
anyway
ευχαριστω πολυ