Skip to main content

Μετατροπή εγκατάστασης FreeBSD από UFS σε ZFS

1. Εισαγωγή - Λίγα λόγια για το ZFS

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

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

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

Η όλη φιλοσοφία βασίζεται στις λεγόμενες Storage Pools (συγχωρέστε με, αλλά δε μπορώ να βρω μια απλή μετάφραση του όρου στα Ελληνικά, ο οποίος να διατηρεί και την έννοια... Ίσως το "Διαθέσιμοι Χώροι Αποθήκευσης" να είναι πιο κοντά στην πραγματικότητα και έτσι θα το χρησιμοποιώ και στο υπόλοιπο κείμενο, αν χρειαστεί). Με τη βοήθειά τους μπορεί να δημιουργήσει μια εικονική μονάδα αποθήκευσης και να τη διαχειριστεί με βάση τις δυνατότητες των διαθέσιμων πραγματικών. Τι δυνατότητες μας δίνει το ZFS:

  • Όλοι οι διαθέσιμοι χώροι αποθήκευσης αντιμετωπίζονται σας ένας ενιαίος χώρος
  • Κάθε "Εσωτερικό Σύστημα Αρχείων" για το λειτουργικό είναι απλά ένα "Σημείο Διαχείρισης" για το ZFS
  • Διαχείριση συμπίεσης δεδομένων, εσωτερικών ελέγχων εγκυρότητας και δόρθωσης των δεδομένων
  • Διαχείριση δικαιωμάτων
  • Διαχείριση σημείων προσάρτησης των Εσωτερικών Συστημάτων Αρχείων δυναμικά
  • Αυτόματη προσάρτηση των Εσωτερικών Συστημάτων Αρχείων στο λειτουργικό
  • Αυτόματη εξαγωγή τμημάτων μέσω NFS
  • Αυτόματος περιορισμός όγκου ενός Εσωτερικού Συστήματος Αρχείων δεδομένων σε μια μέγιστη (quota) ή ελάχιστη (reservation) τιμή
  • Αντιγραφή ενός Εσωτερικού Συστήματος Αρχείων σε ένα άλλο σε ελάχιστο χρόνο
  • Τα αντίγραφα ενός Εσωτερικού Συστήματος Αρχείων καταλαμβάνουν τον ελάχιστο δυνατό χώρο. Ο χώρος που καταλαμβάνεται είναι μόνο αυτός των διαφορετικών αρχείων στο αντίγραφο (snapshot)
  • Ευκολότερη ανάκτηση δεδομένων σε προηγούμενη κατάσταση (rollback)
  • Άμεση κλωνοποίηση αντιγράφου ασφάλειας
  • Εύκολο Backup - Restore ακόμα και σε απομακρυσμένο υπολογιστή
  • Ασφάλεια και Κρυπτογράφηση των δεδομένων

και πολλά άλλα...
(Περισσότερες πληροφορίες μπορείτε να βρείτε στο ZFS Administration Guide)

2. Προετοιμασία του σκληρού δίσκου

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

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

Εκκινούμε τον υπολογιστή με ένα CD/DVD μιας έκδοσης FreeBSD. Φυσικά, προτείνεται η τελευταία σταθερή έκδοση. Όταν ξεκινήσει το πρόγραμμα εγκατάστασης SysInstall επιλέγουμε την κωδικοποίηση γλώσσας και τη δομή του πληκτρολογίου. Αυτά δεν παίζουν κάποιο ρόλο στη διαδικασία που θ' ακολουθήσουμε, οπότε μπορεί να είναι οποιαδήποτε επιλογή. Στο επόμενο μενού επιλέγουμε την επιλογή "Fixit" και λέμε στο sysinstall να εκκινήσει την κονσόλα αυτή από το CD/DVD. Αν δεν περιέχεται στον οπτικό δίσκο που έχετε τοποθετήσει στον οδηγό (ίσως να είναι κάποια custom έκδοση), απλά βάλτε κάποιο CD/DVD που να τον περιέχει, ή χρησιμοποιήστε κάποιο διαθέσιμο USB Memory Stick που να περιέχει το livefs του FreeBSD.

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

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

