ΕΛ/ΛΑΚ | creativecommons.gr | mycontent.ellak.gr |
freedom

Νέα από τον πλανήτη…planet.ellak.gr:Τι είναι το D-Bus

Στο σημερινό άρθρο, θα μάθουμε για το D-Bus, τα στοιχεία από τα οποία αποτελείται, το πως μπορούμε να αλληλεπιδράσουμε με αυτό είτε από το γραφικό περιβάλλον είτε από το τερματικό.

Το D-Bus είναι ένας μηχανισμός μέσω του οποίου προγράμματα επικοινωνούν μεταξύ τους. Η επικοινωνία αφορά είτε μεταξύ προγραμμάτων στον ίδιο υπολογιστή (IPC), είτε μεταξύ προγραμμάτων που τρέχουν σε διαφορετικούς υπολογιστές (RPC).

Αρχικά αναπτύχθηκε από τον Havoc Pennington που δουλεύει στην Red Hat και σήμερα είναι το στάνταρ στον κόσμο του Linux. Είναι το στάνταρ που χρησιμοποιούν σχεδόν όλα τα γραφικά περιβάλλοντα συμπεριλαμβανομένου του Gnome και KDE που άφησαν τους παλιούς μηχανισμούς που χρησιμοποιούσαν ενώ πλέον με το systemd  χρησιμοποιείται και για την επικοινωνία μεταξύ υπηρεσιών συστήματος, τόσο μεταξύ τους, όσο και με άλλα προγράμματα.

Άλλοι αντίστοιχοι μηχανισμοί που ίσως να έχετε ακούσει τα ονόματα τους είναι CORBA, DCE, DCOM, DCOP, XML-RPC, SOAP, MBUS, ICE, …

Τι εννοούμε με το … D-Bus

Υπάρχει μια μεγάλη σύγχυση για το τι ακριβώς είναι και τις υλοποιήσεις του, οπότε ας το ξεκαθαρίσουμε μια στιγμή πρώτα. Όταν λέμε D-Bus εννοούμε ένα από τα παρακάτω 3 πράγματα:

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

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

Ένα άλλο κομμάτι είναι το Polkit που είναι μια υπηρεσία ασφάλειας που επιτρέπει σε απλά προγράμματα να επικοινωνούν με υπηρεσίες συστήματος. Για παράδειγμα αν από τον διαχειριστή ενημερώσεων του Mint ζητήσω αναβάθμιση θα το ζητήσει από μια υπηρεσία συστήματος που την κάνει. Το Polkit θα εξουσιοδοτήσει το αίτημα μου, αν έχω αυτήν την δυνατότητα, και πιθανά να ζητήσει και κωδικό χρήστη με ένα κατάλληλο για το γραφικό περιβάλλον που χρησιμοποιώ τρόπο. Το Polkit το έφτιαξε ο David Zeuthen, πάλι από την RedHat.

Υλοποιήσεις του D-Bus

Αρχικά το D-BUS είχε χρήση σε περιβάλλον desktop όπου κάποια milliseconds δεν έχουν καμία σημασία. Αλλά όσο αυξάνεται η χρήση του όλο και μεγαλύτερα και περισσότερα αντικείμενα ανταλλάσσονται και η απόδοση έχει σημασία. Χρειαζόμαστε καλύτερες υλοποιήσεις από την αρχική και μακάρι κάποια στιγμή να κατασταλάξει μια υλοποίηση σε επίπεδο πυρήνα.

Τώρα που τα ξεκαθαρίσαμε αυτά, ας δούμε τις διαφορετικές υλοποιήσεις.

Για την υπηρεσία:

  • kdbus μια υλοποίηση σε επίπεδο πυρήνα, που συζητήθηκε πολύ αλλά ποτέ δεν ενσωματώθηκε. Το BUS1 είναι μια νέα υλοποίηση που όμως ούτε αυτή έχει ενσωματωθεί στον πυρήνα. Σχεδόν όλοι νομίζουν πως το kdbus υπάρχει εδώ και χρόνια. Είναι μια λάθος πληροφορία.
  • dbus Είναι η πρότυπη υλοποίηση
  • sd-bus Είναι μια υλοποίηση που έρχεται μαζί με το systemd.
  • dbus-broker Είναι μια νέα υλοποίηση από τους David Herrmann και Tom Gundersen. Που δουλεύουν και αυτοί, που αλλού; στην RedHat 

