DKMS: Dynamic Kernel Module Support

Η 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, δεν θα μας επιστρέψει κάτι.


Τι είδαμε παραπάνω:

  1. Αναφορικά τι είναι η DKMS και που μπορεί να μας βοηθήσει
  2. Πρακτικά πως δημιουργούμε το κατάλληλο αρχείο dkms.conf
  3. Διάφορες χρήσιμες εντολές για προσθήκη, εγκατάσταση αλλά και αφαίρεση ενός Module μέσω της DKMS.

Συμβάλετε κι εσείς με ένα σχόλιο

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s