Εικονικά συστήματα αρχείων στο Linux: γιατί χρειάζονται και πώς λειτουργούν; Μέρος 2

Γεια σε όλους, μοιραζόμαστε μαζί σας το δεύτερο μέρος της δημοσίευσης "Εικονικά συστήματα αρχείων στο Linux: γιατί χρειάζονται και πώς λειτουργούν;" Μπορείτε να διαβάσετε το πρώτο μέρος εδώ. Να σας υπενθυμίσουμε ότι αυτή η σειρά δημοσιεύσεων έχει προγραμματιστεί να συμπέσει με την έναρξη μιας νέας ροής στο μάθημα "Διαχειριστής Linux", που ξεκινά πολύ σύντομα.

Πώς να παρακολουθείτε το VFS χρησιμοποιώντας εργαλεία eBPF και bcc

Ο ευκολότερος τρόπος για να κατανοήσετε πώς λειτουργεί ο πυρήνας σε αρχεία sysfs είναι να το δείτε στην πράξη και ο ευκολότερος τρόπος για να παρακολουθήσετε το ARM64 είναι να χρησιμοποιήσετε το eBPF. Το eBPF (συντομογραφία του φίλτρου πακέτων Berkeley) αποτελείται από μια εικονική μηχανή που λειτουργεί μέσα πυρήνας, το οποίο μπορούν να ζητήσουν οι προνομιούχοι χρήστες (query) από τη γραμμή εντολών. Οι πηγές του πυρήνα λένε στον αναγνώστη τι μπορεί να κάνει ο πυρήνας. Η εκτέλεση των εργαλείων eBPF σε ένα φορτωμένο σύστημα δείχνει τι πραγματικά κάνει ο πυρήνας.

Εικονικά συστήματα αρχείων στο Linux: γιατί χρειάζονται και πώς λειτουργούν; Μέρος 2

Ευτυχώς, η έναρξη χρήσης του eBPF είναι αρκετά εύκολη με τη βοήθεια εργαλείων bcc, τα οποία διατίθενται ως πακέτα από τη γενική διανομή Linux και τεκμηριώνεται αναλυτικά Μπέρναρντ Γκρεγκ. Εργαλεία bcc είναι σενάρια Python με μικρές εισαγωγές κώδικα C, που σημαίνει ότι όποιος γνωρίζει και τις δύο γλώσσες μπορεί εύκολα να τις τροποποιήσει. ΣΕ bcc/tools Υπάρχουν 80 σενάρια Python, που σημαίνει ότι πιθανότατα ένας προγραμματιστής ή ένας διαχειριστής συστήματος θα μπορεί να επιλέξει κάτι κατάλληλο για την επίλυση του προβλήματος.
Για να έχετε τουλάχιστον μια επιφανειακή ιδέα για το τι δουλειά κάνουν τα VFS σε ένα σύστημα που λειτουργεί, δοκιμάστε vfscount ή vfsstat. Αυτό θα δείξει, ας πούμε, ότι δεκάδες κλήσεις vfs_open() και «οι φίλοι του» συμβαίνουν κυριολεκτικά κάθε δευτερόλεπτο.

Εικονικά συστήματα αρχείων στο Linux: γιατί χρειάζονται και πώς λειτουργούν; Μέρος 2

vfsstat.py είναι ένα σενάριο Python με ένθετα κώδικα C που μετράει απλώς τις κλήσεις συναρτήσεων VFS.

Ας δώσουμε ένα πιο ασήμαντο παράδειγμα και ας δούμε τι συμβαίνει όταν εισάγουμε μια μονάδα flash USB σε έναν υπολογιστή και το σύστημα την ανιχνεύει.

Εικονικά συστήματα αρχείων στο Linux: γιατί χρειάζονται και πώς λειτουργούν; Μέρος 2

Χρησιμοποιώντας το eBPF μπορείτε να δείτε τι συμβαίνει /sysόταν έχει τοποθετηθεί μια μονάδα flash USB. Ένα απλό και σύνθετο παράδειγμα παρουσιάζεται εδώ.