Για την βιβλιοθήκη:

  • libdbus ή αρχική υλοποίηση αρκετά δύστροπη στην χρήση αλλά βολική να φτιάχνεις bindings
  • GDBusQtBus βιβλιοθήκες για το gnome και το kde.
  • sdbus η βιβλιοθήκη που έρχεται μαζί με το systemd. Ισχυρίζεται πως είναι εύκολη στην χρήση. Είναι κάπου μεταξύ της libdbus και της GDBus με ελαφρά καλύτερες επιδόσεις.
  • Άλλες λιγότερο γνωστές ή για συγκεκριμένες γλώσσες προγραμματισμού.

Ποια θα πρέπει να χρησιμοποιήσει ένας προγραμματιστής; Βασικά όποια τον βολεύει, αλλά η ομάδα του systemd λέει το προφανές: GDBusQtBus για το gnome και το kdelibdbus ή GDBus αν το πρόγραμμα θέλεις να έχει συμβατότητα με άλλα UNIX ή Windows, και τέλος sdbus για οτιδήποτε άλλο.

Τα βασικά συστατικά του D-Bus

Για να το καταλάβουμε καλύτερα ας δούμε τα συστατικά που το αποτελούν.

  • Το κανάλι επικοινωνίας bus: Είναι ο δρόμος μέσω του οποίου ανταλλάσσονται τα μηνύματα. Υπάρχουν δυο τύποι. Του συστήματος, ένα ανά υπολογιστή για να μιλήσεις με υπηρεσίες συστήματος και του χρήστη για υπηρεσίες συστήματος όπως το ημερολόγιο. Υπάρχει ένα ανά χρήστη/υπολογιστή ανεξάρτητα του πόσες φορές έχει συνδεθεί.
  • Οι υπηρεσίες service είναι προγράμματα που παρέχουν υπηρεσίες και αντιδρούν σε μηνύματα. Για παράδειγμα ο NetworkManager ακούει στην υπηρεσία org.freedesktop.NetworkManager.
  • Ο πελάτης client είναι ένα πρόγραμμα που στέλνει μηνύματα και παρακολουθεί υπηρεσίες.
  • Ένα μονοπάτι path είναι ένα σημείο επαφής με μια υπηρεσία. Μοιάζουν με διαδρομές αρχείων.
  • Μια διεπαφή interface είναι μια συλλογή από σήματα, μεθόδους και ιδιότητες συνδεδεμένη με ένα μονοπάτι. Ένα μονοπάτι μπορεί να έχει πολλές διεπαφές.

Ένα μικρό παράδειγμα (με γραφικό τρόπο)

Το d-feet είναι ένα πρόγραμμα με το οποίο μπορούμε να εξερευνήσουμε το D-BUS.

d-feet είναι ένα πρόγραμμα με το οποίο μπορούμε να εξερευνήσουμε το D-BUS

Στην εικόνα βλέπουμε τις μεθόδους που υποστηρίζει το GameMode. Αν ένα πρόγραμμα σαν το Lutris θέλει να ξεκινήσει την ένα παιγνίδι θα καλέσει την μέθοδο RegisterGame() στο bus του χρήστη στην διαδρομή /com/ferralinteractive/GameMode της διεπαφής com.ferralInteractive.GameMode (ουφ το είπα όλο). Η ιδιότητα (property) ClientCount θα αυξηθεί κατά ένα, και θα σταλεί και ένα σήμα (signal) με όνομα GameRegistered σε κάθε ενδιαφερόμενο.

κάλεσα μέσα απο το d-feet μια μέθοδο να δω ποια παιγνίδια το χρησιμοποιούν

Στην παραπάνω εικόνα κάλεσα μέσα απο το d-feet μια μέθοδο να δω ποια παιγνίδια το χρησιμοποιούν. Είναι ένα ποιο είναι αυτό; Θα το βρω στην διαδρομή /com/feralInteractive/GameMode/Games/481810.

Είναι το πρόγραμμα gamemoded μιας και το παιγνίδι που χρησιμοποίησα στο παράδειγμα είναι η λειτουργία test που παρέχει (εντολή gamemoded --test).

