Η DKMS (Dynamic Kernel Module Support) είναι μια λειτουργία η οποία μπορεί να προστεθεί στο σύστημά μας, ώστε να έχουμε αυτόματη δημιουργία και εγκατάσταση πρόσθετων αρθρωμάτων (modules), όταν αυτό χρειαστεί.
Μερικές φορές είναι αναγκαίο να προσθέσουμε στον πυρήνα κάποιο Module το οποίο για τον Α,Β λόγο δεν υπάρχει από προεπιλογή, ενώ εμείς το χρειαζόμαστε.
Αυτό συμβαίνει συνήθως όταν έχουμε κάποιο υλικό (πχ ασύρματη κάρτα δικτύου) το οποίο για να λειτουργήσει σωστά χρειάζεται αυτό το έξτρα Module το οποίο δεν παρέχει ο πυρήνας.
Η δημοσίευση αυτή απευθύνεται σε χρήστες οι οποίοι έχουν μια ιδέα από προσθήκη αρθρωμάτων στον πυρήνα, χτίσιμο και εγκατάσταση μέσω πηγαίου κώδικα και γενικότερα μια εξοικείωση με το τερματικό.
Το πλεονέκτημα του Open Source
Πολλές φορές έχουμε ακούσει για τα πλεονεκτήματα που προσφέρει ο ανοιχτός κώδικας. Εδώ, θα δούμε ένα από αυτά στη πράξη.
Η όλη δημοσίευση βασίζεται σε ένα πρόσφατο και επιτυχημένο παράδειγμα προσθήκης ενός τέτοιου Module, όταν η εταιρία που το παρείχε αποφάσισε να σταματήσει την υποστήριξη για τη συγκεκριμένη κάρτα δικτύου, στην έκδοση πυρήνα v3.10.
Το πλεονέκτημα του ανοιχτού κώδικα σε αυτή τη περίπτωση φάνηκε όταν, ανεξάρτητοι προγραμματιστές πήραν τον κώδικα και τον τροποποίησαν έτσι ώστε να λειτουργεί και σε νεότερες εκδόσεις πυρήνα (πχ v4.4).
Ο κώδικας φιλοξενείται συνήθως στο GitHub και ο χρήστης που θα τον χρησιμοποιήσει πρέπει να χτίσει το Module μόνος του, χειροκίνητα.
Το πλεονέκτημα του DKMS
Εφόσον το Module το οποίο χτίζει και κάνει εγκατάσταση ο χρήστης δεν συμπεριλαμβάνεται στον πυρήνα από προεπιλογή, κάθε φορά που έρχεται μια αναβάθμιση για τον πυρήνα Linux (στη ουσία, αντικατάσταση με νεότερη έκδοση), θα πρέπει να το χτίζει και να το κάνει εγκατάσταση εκ νέου. Θα πρέπει να τρέχει δηλαδή ένα σετ εντολών.
Οι εντολές δεν είναι δύσκολες, ούτε πολλές. Βασικά μπορεί κάποιος να τις ενσωματώσει σε ένα script και να τρέχει αυτό το script. Οι εντολές είναι συνήθως της μορφής
$ ./configure $ make $ sudo make install
Φυσικά εδώ υποθέτουμε ότι το Module χτίζεται χωρίς προβλήματα και ότι το Source Tree είναι κατάλληλα δημιουργημένο, ώστε να μη προξενεί προβλήματα. Σε διαφορετική περίπτωση η DKMS θα αποτύχει και δεν θα ευθύνεται καθόλου γι’ αυτό.
Η DKMS θα μας βοηθήσει ώστε να μη χρειάζεται να τρέχουμε τις ίδιες εντολές κάθε φορά που έρχεται μια αναβάθμιση πυρήνα. Θα κάνει αυτή τη δουλειά αυτόματα, αντί για εμάς.
Εγκατάσταση και Χρήση
Παίρνουμε ως παράδειγμα το Ubuntu 16.04 LTS, στο οποίο πρέπει πρώτα να κάνουμε εγκατάσταση το ομώνυμο πακέτο.
$ sudo apt-get install dkms
Εδώ θα ασχοληθούμε με το παράδειγμα από τη δημοσίευση στο φόρουμ της Ελληνικής Κοινότητας Ubuntu. Με αυτό το τρόπο θα δούμε την όλη διαδικασία και μπορούμε να προσαρμόσουμε τα παρακάτω σε κάθε περίπτωση που μας αφορά.
Υποθέτουμε ότι έχουμε την ασύρματη κάρτα δικτύου TP LINK TL-WN822N. Είναι τύπου USB με Device ID: [2357:0108]. Το Module που χρειάζεται για να λειτουργήσει αυτή η κάρτα δεν υπάρχει ενσωματωμένο στο πυρήνα. Με το κατάλληλο ψάξιμο εντοπίσαμε τον οδηγό που χρειάζεται η κάρτα δικτύου για να λειτουργήσει. Είναι ο ίδιος οδηγός που δημιούργησε η TP LINK, τροποποιημένος όμως ώστε να λειτουργεί και με νεότερους πυρήνες Linux (πλεονέκτημα ανοιχτού κώδικα). Ο κώδικας βρίσκεται στο GitHub το οποίο χρειάζεται να κάνουμε clone στο σύστημά μας.
$ sudo apt-get install git $ git clone https://github.com/jeremyb31/rtl8192eu-linux-driver
Βλέποντας τα αρχεία στο Source Tree του αποθετηρίου που μόλις κατεβάσαμε,
nicktux@ubuntu:~$ ls rtl8192eu-linux-driver clean core hal ifcfg-wlan0 include Kconfig Makefile os_dep platform README.md runwpa wlan0dhcp
παρατηρούμε ότι λείπει ένα σημαντικό αρχείο το οποιό χρειάζεται η DKMS για να λειτουργήσει σωστά. Αυτό το αρχείο είναι το dkms.conf και κανένας προγραμματιστής δεν είναι υποχρεωμένος να το προσθέτει στο Source Tree.
Αυτό θα το κάνουμε μόνοι μας, προκειμένου να ενεργοποιήσουμε την υποστήριξη DKMS γι’ αυτό το Module.
Εξ ου και αυτή η δημοσίευση.
Δημιουργία dkms.conf
Μπαίνουμε στο Source Tree και με τον αγαπημένο μας Text Editor δημιουργούμε το αρχείο dkms.conf
$ cd rtl8192eu-linux-driver $ gedit dkms.conf
Προσθέτουμε μέσα στο αρχείο τα παρακάτω
PACKAGE_NAME=8192eu PACKAGE_VERSION=4.3 MAKE[0]="'make' KVER=${kernelver}" BUILT_MODULE_NAME[0]=8192eu BUILT_MODULE_LOCATION[0]="./" DEST_MODULE_LOCATION[0]="/kernel/updates/dkms" AUTOINSTALL="YES"
Τα παραπάνω είναι λίγο πολύ self explanatory. Αυτά που πρέπει να προσέξουμε είναι τα BUILT_MODULE_LOCATION και DEST_MODULE_LOCATION. Μπορούμε να χρησιμοποιούμε τα παραπάνω για κάθε περίπτωση.
Τα PACKAGE_NAME και PACKAGE_VERSION τα βρίσκουμε συνήθως σε κάποιο README αρχείο που υπάρχει στο Source Tree.
Το ίδιο και το BUILT_MODULE_NAME(σημαντική παράμετρος κι αυτή), μέσα στο Source Tree.
Αποθηκεύουμε το αρχείο και πηγαίνουμε ένα κατάλογο επάνω (έξω από το Source Tree).
Εκεί δίνουμε την εντολή προσθήκης του αποθετηρίου στη DKMS. Αυτή η εντολή, όταν εντοπίσει το αρχείο dkms.conf, καθώς και άλλα αρχεία μέσα στο Source Tree, θα δημιουργήσει ένα symlink στη κατάλληλη διαδρομή.
sudo dkms add ./rtl8192eu-linux-driver
Το αποτέλεσμα πρέπει να είναι
Creating symlink /var/lib/dkms/8192eu/4.3/source -> /usr/src/8192eu-4.3 DKMS: add completed.
Έπειτα τρέχουμε την εντολή εγκατάστασης
sudo dkms install -m 8192eu -v 4.3
Γίνεται η διαδικασία χτισίματος και προσθήκης του Module στη DKMS. Το αποτέλεσμα δε πρέπει να επιστρέψει errors, αλλά κάτι σαν το παρακάτω.
Building module: cleaning build area.... 'make' KVER=4.7.0-50-bfq.................. cleaning build area.... DKMS: build completed. 8192eu.ko: Running module version sanity check. - Original module - No original module exists within this kernel - Installation - Installing to /lib/modules/4.7.0-50-bfq/updates/dkms/ depmod.... DKMS: install completed.
Μπορούμε να δούμε τι έχουμε προσθέσει με την DKMS με τη παρακάτω εντολή
$ sudo dkms status
8192eu, 4.3, 4.7.0-50-bfq, x86_64: installed nicktux@ubuntu:~$
Μπορούμε να δούμε πληροφορίες για το νεοεισερχόμενο Module με τη παρακάτω εντολή
$ modinfo 8192eu
filename: /lib/modules/4.7.0-50-bfq/updates/dkms/8192eu.ko version: v4.3.1.1_11320.20140505 author: Realtek Semiconductor Corp. description: Realtek Wireless Lan Driver license: GPL ................ ................ ................
Αφαίρεση Module μέσω DKMS
Αν για οποιονδήποτε λόγο θέλουμε να αφαιρέσουμε το Module από τη DKMS, ώστε να σταματήσει η αυτόματη εγκατάστασή του, τρέχουμε τις παρακάτω εντολές
(για το παράδειγμα με το οποίο ασχοληθήκαμε και το Module: 8192eu)
sudo dkms remove 8192eu/4.3 --all
Πρέπει να ακολουθήσουμε αυτή τη γραφή [module name/version], ενώ δίνοντας τη παράμετρο –all λέμε στη DKMS να αφαιρέσει το Module από όλους τους πυρήνες για τους οποίους είχε χτιστεί.
Τα αποτελέσματα πρέπει να είναι όπως παρακάτω
-------- Uninstall Beginning -------- Module: 8192eu Version: 4.3 Kernel: 4.7.0-50-bfq (x86_64) ------------------------------------- Status: Before uninstall, this module version was ACTIVE on this kernel. 8192eu.ko: - Uninstallation - Deleting from: /lib/modules/4.7.0-50-bfq/updates/dkms/ - Original module - No original module was found for this module on this kernel. - Use the dkms install command to reinstall any previous module version. depmod.... DKMS: uninstall completed. ------------------------------ Deleting module version: 4.3 completely from the DKMS tree. ------------------------------ Done.
Κοιτώντας στη διαδρομή /var/lib/dkms/ αυτή θα πρέπει να μη περιέχει το Module που είχαμε εγκαταστήσει, πλέον.
Όπως και τρέχοντας την εντολή sudo dkms status, δεν θα μας επιστρέψει κάτι.
Τι είδαμε παραπάνω:
- Αναφορικά τι είναι η DKMS και που μπορεί να μας βοηθήσει
- Πρακτικά πως δημιουργούμε το κατάλληλο αρχείο dkms.conf
- Διάφορες χρήσιμες εντολές για προσθήκη, εγκατάσταση αλλά και αφαίρεση ενός Module μέσω της DKMS.