Μοιρασμα αρχείων με NFS και autofs

Στο παρόν δείχνω πως μπορείς να μοιράσεις αρχεία και καταλόγους μεταξύ UNIX, άρα και Linux :grin: συστήματα μέσω του NFS. Το NFS είναι ο κλασσικός τρόπος μοιράσματος αρχείων στα συστηματα με UNIX. Πρώτα μερικές παρατηρήσεις

  • Ο τρόπος αυτός λειτουργεί μεταξύ υπολογιστών με UNIX. Αν θέλεις να μοιράσεις με Windows υπήρχαν παλιά τα Windows Services for UNIX αλλά έχει πάψει η Microsoft να τα υποστηρίζει εδώ και αιώνες. Σε κάποιες σημερινές εκδόσεις των Windows 10 μοιάζει να υπάρχει κάποια υποστήριξη αλλά δεν την έχω δοκιμάσει. Στα Mac υπάρχει επίσης υποστήριξη, αλλά πάλι μην με ρωτάτε. Σε αυτές τις περιπτώσεις θα πρέπει ίσως να δεις την samba.

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

Εργασία στον server

Έχουμε ένα υπολογιστή τον litlefinger που δεν είναι πάντα ανοικτός, αλλά έχουμε τον έχουμε ρυθμίσει ώστε να έχει πάντα την ίδια σταθερή IP 192.168.1.104. Θέλουμε να είναι προσβάσιμος ο κατάλογος /home. Είμαστε ο μόνος χρήστης που υπάρχει (ή εναλλακτικά υπάρχει η ίδια αντιστοίχηση χρηστών με αριθμό id). Οι προϋποθέσεις αυτές καλύπτουν εύκολα σχεδόν όλα τα οικιακά δίκτυα. Οι οδηγίες είναι για διανομές βασισμένες στο debian :debian: και ubuntu :ubuntu: , αλλά πάνω κάτω τα ίδια είναι για τις άλλες διανομές.

Τα παρακάτω απαιτούν μια εξοικείωση με το τερματικό και να καταλαβαίνεις πάνω κάτω τι κάνουν οι εντολές.

Πρώτα θα εγκαταστήσουμε τον NFS στον server

sudo apt-get install nfs-kernel-server

και στην συνέχεια θα κάνουμε εξαγωγή κάποιους καταλόγους. Θα ανοίξουμε με κάποιον editor με δικαιώματα root το αρχείο /etc/exports (πχ sudo xed /etc/exports ) και θα προσθέσουμε μια γραμμή ανά κατάλογο που θέλουμε να εξάγουμε. Στο παράδειγμα μας αρκεί μια γραμμή

/home *(rw,sync)

Στην συνέχεια θα επανεκινήσουμε την υπηρεσία

systemctl restart nfs-kernel-server
sudo exportfs

Αν έχουμε ενεργό το firewall θα πρέπει να ανοίξουμε την πόρτα με αριθμό 2049.

sudo ufu status
sudo ufw allow to any port nfs
sudo ufu status

Εργασία τον client

Πάμε τώρα στον υπολογιστή που θέλουμε να δούμε τα αρχεία. Πρώτα θα φτιάξουμε τον κατάλογο που θα συνδεθούν και θα εγκαταστήσουμε το πακέτο.

sudo mkdir -p  /mnt/nfs/litlefinger
sudo apt-get install nfs-common

Τώρα μπορούμε να κάνουμε την σύνδεση

sudo mount 192.168.1.104:/home /mnt/nfs/litlefinger

και να ελέγξουμε αν όλα πήγαν καλά

ls /mnt/nfs/litlefinger 
echo "Hello nfs" > /mnt/nfs/litlefinger/talos/nfs_tests.txt
sudo umount /mnt/nfs/litlefinger

Αν τα πάντα δούλεψαν έχουμε δύο επιλογές. Στην περίπτωση που ο υπολογιστής που μοιράζει τα αρχεία είναι μόνιμα αναμμένος, αρκεί μια καταχώρηση στο /etc/fstab σαν την παρακάτω

  192.168.1.104:/home   /mnt/nfs/litlefinger nfs  rw,tcp,auto,nofail,timeout=60   0  0

και δεν βλάπτει να γίνει ένα ελεγχος

sudo mount -a
mount

Αν ο υπολογιστής αυτός είναι κλειστός θα έχουμε όμως μια σημαντική καθυστέρηση στην εκκίνηση. Μπορούμε βέβαια πάντα όμως να αλλάξουμε το nofail με noauto και να κάνουμε την σύνδεση χειροκίνητα κάθε φορά.

Σύνδεση με autofs

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

sudo apt-get install autofs
sudo service autofs stop
sudo automount -f -v

Για λίγο μέχρι να το ρυθμίσουμε σταμάτησα την σχετική υπηρεσία, και έτρεξα την εντολή automount με το χέρι ώστε να βλέπουμε τι συμβαίνει. Θα ανοίξουμε ένα άλλο τερματικό για την συνέχεια.

