Dokumentacija DKMS

Izvor: HrOpenWiki
Inačica od 14:27, 27. siječnja 2010. koju je unio/unijela Grof (razgovor | doprinosi)

(razl) ←Starija inačica | vidi trenutačnu inačicu (razl) | Novija inačica→ (razl)
Skoči na: orijentacija, traži
DKMS

DKMS je skraćenica od Dynamic Kernel Module Support ili u prijevodu: Podrška za promjenljive kernel module. DKMS zapravo predstavlja svojevrsni podsustav za upravljanje izgradnjom modula koji ne pripadaju u postojeće kernel stablo (nisu dio standardnog, vanilla kernela).

Pomoću njega omogućena je automatska izgradnja i ugradnja takvih modula nakon svakog ažuriranja kernela npr. putem standardnog sustava za ažuriranje paketa. Dakle, ako ne želite nakon svakog ažuriranja kernela ručno izgrađivati i ugrađivati kernel module koji se nisu mogli ažurirati preko paketnog upravitelja, onda je DKMS jedino rješenje.

DKMS je razvijen od strane DELL-ovih Linux inženjera.


Uvod

Na ovim stranicama nalazi se postupak pripreme i izgradnja jednog takvog modula putem DKMS podsustava, te njegova automatska integracija u initrd.img sliku u sistemskom /boot direktoriju.

Izveden je primjer na cmd64x kernel modulu koji predstavlja pogonski program za IDE diskove na nekim starijim računalima.

Priprema

Izvorni kod modula postavljamo u standardni /usr/src direktorij u kojemu smo kreirali jedan poddirektorij sa imenom modula i verzijom.

# mkdir /usr/src/cmd64x-0.1
# cd /usr/src/cmd64x-0.1

Također je potrebno na računalo instalirati DKMS paket preko paketnog upravitelja distribucije (ulavnom se on svuda zove dkms)

Modul iz primjera ima samo jednu izvornu datoteku koja se zove cmd64x.c. Dakle, smještamo je u /usr/src/cmd64x-0.1

Podešavanje

Sada je potrebno napraviti dvije datoteke:

  • Makefile sa ovim sadržajem:
