Πώς να χρησιμοποιήσετε το Udev για ανίχνευση και διαχείριση συσκευών στο Linux


Το Udev (χώρος χρήστη /dev) είναι ένα υποσύστημα Linux για δυναμικό εντοπισμό και διαχείριση συσκευών, από την έκδοση του πυρήνα 2.6. Είναι μια αντικατάσταση των devfs και hotplug.

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

Η λειτουργία του είναι 1) να παρέχει στις εφαρμογές του συστήματος συμβάντα συσκευής, 2) να διαχειρίζεται τα δικαιώματα των κόμβων της συσκευής και 3) να δημιουργεί χρήσιμους συμβολικούς συνδέσμους στον κατάλογο /dev για πρόσβαση σε συσκευές ή ακόμη και να μετονομάζει διεπαφές δικτύου .

Ένα από τα πλεονεκτήματα του udev είναι ότι μπορεί να χρησιμοποιεί μόνιμα ονόματα συσκευών για να εγγυάται τη συνεπή ονομασία των συσκευών κατά τις επανεκκινήσεις, παρά τη σειρά ανακάλυψής τους. Αυτή η δυνατότητα είναι χρήσιμη επειδή ο πυρήνας απλώς εκχωρεί απρόβλεπτα ονόματα συσκευών με βάση τη σειρά ανακάλυψης.

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

Μάθετε τα βασικά του Udev στο Linux

Ο δαίμονας udev, systemd-udevdsystemd-udevd.service) επικοινωνεί με τον πυρήνα και λαμβάνει συμβάντα της συσκευής > απευθείας από αυτό κάθε φορά που προσθέτετε ή αφαιρείτε μια συσκευή από το σύστημα ή μια συσκευή αλλάζει την κατάστασή της.

Το Udev βασίζεται σε κανόνες – οι κανόνες του είναι ευέλικτοι και πολύ ισχυροί. Κάθε λαμβανόμενο συμβάν συσκευής αντιστοιχίζεται με το σύνολο κανόνων που διαβάζονται από αρχεία που βρίσκονται στα /lib/udev/rules.d και /run/udev/rules.d.

Μπορείτε να γράψετε αρχεία προσαρμοσμένων κανόνων στον κατάλογο /etc/udev/rules.d/ (τα αρχεία πρέπει να τελειώνουν με την επέκταση .rules) για να επεξεργαστείτε μια συσκευή. Σημειώστε ότι τα αρχεία κανόνων σε αυτόν τον κατάλογο έχουν την υψηλότερη προτεραιότητα.

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

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

Το κύριο αρχείο διαμόρφωσης για το udev είναι το /etc/udev/udev.conf και για να ελέγξετε τη συμπεριφορά χρόνου εκτέλεσης του δαίμονα udev, μπορείτε να χρησιμοποιήσετε το βοηθητικό πρόγραμμα udevadm.

Για να εμφανίσετε συμβάντα (uevents) και συμβάντα udev (τα οποία το udev στέλνει μετά την επεξεργασία του κανόνα), εκτελέστε το udevadm > με την εντολή monitor. Στη συνέχεια, συνδέστε μια συσκευή στο σύστημά σας και παρακολουθήστε, από το τερματικό, πώς γίνεται ο χειρισμός του συμβάντος της συσκευής.

Το ακόλουθο στιγμιότυπο οθόνης δείχνει ένα απόσπασμα ενός συμβάντος ΠΡΟΣΘΗΚΗ μετά τη σύνδεση ενός δίσκου flash USB στο δοκιμαστικό σύστημα:

udevadm monitor 

Για να βρείτε το όνομα που έχει εκχωρηθεί στον δίσκο USB σας, χρησιμοποιήστε το βοηθητικό πρόγραμμα lsblk που διαβάζει το σύστημα αρχείων sysfs και το udev db για τη συλλογή πληροφοριών σχετικά με επεξεργασμένες συσκευές.

 
lsblk