Στο παράδειγμα που φαίνεται παραπάνω, bcc εργαλείο trace.py εκτυπώνει ένα μήνυμα όταν εκτελείται η εντολή sysfs_create_files(). Το βλέπουμε αυτό sysfs_create_files() κυκλοφόρησε χρησιμοποιώντας kworker ροή ως απάντηση στο γεγονός ότι είχε εισαχθεί η μονάδα flash, αλλά ποιο αρχείο δημιουργήθηκε; Το δεύτερο παράδειγμα δείχνει τη δύναμη του eBPF. Εδώ trace.py Εκτυπώνει ένα backtrace του πυρήνα (επιλογή-K) και το όνομα του αρχείου που δημιουργήθηκε sysfs_create_files(). Η εισαγωγή μιας δήλωσης είναι κώδικας C που περιλαμβάνει μια συμβολοσειρά μορφής εύκολα αναγνωρίσιμη που παρέχεται από το σενάριο Python που εκτελεί το LLVM just-in-time compiler. Μεταγλωττίζει αυτή τη γραμμή και την εκτελεί σε μια εικονική μηχανή μέσα στον πυρήνα. Πλήρης υπογραφή λειτουργίας sysfs_create_files () πρέπει να αναπαραχθεί στη δεύτερη εντολή έτσι ώστε η συμβολοσειρά μορφοποίησης να μπορεί να αναφέρεται σε μία από τις παραμέτρους. Τα σφάλματα σε αυτό το κομμάτι του κώδικα C έχουν ως αποτέλεσμα αναγνωρίσιμα σφάλματα από τον μεταγλωττιστή C. Για παράδειγμα, εάν παραληφθεί η παράμετρος -l, θα δείτε "Αποτυχία μεταγλώττισης κειμένου BPF". Οι προγραμματιστές που είναι εξοικειωμένοι με τη C και την Python θα βρουν τα εργαλεία bcc εύκολο να επεκταθεί και να αλλάξει.

Όταν τοποθετηθεί η μονάδα USB, το backtrace του πυρήνα θα δείξει ότι το PID 7711 είναι ένα νήμα kworkerπου δημιούργησε το αρχείο «events» в sysfs. Αντίστοιχα, η κλήση από sysfs_remove_files() θα δείξει ότι η αφαίρεση της μονάδας είχε ως αποτέλεσμα τη διαγραφή του αρχείου events, που αντιστοιχεί στη γενική έννοια της καταμέτρησης αναφοράς. Ταυτόχρονα, η προβολή sysfs_create_link () με το eBPF κατά την εισαγωγή της μονάδας USB θα δείξει ότι έχουν δημιουργηθεί τουλάχιστον 48 συμβολικοί σύνδεσμοι.

Ποιο είναι λοιπόν το νόημα του αρχείου συμβάντων; Χρήση cscope Για αναζήτηση __device_add_disk(), δείχνει τι προκαλεί disk_add_events (), και είτε "media_change"Ή "eject_request" μπορεί να καταγραφεί σε ένα αρχείο συμβάντος. Εδώ το επίπεδο μπλοκ πυρήνα ενημερώνει το userspace ότι έχει εμφανιστεί και εξαχθεί ένας "δίσκος". Σημειώστε πόσο κατατοπιστική είναι αυτή η μέθοδος έρευνας με την εισαγωγή μιας μονάδας USB, σε σύγκριση με την προσπάθεια να καταλάβετε πώς λειτουργούν τα πράγματα καθαρά από την πηγή.

Τα συστήματα αρχείων ρίζας μόνο για ανάγνωση ενεργοποιούν ενσωματωμένες συσκευές

Φυσικά, κανείς δεν απενεργοποιεί τον διακομιστή ή τον υπολογιστή του τραβώντας το φις από την πρίζα. Μα γιατί? Αυτό συμβαίνει επειδή τα προσαρτημένα συστήματα αρχείων σε φυσικές συσκευές αποθήκευσης ενδέχεται να έχουν καθυστερήσει την εγγραφή και οι δομές δεδομένων που καταγράφουν την κατάστασή τους ενδέχεται να μην συγχρονίζονται με εγγραφές στο χώρο αποθήκευσης. Όταν συμβεί αυτό, οι κάτοχοι συστήματος πρέπει να περιμένουν μέχρι την επόμενη εκκίνηση για να ξεκινήσει το βοηθητικό πρόγραμμα. fsck filesystem-recovery και, στη χειρότερη περίπτωση, απώλεια δεδομένων.