obj-m := cmd64x.o
KVERSION = $(shell uname -r)
all:
       $(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
       $(MAKE) -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

u liniji obj-m:=, cmd64x.o zamjenite sa imenom vaše datoteke. Ako Makefile dođe sa paketom izvornog koda modula, onda ga ne treba mijenjati.

  • dkms.conf sa ovim sadržajem:
PACKAGE_NAME="cmd64x"
PACKAGE_VERSION="0.1"
DEST_MODULE_LOCATION[0]="/kernel/drivers/ata/"
MAKE[0]="make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules"
CLEAN="make -C ${kernel_source_dir} SUBDIRS=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build clean"
BUILT_MODULE_NAME[0]="cmd64x"
POST_INSTALL="post-install-cmd64x.sh $kernelver"
POST_REMOVE="post-uninstall-cmd64x.sh $kernelver"
AUTOINSTALL="yes"

Kako je ova datoteka od velike važnosti za ispravnu izgradnju i rad modula unutar DKMS podsustava, malo detaljnije ćemo pogledati njezine linije:

  • PACKAGE_NAME= ime paketa modula (posebno interesantno ako paketiramo u .deb i .rpm, te ako više modula ide pod jedan paket) kojeg izgrađujemo
  • PACKAGE_VERSION= zadajemo internu verziju paketa
  • DEST_MODULE_LOCATION[0]= mjesto gdje će izgrađeni modul (.ko) biti postavljen. Broj u zagradi mora biti jednak broju iz linije BUILT_MODULE_NAME. Na Linux distribucijama Ubuntu, Fedora, OpenSuse i još nekima ova linija mora postojati u .conf datoteci, ali je DKMS zaobilazi i postavlja modul na, od strane distribucije određeno mjesto unutar /lib/modules/<kernel_version> stabla.
  • MAKE[0]= i CLEAN= ostavite kao u primjeru
  • BUILT_MODULE_NAME[0]= ime modula koji se izgrađuje. Ako ih ima više onda svaki mora biti naveden, s time da se broj u zagradi povećava za n+1. Sukladno ovome treba napraviti isti broj linija sa DEST_MODULE_LOCATION
  • POST_INSTALL= Ako je potrebno izvršiti dodatnu skriptu nakon instalacije modula onda njezino ime navedemo ovdje
  • POST_REMOVE= Ako je potrebno izvršiti dodatnu skriptu nakon micanja modula onda njezino ime navedemo ovdje
  • AUTOINSTALL= Ako želimo da se modul automatski izgrađuje i instalira nakon ažuriranja kernela onda postavljamo ovaj parametar na "yes".
  • DKM-ova varijabla $kernelver prosljeđuje verziju kernela kojeg DKMS trenutno obrađuje.

Sve ostale opcije navedene su na DKMS man stranicama.

Ostale skripte

U našem primjeru imamo modul koji osim što se mora nakon ažuriranja kernela sam izgraditi i instalirati u novo kernel stablo, isti se treba postaviti i u novu sliku datoteke initrd.img u /boot direktoriju, jer u protivnom kernel neće moći pristupiti tvrdim diskovima, odnosno neće moći učitati ostatak operacijskog sustava.

Ovo postavljanje u initrd.img datoteku možemo postići preko POST_INSTALL skripte. Njezin sadržaj izgleda ovako:

#! /bin/bash
cp /lib/modules/$1/updates/dkms/cmd64x.ko /lib/modules/$1/kernel/drivers/ata
depmod $1
update-initramfs -u -k $1

U skripti smo izvršili i prebacivanje modula iz dkms-stabla u standardno kernel-stablo, te izvršili depmod. depmod izvrši i DKMS sam po sebi, ali tek nakon što izvrši post install skriptu, a nama je depmod potreban kako bi update-initrafs naredba mogla prepoznati novo izgrađeni modul i ubaciti ga u initrd.img datoteku. Ovo prebacivanje iz dkms-stabla u kernel-stablo potrebno je baš iz razloga što DKMS zaobilazi DEST_MODULE_LOCATION liniju u dkms.conf datoteci.

Kako smo pomoću post install sktipte ručno ubacili modul u kernel-stablo, red je da ga prilikom micanja modula ručno i maknemo od tamo. Za to se brine skripta POST_REMOVE sa ovim sadržajem:

#! /bin/bash
rm /lib/modules/$1/kernel/drivers/ata/cmd64x.ko

Nemojte zaboraviti izvršiti

# chmod +x *.sh

kako bi skripte bile izvršne.

Izgradnja i instalacija u sistem

Nakon pripreme datoteka možemo pristupiti izgradnji i instalaciji modula u sistem preko DKMS podsustava. Za ovu namjenu imamo slijedeće naredbe:

  • Prijava modula u DKMS sustav:
# dkms add -m cmd64x -v 0.1
  • Izgradnja modula:
# dkms build -m cmd64x -v 0.1
  • Instalacija modula:
# dkms install -m cmd64x -v 0.1

Ako imamo potrebu maknuti modul iz DKMS podsustava onda to činimo ovako:

# dkms remove -m cmd64x -v 0.1 --all

Primjetite da parametar -m stoji za ime modula, a -v za verziju modula. ako želimo izgradnju za određenu verziju kernela onda nju možemo navesti iza parametra -k.

Ovime je proces izgradnje i instalacije modula preko DKMS podsustava gotov, te od sada DKMS vodi brigu oko ponovne izgradnje i instalacije modula nakon ažuriranja kernela.

Paketiranje

Ako želimo ovako pripremljeni modul paketirati u .DEB ili .RPM paket, to jednostavno napravimo ovako:

  • .DEB
# dkms mkdeb  -m cmd64x -v 0.1
  • .RPM
# dkms mkrpm  -m cmd64x -v 0.1

Ako želimo da naš paket nema binary datoteke nego samo izvršne, dovoljno je dopisati parametar --source-only