σήματα και τις μεθόδους που ανταλλάσσονται

Στην εικόνα βλέπουμε κάποια από τα σήματα και τις μεθόδους που ανταλλάσσονται όταν σταματά και όταν ξεκινά ένα παιγνίδι.Το πρόγραμμα που την έφτιαξε το λέμε Bustle.

Εξερεύνηση του dbus με το τερματικό

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

dbus-send  --print-reply --session --type="method_call" \ --dest=com.feralinteractive.GameMode \/com/feralinteractive/GameMode \ com.feralinteractive.GameMode.ListGames

Με την βοήθεια του systemd:

busctl call --user com.feralinteractive.GameMode \/com/feralinteractive/GameMode \com.feralinteractive.GameMode ListGames

Μπορούμε επίσης να πάρουμε την τιμή μιας ιδιότητας:

busctl get-property --user --verbose \com.feralinteractive.GameMode \/com/feralinteractive/GameMode \com.feralinteractive.GameMode ClientCount

To systemd μας επιτρέπει επίσης να εξερευνήσουμε από το τερματικό τις υπηρεσίες

busctl tree --user --no-pager com.feralinteractive.GameMode

και να πάρουμε αναλυτικά στοιχεία

busctl introspect --user --no-pager com.feralinteractive.GameMode \/com/feralinteractive/GameMode

To systemd υπερέχει, αν και πρέπει να προσθέσω πως στον υπολογιστή μου σε κάποιες περιπτώσεις το TAB στο τερματικό δεν βοήθησε αρκετά.

Για λόγους πληρότητας να αναφέρω πως υπάρχει και η εντολή qdbus.

Παρακολούθηση (monitoring)

Η κλασσική εντολή εντολή για να παρακολουθήσεις το D-BUS είναι η dbus-monitor. Θέλει κάποια μαγικά για να μπορέσει να παρακολουθήσει το system bus, τουλάχιστον στην διανομή μου. (βλέπε DebuggingDBus )

bus-monitor "type='signal',sender='com.feralinteractive.GameMode', interface='com.feralinteractive.GameMode'"

Με την βοήθεια του systemd:


busctl monitor --user com.feralinteractive.GameMode

Περισσότερες δυνατότητες της εντολής busctrl

Το καλό με την εντολή είναι πως αν ξέρεις κάποια άλλη εντολή όπως την systemctl ή την journalctlξέρεις ήδη αρκετά για να την χρησιμοποιήσεις.

Για να δούμε την λίστα όλων των συνδέσεών θα χρησιμοποιήσουμε την εντολή χωρίς ορίσματα.

$ busctrl --userNAME                           PID PROCESS       USER  CONNECTION    UNIT              SESSION DESCRIPTION:1.0                           1407 systemd      talos :1.0          user@1000.service -       -          :1.110                         2848 gvfsd-trash  talos :1.110        user@1000.service -       -          [...]         :1.189                         5185 applet.py    talos :1.189        session-c1.scope  c1      -  [...]com.feralinteractive.GameMode  2268 gamemoded    talos :1.53         user@1000.service -       -          [...]

Για περισσότερα δείτε την τεκμηρίωση του busctl

Γιατί τα διάβασα όλα αυτά;

Έλα μου ντε. Γιατί ότι μαθαίνει κανείς καλό δεν είναι;

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

Άνοιξε το d-feet και ψάξε τι είναι διαθέσιμο. Για παράδειγμα:

d-feet και ψάξε τι είναι διαθέσιμο

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

Θα δείτε και άλλες υπηρεσίες που παρέχουν υπηρεσίες screensaver. Το dbus είναι σαν ένα filesystem μόνο που οι διαδρομές δεν είναι καθόλου ελεύθερες. Έχεις μόνο ένα org.gnome.ScreenSaver. Για τον λόγο αυτό δεν μπορείς να έχεις δυο διαφορετικές εκδόσεις του gnome στον ίδιο υπολογιστή. Δεν είναι μόνο θέμα βιβλιοθηκών (για αυτό υπάρχουν λύσεις).

Διαβάστε περισσότερα για το sd-bus εδώ

Πηγή άρθρου: https://planet.ellak.gr/ https://cerebrux.net

Leave a Comment