Ωστόσο, όλοι γνωρίζουμε ότι πολλές συσκευές IoT, καθώς και δρομολογητές, θερμοστάτες και αυτοκίνητα, τρέχουν πλέον Linux. Πολλές από αυτές τις συσκευές έχουν ελάχιστη έως καθόλου διεπαφή χρήστη και δεν υπάρχει τρόπος να τις απενεργοποιήσετε "καθαρά". Φανταστείτε να ξεκινάτε ένα αυτοκίνητο με άδεια μπαταρία όταν η μονάδα ελέγχου είναι ρεύμα Linux πηδώντας συνεχώς πάνω κάτω. Πώς γίνεται να εκκινεί το σύστημα χωρίς μακρύ fsckπότε αρχίζει να λειτουργεί τελικά ο κινητήρας; Και η απάντηση είναι απλή. Οι ενσωματωμένες συσκευές βασίζονται στο ριζικό σύστημα αρχείων μόνο για διάβασμα (συντομογραφία ro-rootfs (σύστημα αρχείων root μόνο για ανάγνωση)).

ro-rootfs προσφέρουν πολλά οφέλη που είναι λιγότερο προφανή από την αυθεντικότητα. Ένα πλεονέκτημα είναι ότι το κακόβουλο λογισμικό δεν μπορεί να εγγράψει /usr ή /lib, εάν καμία διαδικασία Linux δεν μπορεί να γράψει εκεί. Ένα άλλο είναι ότι ένα σε μεγάλο βαθμό αμετάβλητο σύστημα αρχείων είναι κρίσιμο για την υποστήριξη πεδίου απομακρυσμένων συσκευών, καθώς το προσωπικό υποστήριξης βασίζεται σε τοπικά συστήματα που είναι ονομαστικά πανομοιότυπα με τα συστήματα πεδίου. Ίσως το πιο σημαντικό (αλλά και το πιο ύπουλο) όφελος είναι ότι το ro-rootfs αναγκάζει τους προγραμματιστές να αποφασίσουν ποια αντικείμενα συστήματος θα είναι αμετάβλητα στο στάδιο του σχεδιασμού του συστήματος. Η εργασία με ro-rootfs μπορεί να είναι δύσκολη και επίπονη, καθώς οι μεταβλητές const είναι συχνά σε γλώσσες προγραμματισμού, αλλά τα οφέλη τους δικαιολογούν εύκολα την πρόσθετη επιβάρυνση.

δημιουργία rootfs Το μόνο για ανάγνωση απαιτεί λίγη επιπλέον προσπάθεια για τους ενσωματωμένους προγραμματιστές και αυτό είναι όπου το VFS εμφανίζεται στην εικόνα. Το Linux απαιτεί να είναι μέσα τα αρχεία /var ήταν εγγράψιμα, και επιπλέον, πολλές δημοφιλείς εφαρμογές που εκτελούν ενσωματωμένα συστήματα θα προσπαθήσουν να δημιουργήσουν διαμόρφωση dot-files в $HOME. Μια λύση για τα αρχεία διαμόρφωσης στον αρχικό κατάλογο είναι συνήθως η προ-δημιουργία και η ενσωμάτωσή τους rootfs. Για /var Μια πιθανή προσέγγιση είναι να το τοποθετήσετε σε ξεχωριστό εγγράψιμο διαμέρισμα, ενώ / τοποθετημένο μόνο για ανάγνωση. Μια άλλη δημοφιλής εναλλακτική είναι να χρησιμοποιήσετε βάσεις σύνδεσης ή επικάλυψης.

Συνδεόμενες και στοιβαζόμενες βάσεις, χρήση τους από δοχεία

Εκτέλεση εντολής man mount είναι ο καλύτερος τρόπος για να μάθετε για τις συνδέσεις και τις επικαλυπτόμενες βάσεις, οι οποίες δίνουν στους προγραμματιστές και τους διαχειριστές συστήματος τη δυνατότητα να δημιουργήσουν ένα σύστημα αρχείων σε μια διαδρομή και στη συνέχεια να το εκθέσουν σε εφαρμογές σε άλλη. Για τα ενσωματωμένα συστήματα, αυτό σημαίνει τη δυνατότητα αποθήκευσης αρχείων /var σε μια μονάδα flash μόνο για ανάγνωση, αλλά μια διαδρομή επικάλυψης ή σύνδεσης από tmpfs в /var κατά τη φόρτωση, θα επιτρέψει στις εφαρμογές να γράφουν σημειώσεις εκεί (σκραλλ). Την επόμενη φορά που θα ενεργοποιήσετε τις αλλαγές σε /var θα χαθεί. Μια βάση επικάλυψης δημιουργεί μια ένωση μεταξύ tmpfs και το υποκείμενο σύστημα αρχείων και σας επιτρέπει να κάνετε φαινομενικές αλλαγές σε υπάρχοντα αρχεία ro-tootf ενώ μια δεμένη βάση μπορεί να αδειάσει τα νέα tmpfs φακέλους ορατοί ως εγγράψιμοι σε ro-rootfs τρόπους. Ενώ overlayfs αυτό είναι το σωστό (proper) ο τύπος συστήματος αρχείων, η σύνδεση με δυνατότητα σύνδεσης υλοποιείται σε Χώρος ονομάτων VFS.