Fixit# gpart destroy ad0

Με αυτό τον τρόπο καταστρέφουμε τον ήδη υπάρχοντα πίνακα κατατμήσεων τύπου GEOM που υπάρχει. Τώρα θα δημιουργήσουμε τον πίνακα τύπου GPT. Για να γίνει αυτό, δίνουμε την εντολή:

Fixit# gpart create -s gpt ad0

Στη συνέχεια θα δημιουργήσουμε τις βασικές κατατμήσεις (partitions) που πρέπει να υπάρχουν για την εγκατάσταση:

Fixit# gpart add -s 256K -t freebsd-boot ad0
Fixit# gpart add -s 4G -t freebsd-swap -l swap0 ad0
Fixit# gpart add -t freebsd-zfs -l disk0 ad0

Παρότι στο wiki του FreeBSD Project προτείνεται η πρώτη κατάτμηση να έχει μέγεθος 64Κ, καλό είναι να είμαστε προετοιμασμένοι για τις εξελίξεις και να δώσουμε λίγο περιθώριο παραπάνω. Εξάλλου ο αποθηκευτικός χώρος που καταναλώνουμε είναι τόσο μικρός που δεν πρόκειται να μας λείψει...

Για να μπορέσει να εκκινήσει ο υπολογιστής με το σύστημα GPT και τη δυνατότητα διαβάσματος ZFS Συστήματος Αρχείων θα πρέπει να εγκατασταθεί ο κατάλληλος κώδικας στη πρώτη κατάτμηση που έχει τύπο freebsd-boot. Αυτό γίνεται με τις εξής εντολές:

Fixit# gpart bootcode -b /mnt2/boot/pmbr -p /mnt2/boot/gptzfsboot -i 1 ad0

Σε αυτή την εντολή ορίζουμε για την εγκατάσταση του κώδικα boot το που θα βρεί τον κώδικα εκκίνησης για το Master Boot Record (MBR - Είναι ο πρώτος τομέας το σκληρού δίσκου και εκεί βρίσκεται πάντα το πρώτο κομμάτι κώδικα που φορτώνεται από το BIOS για την εκκίνηση) με την παράμετρο -b. Με την -p δηλώνουμε που θα βρεί τον κώδικα που θα εγκαταστήσει για την αναγνώριση του σχήματος GPT και ZFS. Αυτός ο κώδικας θα γραφτεί στο 1ο partition (-i 1) του σκληρού δίσκου ad0.

Υπάρχει περίπτωση ο υπολογιστής να αρνηθεί να εκτελέσει αυτή την εντολή, λόγω δικαιωμάτων και να μας εμφανίσει ένα μήνυμα "operation not permitted". Σε αυτή την περίπτωση θα τον αναγκάσουμε δίνοντας την εντολή:

Fixit# sysctl kern.geom.debugflags=0x10

και φυσικά ξαναεκτελούμε την παραπάνω εντολή εγγραφής του bootcode.

Τώρα ο δίσκος είναι έτοιμος να δεχτεί το σύστημα αρχείων ZFS. Αυτό, όμως, θα γίνει μέσα από το κανονικό μας περιβάλλον FreeBSD. Μπορούμε να βγούμε από την κονσόλα Fixit και να σβήσουμε τελείως τον υπολογιστή μας.

3. Δημιουργία του συστήματος αρχείων