Παρατήρησα κάποια κολλήματα με το zsh και το autocompletion όταν πήγα να κάνω cd. Οπότε δοκιμές με bash ή με κάποιο γραφικό filemanager.

Θα ανοίξουμε το αρχείο /etc/auto.master (πχ sudo xed /etc/auto.master ) και θα προσθέσουμε μια γραμμή

/mnt/nfs     /etc/auto.nfs

Το αρχείο /etc/auto.nfs δεν υπάρχει και θα το φτιάξουμε αμέσως τώρα. Θα περιέχει μια γραμμή

litlefinger   -fstype=nfs4,rw  192.168.1.104:/home

και αυτό ήταν. Ένα

ls  /mnt/nfs/litlefinger

θα μας πείσει.

Ερώτηση : Ενώ είναι φανερό το πλεονέκτημα που έχει το NFS και το autofs στην απλούστευση (ένα απλό mount) για τη σύνδεση, από άποψη ταχύτητας σε σχέση με SFTP και Samba έχει καμιά διαφορά; Χρησιμοποιεί καλύτερα π.χ. το bandwith του δικτύου μας για μεταφορά αρχείων; Καθαρά από περιέργεια, δεν το έχω δοκιμάσει ακόμα.

Σύγκριση δεν μπορώ να κάνω, μιας και samba χρησιμοποιήσα πολύ παλιά και ελάχιστα, οπότε δεν έχω ανάμνηση (πέραν του πόνου και της τσατίλας).
Πάντως, με το nfs στο τοπικό μου lan στο σπίτι τελικιάζω το gigabit δίκτυο. Ανηλεώς…
Οπότε το ερώτημα είναι: η samba κοραίνει gigabit δίκτυο? Αν όχι, έχεις την απάντησή σου. Αν ναι, τότε το θέμα δεν μας πολυαφορά…

TL&DR:

Χρησιμοποίησε nfs (με ή χωρίς autofs) αν δεν σε απασχολούν τα windows και είσαι σε ένα μικρό οικιακό δίκτυο. Χρησιμοποίησε samba/cifs, χωρίς domain αν έχεις και windows. Σε εταιρικά περιβάλλοντα εμπιστέψου την γνώμη κάποιου επαγγελματία.

Δεν μπορείς να μιλάς χωρίς δεδομένα, τα οποία και δεν έχω αλλά (ελπίζοντας και πως δεν λέω καμιά χοντρή πατάτα) :

  • Κατ αρχήν το sftp και το ssh δεν έχουν φτιαχτεί για να κάνεις μοίρασμα αρχείων, έχουν φτιαχτεί για μεταφορές αρχείων. Επιπλέον δεν είναι μέσα στον πυρήνα, αλλά υλοποιούνται σε user space μέσω του fuse. To ssh θα κάνει επιπλέον και μια κρυπτογράφηση που σου είναι άχρηστη.
    Επίσης σκέψου ένα σενάριο, όπου έχεις τα αρχεία μιας μεγάλης βάσης δεδομένων σε ένα τέτοιο κατάλογο. Πως μπορεί να γίνει αυτό; Πως μπορούν αυτά τα ίδια αρχεία να τα μοιραστούν δύο βάσεις σε δυο διαφορετικούς υπολογιστές;
    Επομένως τα αφήνουμε στην άκρη και εκτός σύγκρισης. Έχουν βέβαια την χρησιμότητα τους, αλλά αυτή είναι περιορισμένη. Για μουσικές, βίντεο, αρχεία κειμένου κλπ είναι μια χαρά , αλλά μέχρι εκεί.

  • Το πραγματικό ερώτημα είναι μεταξύ nfs και cifs/samba. Το δεύτερο είναι ποιο πολύπλοκο πρωτόκολλο, οπότε δεν θα εκπλαγώ αν αποδειχθεί ποιο αργό. Αλλά επίσης δεν θα εκπλαγώ αν αυτή η διαφορά είναι στην πράξη μη μετρήσιμη και αδιάφορη. Περισσότερο θα με απασχολούσε για την επιλογή το αν θέλω χρήση από μη UNIX συστήματα ή όχι, καθώς και ο τρόπος με τον οποίο θα κάνω χειρισμό της ταυτότητας των χρηστών, σε εταιρικά περιβάλλοντα, για να επιλέξω.

Συμφωνα με το benchmark το NFS ειναι πιο γρηγορο σε πολυ μικρα αρχεια. Αλλα απο καποια MB και πανω η διαφορα δεν ειναι καν αισθητη, ενω σε αρχεια κοντα στο GB δεν υπαρχει καμια διαφορα.

Το NFS απο μια μικρη εμπειρια που ειχα ειναι πολυ γρηγορο σε αρχιτεκτονικες ARM και επεξεργαστες με χαμηλες επιδοσεις ακομη και σε μεγαλα αρχεια.