Tom Rhodes Γράφηκε από τον Υποστήριξη Συστημάτων Αρχείων Σύνοψη File Systems File Systems Support File Systems Τα συστήματα αρχείων αποτελούν αναπόσπαστο τμήμα κάθε λειτουργικού συστήματος. Επιτρέπουν στους χρήστες να δημιουργούν και να αποθηκεύουν αρχεία, παρέχουν πρόσβαση σε δεδομένα, και φυσικά αξιοποιούν τους σκληρούς δίσκους. Διαφορετικά λειτουργικά συστήματα χρησιμοποιούν συνήθως διαφορετικά εγγενή συστήματα αρχείων. Το σύστημα αρχείων του &os; είναι το Fast File System ή FFS, το οποίο προήλθε από το αρχικό σύστημα αρχείων του Unix™, γνωστό επίσης και ως UFS. Αυτό είναι και το εγγενές σύστημα αρχείων του &os;, το οποίο χρησιμοποιείται στους σκληρούς δίσκους και προσφέρει πρόσβαση στα δεδομένα. Το &os; προσφέρει επίσης πληθώρα διαφορετικών συστημάτων αρχείων, ώστε να παρέχει τοπική πρόσβαση σε δεδομένα που έχουν δημιουργηθεί από άλλα λειτουργικά συστήματα, π.χ. δεδομένα που βρίσκονται σε τοπικά USB αποθηκευτικά μέσα, οδηγούς flash, και σκληρούς δίσκους. Υπάρχει επίσης υποστήριξη για άλλα, μη-εγγενή συστήματα αρχείων, όπως το Extended File System (EXT) του &linux; καθώς και το σύστημα Z File System (ZFS) της &sun;. Το &os; παρέχει διαφορετικό επίπεδο υποστήριξης για κάθε σύστημα αρχείων. Για ορισμένα θα χρειαστεί να φορτωθεί κάποιο άρθρωμα στον πυρήνα, ενώ για άλλα θα πρέπει να εγκατασταθούν κάποια εργαλεία. Το κεφάλαιο αυτό έχει σχεδιαστεί να βοηθήσει τους χρήστες του &os; να αποκτήσουν πρόσβαση σε άλλα συστήματα αρχείων στο σύστημα τους, ξεκινώντας από το Ζ File System της &sun;. Αφού διαβάσετε αυτό το κεφάλαιο, θα γνωρίζετε: Τη διαφορά μεταξύ των εγγενών και των υποστηριζόμενων συστημάτων αρχείων. Ποια συστήματα αρχείων υποστηρίζονται από το &os;. Πως να ενεργοποιήσετε, να ρυθμίσετε, να αποκτήσετε πρόσβαση και να χρησιμοποιήσετε μη-εγγενή συστήματα αρχείων. Πριν διαβάσετε αυτό το κεφάλαιο, θα πρέπει: Να κατανοείτε βασικές έννοιες του &unix; και του &os; (). Να είστε εξοικειωμένος με τις βασικές διαδικασίες ρύθμισης και εγκατάστασης προσαρμοσμένου πυρήνα (). Να αισθάνεστε άνετα με την εγκατάσταση εφαρμογών τρίτου κατασκευαστή στο &os; (). Να είστε εξοικειωμένος με τους δίσκους, τα μέσα αποθήκευσης, και τα αντίστοιχα ονόματα συσκευών στο &os; (). Το Σύστημα Αρχείων Z (ZFS) Το σύστημα αρχείων Z, αναπτύχθηκε από την &sun;, και είναι μια νέα τεχνολογία που σχεδιάστηκε για να παρέχει αποθήκευση μέσω της μεθόδου pool. Αυτό σημαίνει ότι όλος ο ελεύθερος χώρος διατίθεται ως απόθεμα, και διανέμεται δυναμικά σε κάθε σύστημα αρχείων ανάλογα με τις ανάγκες αποθήκευσης δεδομένων. Έχει επίσης σχεδιαστεί για τη μέγιστη ακεραιότητα δεδομένων και υποστηρίζει στιγμιότυπα (snapshots) δεδομένων, πολλαπλά αντίγραφα και αθροίσματα ελέγχου δεδομένων (checksums). Έχει ακόμα προστεθεί ένα νέο μοντέλο για τη διατήρηση αντιγράφων των δεδομένων, γνωστό ως RAID-Z. Το μοντέλο RAID-Z είναι παρόμοιο με το RAID5 αλλά είναι σχεδιασμένο να παρέχει προστασία των δεδομένων κατά την εγγραφή τους. Βελτιστοποίηση του ZFS Το υποσύστημα ZFS χρησιμοποιεί αρκετούς πόρους του συστήματος. Βελτιστοποιώντας τις ρυθμίσεις του συστήματος σας, θα επιτύχετε τη μέγιστη απόδοση στην καθημερινή χρήση. Καθώς το ZFS είναι ακόμα σε πειραματικό στάδιο στο &os;, αυτό ίσως αλλάξει μελλοντικά. Ωστόσο, για την ώρα, συνίσταται να ακολουθήσετε τα παρακάτω βήματα: Μνήμη Το συνολικό μέγεθος μνήμης του συστήματος πρέπει να είναι τουλάχιστον ένα gigabyte, ενώ το συνιστώμενο μέγεθος είναι δύο gigabytes ή και περισσότερο. Σε όλα τα παραδείγματα που φαίνονται εδώ, το σύστημα έχει ένα gigabyte μνήμης και έχουμε επίσης βελτιστοποιήσει τις ρυθμίσεις του. Ορισμένοι χρήστες φαίνεται να τα καταφέρνουν και με λιγότερο από ένα gigabyte μνήμης, αλλά με τέτοιους περιορισμούς φυσικής μνήμης, είναι αρκετά πιθανό να δημιουργηθεί panic κάτω από βαρύ φορτίο εργασίας, εξαιτίας εξάντλησης της. Ρύθμιση του Πυρήνα Συνίσταται να αφαιρέσετε τα προγράμματα οδήγησης και τις επιλογές που δεν χρησιμοποιείτε από το αρχείο ρυθμίσεων του πυρήνα. Καθώς οι περισσότεροι οδηγοί συσκευών διατίθενται επίσης και σε μορφή αρθρωμάτων, μπορείτε να τους φορτώσετε χρησιμοποιώντας το αρχείο /boot/loader.conf. Οι χρήστες της αρχιτεκτονικής &i386; θα πρέπει να προσθέσουν την παρακάτω επιλογή στο αρχείο ρυθμίσεων του πυρήνα τους, να τον επαναμεταγλωττίσουν και να επανεκκινήσουν το σύστημα τους: options KVA_PAGES=512 Η επιλογή αυτή θα διευρύνει την περιοχή διευθύνσεων του πυρήνα, επιτρέποντας έτσι την αύξηση τιμής της ρυθμιστικής μεταβλητής vm.kvm_size πέρα από το τρέχον όριο του 1 GB (2 GB για πυρήνες PAE). Για να βρείτε την καταλληλότερη τιμή για αυτή την επιλογή, διαιρέστε το επιθυμητό μέγεθος της περιοχής διευθύνσεων με το τέσσερα (4). Στην περίπτωση αυτή, έχουμε 512 για μέγεθος 2 GB. Ρυθμίσεις στις Μεταβλητές του Loader Θα πρέπει να αυξηθεί η περιοχή διευθύνσεων kmem σε όλες τις αρχιτεκτονικές του &os;. Στο δοκιμαστικό μας σύστημα, με ένα gigabyte φυσικής μνήμης, είχαμε επιτυχημένο αποτέλεσμα χρησιμοποιώντας τις ακόλουθες επιλογές στο αρχείο /boot/loader.conf και επανεκκινώντας το σύστημα μας: vm.kmem_size="330M" vm.kmem_size_max="330M" vfs.zfs.arc_max="40M" vfs.zfs.vdev.cache.size="5M" Για αναλυτικότερες ρυθμίσεις σχετικά με την βελτιστοποίηση του ZFS, δείτε το . Χρησιμοποιώντας το <acronym>ZFS</acronym> Υπάρχει ένας μηχανισμός εκκίνησης που επιτρέπει στο &os; να προσαρτήσει ZFS pools κατά τη διάρκεια της εκκίνησης του συστήματος. Για να τον ρυθμίσετε, εκτελέστε τις ακόλουθες εντολές: &prompt.root; echo 'zfs_enable="YES"' >> /etc/rc.conf &prompt.root; /etc/rc.d/zfs start Το υπόλοιπο αυτού του κειμένου υποθέτει ότι έχετε διαθέσιμους τρεις SCSI δίσκους, και ότι τα ονόματα συσκευών τους είναι da0, da1 και da2. Όσοι διαθέτουν δίσκους IDE θα πρέπει να χρησιμοποιήσουν συσκευές του τύπου ad αντί για τις αντίστοιχες SCSI. Pool με Ένα Μόνο Δίσκο Για την δημιουργία ενός ZFS pool με ένα μόνο δίσκο (χωρίς δυνατότητα ανοχής σφαλμάτων), χρησιμοποιήστε την εντολή zpool: &prompt.root; zpool create example /dev/da0 Για να δείτε το νέο pool, εξετάστε την έξοδο της εντολής df: &prompt.root; df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235230 1628718 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032846 48737598 2% /usr example 17547136 0 17547136 0% /example Η έξοδος αυτή δείχνει καθαρά ότι το example pool όχι μόνο έχει δημιουργηθεί, αλλά έχει επίσης προσαρτηθεί κιόλας. Είναι επίσης διαθέσιμο ως κανονικό σύστημα αρχείων, μπορείτε να δημιουργήσετε αρχεία σε αυτό, και άλλοι χρήστες μπορούν επίσης να το δουν, όπως φαίνεται στο παρακάτω παράδειγμα: &prompt.root; cd /example &prompt.root; ls &prompt.root; touch testfile &prompt.root; ls -al total 4 drwxr-xr-x 2 root wheel 3 Aug 29 23:15 . drwxr-xr-x 21 root wheel 512 Aug 29 23:12 .. -rw-r--r-- 1 root wheel 0 Aug 29 23:15 testfile Δυστυχώς αυτό το pool δεν χρησιμοποιεί κάποιο από τα πλεονεκτήματα του ZFS. Δημιουργήστε ένα σύστημα αρχείων σε αυτό το pool και ενεργοποιήστε σε αυτό τη συμπίεση: &prompt.root; zfs create example/compressed &prompt.root; zfs set compression=gzip example/compressed Το σύστημα αρχείων example/compressed είναι πλέον ένα συμπιεσμένο ZFS σύστημα. Δοκιμάστε να αντιγράψετε μερικά μεγάλα αρχεία σε αυτό, απευθείας στον κατάλογο /example/compressed. Μπορείτε τώρα να απενεργοποιήσετε τη συμπίεση γράφοντας: &prompt.root; zfs set compression=off example/compressed Για να αποπροσαρτήσετε το σύστημα αρχείων, εκτελέστε την ακόλουθη εντολή και επαληθεύστε το αποτέλεσμα μέσω του βοηθητικού προγράμματος df: &prompt.root; zfs umount example/compressed &prompt.root; df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235232 1628716 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032864 48737580 2% /usr example 17547008 0 17547008 0% /example Προσαρτήστε ξανά το σύστημα αρχείων, ώστε να είναι και πάλι προσβάσιμο, και επαληθεύστε το χρησιμοποιώντας όπως και πριν, την εντολή df: &prompt.root; zfs mount example/compressed &prompt.root; df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235234 1628714 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032864 48737580 2% /usr example 17547008 0 17547008 0% /example example/compressed 17547008 0 17547008 0% /example/compressed Μπορείτε επίσης να δείτε το pool και το σύστημα αρχείων εξετάζοντας την έξοδο της εντολής mount: &prompt.root; mount /dev/ad0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/ad0s1d on /usr (ufs, local, soft-updates) example on /example (zfs, local) example/data on /example/data (zfs, local) example/compressed on /example/compressed (zfs, local) Όπως παρατηρούμε, το σύστημα αρχείων ZFS μπορεί να χρησιμοποιηθεί ως κοινό σύστημα αρχείων μετά τη δημιουργία του. Ωστόσο, διαθέτει πολλές ακόμα λειτουργίες. Στο παρακάτω παράδειγμα δημιουργούμε ένα νέο σύστημα αρχείων, το data. θα αποθηκεύσουμε σημαντικά δεδομένα σε αυτό, και έτσι το ρυθμίζουμε ώστε να κρατάει δύο αντίγραφα από κάθε μπλοκ δεδομένων: &prompt.root; zfs create example/data &prompt.root; zfs set copies=2 example/data Μπορούμε τώρα να δούμε τα δεδομένα και την κατανάλωση χώρου δίνοντας ξανά την εντολή df: &prompt.root; df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235234 1628714 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032864 48737580 2% /usr example 17547008 0 17547008 0% /example example/compressed 17547008 0 17547008 0% /example/compressed example/data 17547008 0 17547008 0% /example/data Παρατηρήστε ότι κάθε σύστημα αρχείων στο pool δείχνει το ίδιο μέγεθος διαθέσιμου χώρου. Αυτός είναι και ο λόγος που χρησιμοποιούμε την εντολή df σε όλα τα παραδείγματα, για να δείξουμε ότι τα συστήματα αρχείων χρησιμοποιούν μόνο το χώρο που χρειάζονται και ότι όλα μοιράζονται τον ίδιο χώρο (το κοινόχρηστο απόθεμα — pool). Στο σύστημα αρχείων ZFS έννοιες όπως οι τόμοι (volumes) και οι κατατμήσεις (partitions) δεν έχουν νόημα. Αντίθετα, πολλά συστήματα αρχείων μοιράζονται τον ίδιο χώρο, το pool. Μπορείτε να καταργήσετε το σύστημα αρχείων και κατόπιν το ίδιο το pool όταν δεν τα χρειάζεστε πλέον: &prompt.root; zfs destroy example/compressed &prompt.root; zfs destroy example/data &prompt.root; zpool destroy example Οι σκληροί δίσκοι με τον καιρό χαλάνε, είναι αναπόφευκτο. Όταν ένας δίσκος χαλάσει, τα δεδομένα του χάνονται. Μια μέθοδος για να αποφύγουμε την απώλεια δεδομένων εξαιτίας ενός χαλασμένου δίσκου είναι να δημιουργήσουμε μια συστοιχία RAID. Τα pools του ZFS έχουν σχεδιασθεί ώστε να υποστηρίζουν αυτό το χαρακτηριστικό. Η λειτουργία αυτή αναλύεται στην επόμενη ενότητα. <acronym>ZFS</acronym> RAID-Z Όπως αναφέραμε προηγουμένως, η ενότητα αυτή προϋποθέτει ότι χρησιμοποιούμε τρεις συσκευές SCSI με ονόματα συσκευών da0, da1 και da2. Για να δημιουργήσουμε ένα pool τύπου RAID-Z, εκτελούμε την ακόλουθη εντολή: &prompt.root; zpool create storage raidz da0 da1 da2 Η &sun; συνιστά να χρησιμοποιούνται από τρεις ως εννιά συσκευές σε συστοιχίες τύπου RAID-Z. Αν χρειάζεται να δημιουργήσετε ένα pool με περισσότερους από δέκα δίσκους, είναι προτιμότερο να το χωρίσετε σε ομάδες από μικρότερα RAID-Z pools. Αν διαθέτετε μόνο δύο δίσκους αλλά χρειάζεστε την δυνατότητα ανοχής σφαλμάτων, ίσως είναι καλύτερο να χρησιμοποιήσετε ένα ZFS mirror. Δείτε τη σελίδα manual του &man.zpool.8; για περισσότερες λεπτομέρειες. Θα δημιουργηθεί το storage zpool. Μπορείτε να επαληθεύσετε το αποτέλεσμα χρησιμοποιώντας, όπως και προηγουμένως, τις εντολές &man.mount.8; και &man.df.1;. Θα μπορούσαμε να χρησιμοποιήσουμε περισσότερους δίσκους, προσθέτοντας τα ονόματα συσκευών τους στο τέλος της παραπάνω λίστας. Δημιουργήστε ένα νέο σύστημα αρχείων στο pool, το οποίο θα ονομάζεται home και όπου θα αποθηκεύονται τελικά τα αρχεία των χρηστών: &prompt.root; zfs create storage/home Μπορούμε τώρα να ενεργοποιήσουμε την συμπίεση και να κρατάμε επιπλέον αντίγραφα των καταλόγων και των δεδομένων των χρηστών. Όπως και προηγουμένως, μπορούμε να το επιτύχουμε χρησιμοποιώντας τις παρακάτω εντολές: &prompt.root; zfs set copies=2 storage/home &prompt.root; zfs set compression=gzip storage/home Για να γίνει αυτός ο νέος κατάλογος των χρηστών, αντιγράψτε τα δεδομένα τους σε αυτόν και δημιουργήστε τους κατάλληλους συμβολικούς δεσμούς: &prompt.root; cp -rp /home/* /storage/home &prompt.root; rm -rf /home /usr/home &prompt.root; ln -s /storage/home /home &prompt.root; ln -s /storage/home /usr/home Τα δεδομένα των χρηστών θα αποθηκεύονται τώρα στο νέο σύστημα αρχείων /storage/home. Για να το επαληθεύσετε, δημιουργήστε ένα νέο χρήστη και εισέλθετε στο σύστημα με το νέο λογαριασμό. Δοκιμάστε να δημιουργήσετε ένα στιγμιότυπο (snapshot) στο οποίο θα μπορείτε να επανέλθετε αργότερα: &prompt.root; zfs snapshot storage/home@08-30-08 Σημειώστε ότι η επιλογή δημιουργίας στιγμιότυπου λειτουργεί μόνο σε πραγματικό σύστημα αρχείων, και όχι σε κάποιο μεμονωμένο κατάλογο ή αρχείο. Ο χαρακτήρας @ χρησιμοποιείται ως διαχωριστικό μεταξύ του συστήματος αρχείων και του ονόματος τόμου. Αν καταστραφεί ο κατάλογος δεδομένων κάποιου χρήστη αποκαταστήστε τον με την εντολή: &prompt.root; zfs rollback storage/home@08-30-08 Για να δείτε μια λίστα των διαθέσιμων στιγμιότυπων, εκτελέστε την εντολή ls στον κατάλογο .zfs/snapshot του συστήματος αρχείων. Για παράδειγμα, για να δείτε το στιγμιότυπο που δημιουργήσαμε προηγουμένως, εκτελέστε την παρακάτω εντολή: &prompt.root; ls /storage/home/.zfs/snapshot Είναι δυνατόν να γράψετε κάποιο script που να δημιουργεί μηνιαία στιγμιότυπα των δεδομένων των χρηστών. Ωστόσο, με την πάροδο του χρόνου, τα στιγμιότυπα θα καταναλώσουν μεγάλο ποσοστό του χώρου στο δίσκο. Μπορείτε να διαγράψετε το προηγούμενο στιγμιότυπο χρησιμοποιώντας την παρακάτω εντολή: &prompt.root; zfs destroy storage/home@08-30-08 Δεν υπάρχει λόγος, μετά από όλες αυτές τις δοκιμές, να κρατήσουμε το /storage/home στην παρούσα κατάσταση του. Μετατρέψτε το στο πραγματικό σύστημα αρχείων /home: &prompt.root; zfs set mountpoint=/home storage/home Χρησιμοποιώντας τις εντολές df και mount θα δούμε ότι το σύστημα χειρίζεται πλέον αυτό το σύστημα αρχείων ως το πραγματικό /home: &prompt.root; mount /dev/ad0s1a on / (ufs, local) devfs on /dev (devfs, local) /dev/ad0s1d on /usr (ufs, local, soft-updates) storage on /storage (zfs, local) storage/home on /home (zfs, local) &prompt.root; df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/ad0s1a 2026030 235240 1628708 13% / devfs 1 1 0 100% /dev /dev/ad0s1d 54098308 1032826 48737618 2% /usr storage 26320512 0 26320512 0% /storage storage/home 26320512 0 26320512 0% /home Εδώ ολοκληρώνεται η ρύθμιση του RAID-Z. Για να δέχεστε αναφορές κατάστασης σχετικά με τα συστήματα αρχείων κατά τη νυκτερινή εκτέλεση του &man.periodic.8;, δώστε την παρακάτω εντολή: &prompt.root; echo 'daily_status_zfs_enable="YES"' >> /etc/periodic.conf Ανάκτηση του <acronym>RAID</acronym>-Z Κάθε λογισμικό RAID έχει μια μέθοδο για επίβλεψη της κατάστασής του, και το ZFS δεν αποτελεί εξαίρεση. Μπορείτε να δείτε την κατάσταση των συσκευών του RAID-Z χρησιμοποιώντας την ακόλουθη εντολή: &prompt.root; zpool status -x Αν όλα τα pools είναι σε υγιή κατάσταση, θα πάρετε το ακόλουθο μήνυμα: all pools are healthy Αν υπάρχει κάποιο πρόβλημα, π.χ. κάποιος δίσκος έχει βγει εκτός λειτουργίας, θα δείτε την περιγραφή της κατάστασης σε ένα μήνυμα όπως το παρακάτω: pool: storage state: DEGRADED status: One or more devices has been taken offline by the administrator. Sufficient replicas exist for the pool to continue functioning in a degraded state. action: Online the device using 'zpool online' or replace the device with 'zpool replace'. scrub: none requested config: NAME STATE READ WRITE CKSUM storage DEGRADED 0 0 0 raidz1 DEGRADED 0 0 0 da0 ONLINE 0 0 0 da1 OFFLINE 0 0 0 da2 ONLINE 0 0 0 errors: No known data errors Το παραπάνω δείχνει ότι η συσκευή τέθηκε εκτός λειτουργίας από τον διαχειριστή. Αυτό είναι αλήθεια για το συγκεκριμένο παράδειγμα. Για να τεθεί ο δίσκος εκτός, χρησιμοποιήθηκε η παρακάτω εντολή: &prompt.root; zpool offline storage da1 Μπορούμε τώρα να αντικαταστήσουμε το δίσκο da1 μετά την απενεργοποίηση του συστήματος. Όταν το σύστημα επανέλθει σε λειτουργία, μπορούμε να χρησιμοποιήσουμε την ακόλουθη εντολή για να ενημερώσουμε το σύστημα για την αντικατάσταση του δίσκου: &prompt.root; zpool replace storage da1 Από εδώ, μπορούμε να ελέγξουμε ξανά την κατάσταση, αυτή τη φορά χωρίς την επιλογή : &prompt.root; zpool status storage pool: storage state: ONLINE scrub: resilver completed with 0 errors on Sat Aug 30 19:44:11 2008 config: NAME STATE READ WRITE CKSUM storage ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 errors: No known data errors Όπως φαίνεται στο παράδειγμα, τα πάντα φαίνεται να λειτουργούν φυσιολογικά. Επαλήθευση Δεδομένων Όπως αναφέραμε προηγουμένως, το ZFS χρησιμοποιεί checksums (αθροίσματα ελέγχου) για να επαληθεύσει την ακεραιότητα των αποθηκευμένων δεδομένων. Τα αθροίσματα ελέγχου ενεργοποιούνται αυτόματα κατά την δημιουργία των συστημάτων αρχείων, και μπορούν να απενεργοποιηθούν μέσω της επόμενης εντολής: &prompt.root; zfs set checksum=off storage/home Αυτό δεν είναι γενικά καλή ιδέα, καθώς τα checksums καταλαμβάνουν ελάχιστο αποθηκευτικό χώρο, και είναι πολύ πιο χρήσιμο να τα έχουμε ενεργοποιημένα. Επίσης δεν φαίνεται να προκαλούν κάποια σημαντική καθυστέρηση ή επιβάρυνση. Με τα checksums ενεργοποιημένα, μπορούμε να ζητήσουμε από το ZFS να ελέγξει την ακεραιότητα των δεδομένων χρησιμοποιώντας τα για επαλήθευση. Η διαδικασία αυτή είναι γνωστή ως scrubbing. Για να ελέγξετε την ακεραιότητα δεδομένων του pool storage, χρησιμοποιήστε την παρακάτω εντολή: &prompt.root; zpool scrub storage Η διαδικασία αυτή μπορεί να πάρει αρκετή ώρα, ανάλογα με την ποσότητα των αποθηκευμένων δεδομένων. Επίσης χρησιμοποιεί πάρα πολύ το δίσκο (I/O), τόσο ώστε σε κάθε δεδομένη στιγμή μπορεί να εκτελείται μόνο μια τέτοια διαδικασία. Μετά την ολοκλήρωση του scrub, θα ανανεωθεί και η αναφορά κατάστασης, την οποία μπορείτε να δείτε ζητώντας την με την παρακάτω εντολή: &prompt.root; zpool status storage pool: storage state: ONLINE scrub: scrub completed with 0 errors on Sat Aug 30 19:57:37 2008 config: NAME STATE READ WRITE CKSUM storage ONLINE 0 0 0 raidz1 ONLINE 0 0 0 da0 ONLINE 0 0 0 da1 ONLINE 0 0 0 da2 ONLINE 0 0 0 errors: No known data errors Στο παράδειγμα μας εμφανίζεται και η χρονική στιγμή που ολοκληρώθηκε η εντολή scrub. Η δυνατότητα αυτή μας εξασφαλίζει ακεραιότητα δεδομένων σε μεγάλο βάθος χρόνου. Υπάρχουν πολλές ακόμα επιλογές για το σύστημα αρχείων Ζ. Δείτε τις σελίδες manual &man.zfs.8; και &man.zpool.8;. ZFS Quotas Το ZFS υποστηρίζει διαφορετικούς τύπους quota: το refquota, το γενικό quota, το quota χρήστη και το quota ομάδας. Στην ενότητα αυτή θα εξηγήσουμε τις βασικές έννοιες κάθε τύπου και θα δώσουμε κάποιες οδηγίες χρήσης. Τα quotas χρησιμοποιούνται για να περιορίσουν το χώρο στο δίσκο που μπορεί να καταναλωθεί από ένα dataset και τους απογόνους του (descendants) του καθώς και για να θέσουν περιορισμούς στο χώρο που μπορεί να καταλάβει ένα στιγμιότυπο (snapshot). Σε όρους χρήστη, τα quotas είναι χρήσιμα για τον περιορισμό του χώρου δίσκου που μπορεί να έχει στη διάθεση του κάποιος χρήστης. Δεν μπορείτε να ορίσετε quotas σε τόμους (volumes) καθώς αυτό ουσιαστικά γίνεται ήδη από την ιδιότητα volsize. Το refquota, refquota=size, περιορίζει το χώρο που μπορεί να καταναλώσει ένα dataset θέτοντας ένα απόλυτο όριο χώρου (hard limit). Ωστόσο, αυτό το απόλυτο όριο δεν περιλαμβάνει το χώρο που χρησιμοποιείται από τους απογόνους του dataset όπως τα συστήματα αρχείων ή τα στιγμιότυπα. Για να επιβάλετε γενικό quota 10 GB για το storage/home/bob, χρησιμοποιήστε την παρακάτω εντολή: &prompt.root; zfs set quota=10G storage/home/bob Τα quotas χρήστη περιορίζουν την ποσότητα χώρου που μπορεί να χρησιμοποιήσει ένας συγκεκριμένος χρήστης. Η γενική μορφή είναι userquota@user=size, και το όνομα του χρήστη πρέπει να δίνεται σε μια από τις παρακάτω μορφές: Μορφή συμβατή με το POSIX, για παράδειγμα joe. Μορφή συμβατή με το αριθμητικό αναγνωριστικό (ΙD) του POSIX, για παράδειγμα 789. Μορφή ονόματος SID, για παράδειγμα joe.bloggs@example.com. Μορφή αριθμητικού αναγνωριστικού (ID) SID, για παράδειγμα S-1-123-456-789. Για παράδειγμα, για να επιβάλετε quota 50 GB για ένα χρήστη με όνομα joe, χρησιμοποιήστε την παρακάτω εντολή: &prompt.root; zfs set userquota@joe=50G Για να αφαιρέσετε το quota ή να βεβαιωθείτε ότι δεν έχει τεθεί, χρησιμοποιήστε την εντολή: &prompt.root; zfs set userquota@joe=none Οι ιδιότητες των quota χρηστών δεν απεικονίζονται μέσω της εντολής zfs get all. Οι χρήστες εκτός του root μπορούν να δουν μόνο τα δικά τους quotas εκτός αν τους έχει αποδοθεί το προνόμιο userquota. Οι χρήστες με αυτό το προνόμιο μπορούν να δουν και να ρυθμίσουν τo quota οποιουδήποτε χρήστη. Το quota ομάδας περιορίζει το διαθέσιμο χώρο που μπορεί να χρησιμοποιηθεί από μια συγκεκριμένη ομάδα χρηστών. Η γενική μορφή είναι groupquota@group=size. Για να θέσετε quota για την ομάδα χρηστών firstgroup τα 50 GB, χρησιμοποιήστε την παρακάτω εντολή: &prompt.root; zfs set groupquota@firstgroup=50G Για να αφαιρέσετε το quota ή να βεβαιωθείτε ότι δεν έχει τεθεί, χρησιμοποιήστε την εντολή: &prompt.root; zfs set groupquota@firstgroup=none Όπως και με την ιδιότητα quota χρηστών, οι χρήστες εκτός του root μπορούν να δουν μόνο τα quota που σχετίζονται με τις ομάδες στις οποίες ανήκουν. Ωστόσο, ο χρήστης root και κάθε χρήστης στον οποίο έχει δοθεί το προνόμιο groupquota μπορεί να δει και να ρυθμίσει τα quota για όλες τις ομάδες. Η υπο-εντολή zfs userspace απεικονίζει την ποσότητα χώρου που καταναλώνει κάθε χρήστης στο συγκεκριμένο σύστημα αρχείων ή στιγμιότυπο καθώς και το καθορισμένο quota. Η υπο-εντολή zfs groupspace εκτελεί ακριβώς το ίδιο για ομάδες χρηστών. Για περισσότερες πληροφορίες σχετικά με τις επιλογές εκτέλεσης ή απεικόνισης αυτών των εντολών, δείτε το &man.zfs.1;. Για να δειτε το quota για το storage/home/bob, αν έχετε τα σωστά προνόμια ή είστε ο root, χρησιμοποιήστε την παρακάτω εντολή: &prompt.root; zfs get quota storage/home/bob Κρατήσεις Χώρου (reservations) στο ZFS Το ZFS υποστηρίζει δύο τύπους κρατήσεων χώρου. Σε αυτή την ενότητα θα εξηγήσουμε τις βασικές έννοιες κάθε τύπο και θα δώσουμε κάποιες οδηγίες χρήσης. Η ιδιότητα reservation μας επιτρέπει να διαφυλάξουμε κάποιο εγγυημένο ελάχιστο ποσό χώρου για ένα dataset και τους απογόνους του. Αυτό σημαίνει ότι αν τεθεί κράτηση χώρου 10 GB στο storage/home/bob και ο διαθέσιμος χώρος του δίσκου καταστεί ελάχιστος, θα διαφυλαχθούν τουλάχιστον 10 GB χώρου για αυτό το dataset. Η ιδιότητα refreservation θέτει ή δείχνει την ελάχιστη ποσότητα χώρου που έχει κρατηθεί για ένα dataset χωρίς τους απογόνους του (π.χ. τα στιγμιότυπα). Για παράδειγμα, για να πάρετε ένα στιγμιότυπο του storage/home/bob θα πρέπει να έχετε επαρκή χώρο εκτός της ποσότητας refreservation για να εκτελέσετε επιτυχώς τη λειτουργία. Οι απόγονοι του κυρίου dataset δεν προσμετρώνται από την ιδιότητα refreservation και δεν καταπατούν τον ελεύθερο χώρο του. Οι κρατήσεις κάθε τύπου είναι χρήσιμες σε πολλές περιπτώσεις, για παράδειγμα στο σχεδιασμό και δοκιμή καταλληλότητας της κατανομής χώρου σε ένα νέο σύστημα ή την εξασφάλιση διαθεσιμότητας αρκετού ελεύθερου χώρου σε ένα σύστημα για λειτουργίες ανάκτησης δεδομένων (recovery). Η γενική μορφή της ιδιότητας reservation είναι reservation=size. Για να θέσετε κράτηση 10 GB στο storage/home/bob χρησιμοποιήστε την παρακάτω εντολή: &prompt.root; zfs set reservation=10G storage/home/bob Για να αφαιρέσετε ένα reservation ή να βεβαιωθείτε ότι δεν έχει τεθεί, εκτελέστε την εντολή: &prompt.root; zfs set reservation=none storage/home/bob Μπορείτε να εφαρμόσετε την ίδια βασική αρχή και για να θέσετε την ιδιότητα refreservation, χρησιμοποιώντας τη γενική μορφή refreservation=size. Για να ελέγξετε αν υπάρχουν reservations ή refreservations στο storage/home/bob, εκτελέστε μια από τις παρακάτω εντολές: &prompt.root; zfs get reservation storage/home/bob &prompt.root; zfs get refreservation storage/home/bob Συστήματα Αρχείων &linux; Αυτή η ενότητα περιγράφει κάποια από τα συστήματα αρχείων του &linux; που υποστηρίζονται από το &os;. Ext2FS Η υλοποίηση του συστήματος αρχείων &man.ext2fs.5; στον πυρήνα, γράφηκε από τον Godmar Back και το πρόγραμμα οδήγησης εμφανίστηκε για πρώτη φορά στο &os; 2.2. Στο &os; 8 και στις προηγούμενες εκδόσεις, ο κώδικας ήταν υπό την άδεια GNU Public License, ωστόσο στο &os; 9 o κώδικας γράφτηκε ξανά και είναι πλέον υπό την άδεια BSD. Το πρόγραμμα οδήγησης &man.ext2fs.5; επιτρέπει στον πυρήνα του &os; τόσο να διαβάζει όσο και να γράφει σε συστήματα αρχείων ext2. Αρχικά, φορτώστε το άρθρωμα στον πυρήνα: &prompt.root; kldload ext2fs Για να προσαρτήσετε έπειτα ένα τόμο &man.ext2fs.5; που βρίσκεται στο /dev/ad1s1: &prompt.root; mount -t ext2fs /dev/ad1s1 /mnt XFS Το σύστημα αρχείων Χ, XFS γράφτηκε αρχικά από την SGI για το λειτουργικό IRIX και μεταφέρθηκε στο &linux;. Ο πηγαίος κώδικας είναι διαθέσιμος υπό την άδεια GNU Public License. Δείτε αυτή τη σελίδα για περισσότερες πληροφορίες. Η μεταφορά στο &os; ξεκίνησε από τους Russel Cattelan, &a.kan; και &a.rodrigc;. Για να φορτώσετε το XFS ως άρθρωμα στον πυρήνα: &prompt.root; kldload xfs Το πρόγραμμα οδήγησης &man.xfs.5; επιτρέπει στον πυρήνα του &os; να έχει πρόσβαση σε συστήματα αρχείων XFS. Ωστόσο, τη δεδομένη στιγμή, επιτρέπει πρόσβαση μόνο για ανάγνωση. Η εγγραφή δεν είναι δυνατή. Για να προσαρτήσετε ένα τόμο &man.xfs.5; που βρίσκεται στο /dev/ad1s1, εκτελέστε την παρακάτω εντολή: &prompt.root; mount -t xfs /dev/ad1s1 /mnt Καλό είναι επίσης να γνωρίζετε ότι το port sysutils/xfsprogs περιέχει το βοηθητικό πρόγραμμα mkfs.xfs το οποίο επιτρέπει τη δημιουργία συστημάτων αρχείων XFS. Το port επίσης παρέχει προγράμματα για έλεγχο και επισκευή αυτών των συστημάτων αρχείων. Μπορείτε να χρησιμοποίησετε την παράμετρο -p στην εντολή mkfs.xfs για να δημιουργήσετε ένα σύστημα αρχείων &man.xfs.5; το οποίο να περιέχει αρχεία και άλλα μετα-δεδομένα. Mε αυτό τον τρόπο μπορείτε να δημιουργήσετε ένα σύστημα αρχείων μόνο ανάγνωσης για δοκιμή με το &os;. ReiserFS To σύστημα αρχείων Reiser, ReiserFS, μεταφέρθηκε στο &os; από τον &a.dumbbell; και είναι υπό την άδεια GNU Public License. Το πρόγραμμα οδήγησης για το ReiserFS επιτρέπει στον πυρήνα του &os; να έχει πρόσβαση ανάγνωσης στα αντίστοιχα συστήματα αρχείων αλλά τη δεδομένη στιγμή δεν επιτρέπει εγγραφή δεδομένων. Φορτώστε αρχικά το άρθρωμα του πυρήνα: &prompt.root; kldload reiserfs Για να προσαρτήσετε ένα τόμο ReiserFS από το /dev/ad1s1: &prompt.root; mount -t reiserfs /dev/ad1s1 /mnt