Σε αυτό το σημείο είμαστε έτοιμοι να δημιουργήσουμε όλο το σύστημα αρχείων ZFS μέσα στον καινούργιο σκληρό δίσκο. Αυτό μπορούμε να το κάνουμε μέσα από το ήδη εγκαταστημένο λειτουργικό που έχουμε στον παλιό σκληρό μας. Όσο το μηχάνημα είναι σβηστό, μπορούμε να συνδέσουμε και τους δύο σκληρούς επάνω, τον παλιό όπως ακριβώς ήταν (θα θεωρήσω ότι ήταν στη θέση ad0) και τον καινούργιο σε μια άλλη (και πάλι θα θεωρήσω ότι βρίσκεται στην θέση ad1).

Ανάβουμε τον υπολογιστή και κάνουμε boot κανονικά από το προηγούμενα εγκαταστημένο λειτουργικό μας, αλλά σε single user mode. Από τα kernel messages μπορούμε να δούμε τις ονομασίες των μονάδων σκληρών δίσκων. Όταν τελικά μπει ο υπολογιστής, αφού επιλέξουμε και το κέλυφος της γραμμής εντολών που θα χρησιμοποιήσουμε, φροντίζουμε να προσαρτήσουμε όλα τα συστήματα αρχείων του λειτουργικού:

# mount /tmp
# mount /var
# mount /usr

Αυτό θα μας δώσει και τη δυνατότητα να μπορέσουμε να χρησιμοποιήσουμε και όλες τις εγκαταστημένες εντολές. Στη συνέχεια θα δημιουργήσουμε τη ZFS δομή μέσα στο σκληρό δίσκο. Θα χρησιμοποιήσουμε τον αλγόριθμο fletcher4 αντί για τον προεπιλεγμένο fletcher2, γιατί είναι πιο καλός:

# zpool create zroot /dev/gpt/disk0
# zpool set bootfs=zroot zroot
# zfs set checksum=fletcher4 zroot

Δημιουργία του /tmp:

# zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
# chmod 1777 /zroot/tmp

Δημιουργία του /var:

# zfs create zroot/var
# zfs create -o exec=off -o setuid=off zroot/var/db
# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
# zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
# zfs create -o exec=off -o setuid=off zroot/var/run
# zfs create -o exec=off -o setuid=off zroot/var/empty
# chmod 1777 /zroot/var/tmp

Δημιουργία του /usr:

# zfs create zroot/usr
# zfs create zroot/usr/home
# zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
# cd /zroot ; ln -s /usr/home home

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

4. Προετοιμασία βασικών αρχείων configuration

Πριν να ξεκινήσουμε τη διαδικασία dump/restore καλό θα ήταν να προετοιμάσουμε τα δύο βασικά configuration αρχεία έτσι ώστε να φορτώνεται και το ZFS. Με όποιον editor προτιμάτε μπορείτε να κάνετε επεξεργασία των αρχείων. Ξεκινάμε από το /etc/rc.conf. Σε αυτό θα προσθέσουμε τις ακόλουθες γραμμές:

# ZFS Support module must be loaded
zfs_enable="YES"

ενώ στο /boot/loader.conf θα προσθέσουμε τα:

zfs_load="YES"
vfs.root.mountfrom="zfs:zroot"

Στο σύστημά σας μπορεί να υπάρχει το αρχείο /etc/src.conf. Αν δεν υπάρχει δημιουργήστε το. Το εν λόγω αρχείο πρέπει να περιέχει την ακόλουθη γραμμή. Αν δεν την έχει, προσθέστε τη:

LOADER_ZFS_SUPPORT=YES

5. Αντιγραφή του λειτουργικού

Πλέον, είμαστε έτοιμοι για την αντιγραφή του τρέχοντος λειτουργικού από τον "παλιό" σκληρό δίσκο στον "καινούργιο":

# ( dump -0f - / ) | (cd /zroot; restore -rf - )
.
.
.
# ( dump -0f - /tmp ) | (cd /zroot/tmp; restore -rf - )
.
.
.
# ( dump -0f - /var ) | (cd /zroot/var; restore -rf - )
.
.
.
# ( dump -0f - /usr ) | (cd /zroot/usr; restore -rf - )
.
.
.

Απολαύστε τον καφέ σας, γιατί η διαδικασία dump/restore μπορεί να πάρει ώρες, ανάλογα με τον όγκο των δεδομένων που έχετε...

6. Μερικές ακόμα ρυθμίσεις για τον bootloader

Πριν να κάνουμε εκκίνηση του υπολογιστή, λίγο ακόμα fine tuning είναι απαραίτητο. Πρώτα θα πρέπει να μαρκάρουμε το νέο var/empty σαν read only:

# zfs set readonly=on zroot/var/empty

Στη συνέχεια θα πρέπει να εγκαταστήσουμε και τον ZFS boot loader του FreeBSD. Αν νομίζετε ότι το έχουμε κάνει ήδη, τότε θα πρέπει να πούμε ότι η εκκίνηση ενός λειτουργικού γίνεται σε διάφορα διαδοχικά βήματα. Μέχρι τώρα έχουμε προετοιμάσει μόνο το MBR και το πρώτο βήμα εκκίνησης. Το τελικό θα το φτιάξουμε τώρα, δίνοντας τις ακόλουθες εντολές:

Σημείωση:
Το βήμα αυτό χρειάζεται για τις εκδόσεις:
  • FreeBSD 7.0-RELEASE
  • FreeBSD 7.1-RELEASE
  • FreeBSD 7.2-RELEASE και
  • FreeBSD 8.0-RELEASE

Δεν χρειάζεται στις εκδόσεις:

  • FreeBSD 7.2-STABLE (βλ. r200221, 7 Δεκεμβρίου 2009)
  • FreeBSD 8.0-STABLE (βλ. r200220, 7 Δεκεμβρίου 2009) και
  • FreeBSD 9.0-CURRENT (βλ. r199714, 23 Νοεμβρίου 2009)


# chroot /zroot
# mount -t devfs devfs /dev
# cd /usr/src/sys/boot/
# make obj
# make depend
# make
# cd i386/loader
# make install

Πλέον, μπορούμε να βγούμε από το chroot.

# umount /dev
# exit

7. Τελικές Ρυθμίσεις...

Πλησιάζουμε στο τέλος. Μένουν μόνο λίγες ακόμα κινήσεις και το λειτουργικό μας θα μπορεί να εκκινήσει. Οι ρυθμίσεις αφορούν το αρχείο /etc/fstab του zroot, την ZFS cache και τα σημεία προσάρτησης. Ξεκινάμε με τη ρύθμιση του αρχείου /etc/fstab. Σε αυτό πρέπει να υπάρχουν οι γραμμές για τη μνήμη swap και τα σημεία προσάρτησης που είχαμε, εκτός των σημείων προσάρτησης των /tmp, /var και /usr. Για τα τελευταία θα ασχοληθεί το ZFS μόνο του. Με τον αγαπημένο μας επεξεργαστή αρχείων (π.χ. vi, ee, emacs κ.λ.π.) επεξεργαζόμαστε το αρχείο /zroot/etc/fstab. Για τη μνήμη swap πρέπει να υπάρχει η ακόλουθη γραμμή:

# Device          Mountpoint              FStype    Options         Dump    Pass#
/dev/gpt/swap0    none                    swap      sw              0       0

Αυτό θα εξασφαλίσει την χρήση της κατάτμησης που ορίσαμε σαν freebsd-swap σαν εικονική μνημη.

Κάτι που θα πρέπει να προσέξουμε είναι η περίπτωση όπου χρησιμοποιούμε Linux Compatibility. Για να υπάρχει θα πρέπει το /etc/fstab αρχείο να περιέχει δύο γραμμές που προσαρτούν τα κατάλληλα συστήματα αρχείων στο δέντρο του λειτουργικού μας. Αυτά θα πρέπει να μαρκαριστούν ως late:

# Device          Mountpoint              FStype    Options         Dump    Pass#
linproc           /usr/compat/linux/proc  linprocfs rw,late         0       0
proc              /proc                   procfs    rw,late         0       0

αλλιώς κατά την εκκίνηση ο υπολογιστής θα παραπονεθεί ότι δεν βρίσκει το /usr/compat/... και αυτό θα οφείλεται στο ότι δεν έχει προλάβει να κάνει mount το ZFS τις αντίστοιχες Εσωτερικές Κατατμήσεις.

Ακολουθεί η αντιγραφή της ZFS cache στο καινούργιο σύστημα. Για να γίνει αυτό θα πρέπει να εκτελεστεί η ακόλουθη εντολή:

# cp /boot/zfs/zpool.cache /zroot/boot/zfs/zpool.cache

Πιθανόν να αναρωτηθείτε με την κίνηση αυτή. Αφού κάναμε dump/restore η cache έχει αντιγραφεί και αυτή! Απλά, με αυτή την κίνηση είμαστε σίγουροι ότι η cache είναι στην τελευταία της μορφή και ότι δεν θα έχουμε άλλες εκπλήξεις. Πράγματι, πιθανόν αν αυτό το στάδιο το προσπερνούσαμε να μην υπήρχε πρόβλημα.

Τέλος για να ρυθμίσουμε τα σημεία προσάρτησης, το ZFS δεν χρειάζεται το αρχείο /etc/fstab. Είπαμε στην αρχή ότι το ZFS ενσωματώνει και ολόκληρη λογική διαχείρισης και έτσι πρέπει να γνωρίζει από μόνο του τα σημεία προσάρτησης των εσωτερικών τμημάτων του. Για να τα ορίσουμε εκτελούμε τις εντολές:

# zfs unmount -a
# zfs set mountpoint=legacy zroot
# zfs set mountpoint=/tmp zroot/tmp
# zfs set mountpoint=/usr zroot/usr
# zfs set mountpoint=/var zroot/var

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

# shutdown -p now

Μετά από τις αλλαγές στις συνδέσεις ο υπολογιστής θα πρέπει να εκκινήσει κανονικά το λειτουργικό που είχαμε και πριν. Για να δούμε ότι πραγματικά χρησιμοποιεί το ZFS σαν σύστημα αρχείων αρκεί να βγούμε σε μια κονσόλα και να γράψουμε:

eliaschr@pluto:~ > mount
zroot on / (zfs, NFS exported, local)
devfs on /dev (devfs, local, multilabel)
zroot/tmp on /tmp (zfs, local, nosuid)
zroot/usr on /usr (zfs, local)
zroot/usr/home on /usr/home (zfs, local)
zroot/usr/ports on /usr/ports (zfs, local, nosuid)
zroot/usr/ports/distfiles on /usr/ports/distfiles (zfs, local, noexec, nosuid)
zroot/usr/ports/packages on /usr/ports/packages (zfs, local, noexec, nosuid)
zroot/usr/src on /usr/src (zfs, local, noexec, nosuid)
zroot/var on /var (zfs, local)
zroot/var/crash on /var/crash (zfs, local, noexec, nosuid)
zroot/var/db on /var/db (zfs, local, noexec, nosuid)
zroot/var/db/pkg on /var/db/pkg (zfs, local, nosuid)
zroot/var/empty on /var/empty (zfs, local, noexec, nosuid, read-only)
zroot/var/log on /var/log (zfs, local, noexec, nosuid)
zroot/var/mail on /var/mail (zfs, local, noexec, nosuid)
zroot/var/run on /var/run (zfs, local, noexec, nosuid)
zroot/var/tmp on /var/tmp (zfs, local, nosuid)
linprocfs on /usr/compat/linux/proc (linprocfs, local)
procfs on /proc (procfs, local)
eliaschr@pluto:~ >

8. Πηγές Πληροφοριών

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