Στο σημερινό άρθρο, θα μάθουμε για το 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ή αρχική υλοποίηση αρκετά δύστροπη στην χρήση αλλά βολική να φτιάχνειςbindingsGDBus,QtBusβιβλιοθήκες για τοgnomeκαι τοkde.sdbusη βιβλιοθήκη που έρχεται μαζί με τοsystemd. Ισχυρίζεται πως είναι εύκολη στην χρήση. Είναι κάπου μεταξύ τηςlibdbusκαι τηςGDBusμε ελαφρά καλύτερες επιδόσεις.- Άλλες λιγότερο γνωστές ή για συγκεκριμένες γλώσσες προγραμματισμού.
Ποια θα πρέπει να χρησιμοποιήσει ένας προγραμματιστής; Βασικά όποια τον βολεύει, αλλά η ομάδα του systemd λέει το προφανές: GDBus, QtBus για το gnome και το kde, libdbus ή GDBus αν το πρόγραμμα θέλεις να έχει συμβατότητα με άλλα UNIX ή Windows, και τέλος sdbus για οτιδήποτε άλλο.
Τα βασικά συστατικά του D-Bus
Για να το καταλάβουμε καλύτερα ας δούμε τα συστατικά που το αποτελούν.
- Το κανάλι επικοινωνίας bus: Είναι ο δρόμος μέσω του οποίου ανταλλάσσονται τα μηνύματα. Υπάρχουν δυο τύποι. Του συστήματος, ένα ανά υπολογιστή για να μιλήσεις με υπηρεσίες συστήματος και του χρήστη για υπηρεσίες συστήματος όπως το ημερολόγιο. Υπάρχει ένα ανά χρήστη/υπολογιστή ανεξάρτητα του πόσες φορές έχει συνδεθεί.
- Οι υπηρεσίες service είναι προγράμματα που παρέχουν υπηρεσίες και αντιδρούν σε μηνύματα. Για παράδειγμα ο NetworkManager ακούει στην υπηρεσία
org.freedesktop.NetworkManager. - Ο πελάτης client είναι ένα πρόγραμμα που στέλνει μηνύματα και παρακολουθεί υπηρεσίες.
- Ένα μονοπάτι path είναι ένα σημείο επαφής με μια υπηρεσία. Μοιάζουν με διαδρομές αρχείων.
- Μια διεπαφή interface είναι μια συλλογή από σήματα, μεθόδους και ιδιότητες συνδεδεμένη με ένα μονοπάτι. Ένα μονοπάτι μπορεί να έχει πολλές διεπαφές.
Ένα μικρό παράδειγμα (με γραφικό τρόπο)
Το d-feet είναι ένα πρόγραμμα με το οποίο μπορούμε να εξερευνήσουμε το D-BUS.

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

Στην παραπάνω εικόνα κάλεσα μέσα απο το 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 και ψάξε τι είναι διαθέσιμο. Για παράδειγμα:

βρήκα πως να ενεργοποιήσω το κλείδωμα της οθόνης. Με την γνώση αυτή και με την βοήθεια αυτού του άρθρου μπορώ πλέον να το χρησιμοποιήσεις σε κάποιο δικό σου script.
Θα δείτε και άλλες υπηρεσίες που παρέχουν υπηρεσίες screensaver. Το dbus είναι σαν ένα filesystem μόνο που οι διαδρομές δεν είναι καθόλου ελεύθερες. Έχεις μόνο ένα
org.gnome.ScreenSaver. Για τον λόγο αυτό δεν μπορείς να έχεις δυο διαφορετικές εκδόσεις τουgnomeστον ίδιο υπολογιστή. Δεν είναι μόνο θέμα βιβλιοθηκών (για αυτό υπάρχουν λύσεις).
Διαβάστε περισσότερα για το sd-bus εδώ
Πηγή άρθρου: https://planet.ellak.gr/ https://cerebrux.net