Από την έξοδο της προηγούμενης εντολής, ο δίσκος USB ονομάζεται sdb1 (η απόλυτη διαδρομή θα πρέπει να είναι /dev/sdb1). Για να αναζητήσετε τα χαρακτηριστικά της συσκευής από τη βάση δεδομένων udev, χρησιμοποιήστε την εντολή πληροφοριών.

udevadm info /dev/sdb1

Πώς να εργαστείτε με τους κανόνες Udev στο Linux

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

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

Ας ξεκινήσουμε δημιουργώντας τα δύο σενάρια:

sudo vim /bin/device_added.sh

Προσθέστε τις ακόλουθες γραμμές στο σενάριο device_added.sh.

#!/bin/bash
echo "USB device added at $(date)" >>/tmp/scripts.log

Ανοίξτε το δεύτερο σενάριο.

sudo vim /bin/device_removed.sh

Στη συνέχεια, προσθέστε τις ακόλουθες γραμμές στο σενάριο device_removed.sh.

#!/bin/bash
echo "USB device removed  at $(date)" >>/tmp/scripts.log

Αποθηκεύστε τα αρχεία, κλείστε και κάντε και τα δύο σενάρια εκτελέσιμα.

sudo chmod +x /bin/device_added.sh
sudo chmod +x /bin/device_removed.sh

Στη συνέχεια, ας δημιουργήσουμε έναν κανόνα για την ενεργοποίηση της εκτέλεσης των παραπάνω σεναρίων, που ονομάζεται /etc/udev/rules.d/80-test.rules.

vim /etc/udev/rules.d/80-test.rules

Προσθέστε αυτούς τους δύο ακόλουθους κανόνες σε αυτό.

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"

που :

  • "==": είναι ένας τελεστής για σύγκριση για ισότητα.
  • "+=": είναι ένας τελεστής για την προσθήκη της τιμής σε ένα κλειδί που περιέχει μια λίστα καταχωρήσεων.
  • ΥΠΟΣΥΣΤΗΜΑ: αντιστοιχεί στο υποσύστημα της συσκευής συμβάντος.
  • ACTION: αντιστοιχεί στο όνομα της ενέργειας της εκδήλωσης.
  • ENV{DEVTYPE}: αντιστοιχεί σε μια τιμή ιδιότητας συσκευής, τύπο συσκευής σε αυτήν την περίπτωση.
  • RUN: καθορίζει ένα πρόγραμμα ή ένα σενάριο που θα εκτελεστεί ως μέρος του χειρισμού συμβάντων.

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

sudo udevadm control --reload

Τώρα συνδέστε μια μονάδα USB στο μηχάνημά σας και ελέγξτε εάν το σενάριο device_added.sh εκτελέστηκε. Πρώτα από όλα, το αρχείο scripts.log θα πρέπει να δημιουργηθεί στο /tmp.

ls -l /tmp/scripts.log

Στη συνέχεια, το αρχείο θα πρέπει να έχει μια καταχώρηση όπως "Η συσκευή USB αφαιρέθηκε την ημερομηνία_ώρα ", όπως φαίνεται στο στιγμιότυπο οθόνης.

cat /tmp/scripts.log

Για περισσότερες πληροφορίες σχετικά με τον τρόπο σύνταξης κανόνων udev και διαχείρισης του udev, συμβουλευτείτε τις μη αυτόματες καταχωρήσεις udev και udevadm αντίστοιχα, εκτελώντας:

man udev
man udevadm
Περίληψη

Το Udev είναι ένας αξιόλογος διαχειριστής συσκευών που παρέχει έναν δυναμικό τρόπο ρύθμισης κόμβων συσκευών στον κατάλογο /dev. Διασφαλίζει ότι οι συσκευές διαμορφώνονται αμέσως μόλις συνδεθούν και ανακαλυφθούν. Διαδίδει πληροφορίες σχετικά με μια επεξεργασμένη συσκευή ή αλλαγές στην κατάστασή της, στον χώρο χρήστη.

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