Με βάση την περιγραφή της επικάλυψης και της συνδεόμενης βάσης, κανείς δεν εκπλήσσεται γι' αυτό Κοντέινερ Linux χρησιμοποιούνται ενεργά. Ας δούμε τι συμβαίνει όταν χρησιμοποιούμε systemd-nspawn για να τρέξετε το δοχείο χρησιμοποιώντας το εργαλείο mountsnoop από bcc.

Πρόκληση system-nspawn εκκινεί το δοχείο κατά τη λειτουργία mountsnoop.py.

Ας δούμε τι έγινε:

Запуск mountsnoop ενώ το κοντέινερ "εκκινεί" δείχνει ότι ο χρόνος εκτέλεσης του κοντέινερ εξαρτάται σε μεγάλο βαθμό από τη συνδεδεμένη βάση (Εμφανίζεται μόνο η αρχή της μεγάλης εξόδου).

Εδώ systemd-nspawn παρέχει επιλεγμένα αρχεία procfs и sysfs host to container ως μονοπάτια προς αυτό rootfs... εκτός MS_BIND σημαία που ρυθμίζει τη βάση σύνδεσης, ορισμένες άλλες σημαίες στη βάση καθορίζουν τη σχέση μεταξύ των αλλαγών στους χώρους ονομάτων του κεντρικού υπολογιστή και του κοντέινερ. Για παράδειγμα, μια συνδεδεμένη βάση μπορεί είτε να παραλείψει τις αλλαγές σε /proc и /sys στο κοντέινερ ή κρύψτε τα ανάλογα με την κλήση.

Συμπέρασμα

Η κατανόηση των εσωτερικών λειτουργιών του Linux μπορεί να φαίνεται σαν αδύνατη εργασία, καθώς ο ίδιος ο πυρήνας περιέχει μια τεράστια ποσότητα κώδικα, αφήνοντας κατά μέρος εφαρμογές χώρου χρήστη Linux και διεπαφές κλήσεων συστήματος σε βιβλιοθήκες C, όπως π.χ. glibc. Ένας τρόπος για να σημειώσετε πρόοδο είναι να διαβάσετε τον πηγαίο κώδικα ενός υποσυστήματος πυρήνα, με έμφαση στην κατανόηση των κλήσεων συστήματος και των κεφαλίδων του χώρου χρήστη, καθώς και των κύριων εσωτερικών διεπαφών του πυρήνα, όπως ο πίνακας file_operations. Οι λειτουργίες αρχείων παρέχουν την αρχή "όλα είναι ένα αρχείο", καθιστώντας τα ιδιαίτερα ευχάριστα στη διαχείρισή τους. Αρχεία προέλευσης πυρήνα C στον κατάλογο ανώτατου επιπέδου fs/ παρουσιάζουν μια υλοποίηση εικονικών συστημάτων αρχείων, τα οποία είναι ένα στρώμα περιτυλίγματος που παρέχει ευρεία και σχετικά απλή συμβατότητα μεταξύ δημοφιλών συστημάτων αρχείων και συσκευών αποθήκευσης. Η σύνδεση και η τοποθέτηση επικάλυψης μέσω χώρων ονομάτων Linux είναι η μαγεία του VFS που καθιστά δυνατή τη δημιουργία κοντέινερ μόνο για ανάγνωση και ριζικών συστημάτων αρχείων. Σε συνδυασμό με την εξέταση του πηγαίου κώδικα, του βασικού εργαλείου eBPF και της διεπαφής του bcc
κάνοντας την εξερεύνηση του πυρήνα πιο εύκολη από ποτέ.

Φίλοι, γράψτε, σας ήταν χρήσιμο αυτό το άρθρο; Ίσως έχετε κάποια σχόλια ή παρατηρήσεις; Και όσοι ενδιαφέρονται για το μάθημα Linux Administrator καλούνται να Open Day, που θα πραγματοποιηθεί στις 18 Απριλίου.

Πρώτο μέρος.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο