Post  |  Commenti

8th
AGO

Driver fuori da Gentoo!!!

1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Posted by deepred | Filed under Linux, Programming

Sottolineo già da queste prime righe che questo articolo si rivolge esclusivamente ad utenti Gentoo!!!

Problema: il mio nuovo computer ha una scheda ethernet della Realtek RTL8168. Durante l’installazione scopro che questa scheda non è supportata dal kernel Linux (2.6.21). Poco male, penso, i driver saranno nel Portage: e invece no. I driver per questa scheda di rete sono fuori da Gentoo. Girando per Internet trovo comunque i driver linux sul sito della Realtek, li scarico, li installo e tutto è ok! O quasi! Nel senso che trattandosi di un driver questo deve essere installato ogni volta che si ricompila il kernel. Gentoo, per ovviare al problema di dover ricordarsi tutti i moduli esterni e reinstallarli, offre un tool module-rebuild che provvede a fare ciò. Ma module-rebuild funziona solo per driver che sono presenti nel Portage e il driver della mia scheda di rete non c’è!!! Come devo fare?

Soluzione: Creare una ebuild (uno script che permette di installare un pacchetto con emerge, ndr) e aggiungerla al database di module-rebuild.
Per la prima parte della soluzione ho provveduto ad aprire il mio PORTAGE_OVERLAY e dentro ho inserito la porzione di portage tree presente qui. Siccome ho utilizzato una nuova categoria (net-eth) non ancora nel Portage, ho dovuto aggiungere questa al file /usr/portage/categories.
Per aggiungerla a module-rebuild nulla è stato più semplice: è bastato digitare il comando $ module-rebuild add net-eth/r8168-0.1_alpha1.

E per altri driver fuori da Gentoo?
Sebbene la soluzione proposta sia di validità generale, affinchè sia possibile inserire nel Portage il proprio driver è necessario costruire correttamente l’ebuild. Cercherò in breve di spiegare i passi da compiere per ottenere questo risultato, illustrando a titolo di esempio quanto fatto da me per il driver suddetto.

  1. All’interno del proprio PORTAGE_OVERLAY creare una cartella che indichi la categoria (net-eth nel mio caso), quindi al suo interno una cartella che indica il pacchetto (r8168 nel mio caso).
  2. Nella cartella creata genereare il file {nome_pacchetto}-{versione}_{stato}{num}, dove {nome_pacchetto} è il nome anche della directory contenitrice, {versione} è la versione del pacchetto a disposizione, {stato} è usato per indicare informazioni aggiuntive com “alpha” o “beta” version o release canidate (“rc”) (seguite eventualmente da un numero). Quindi nel mio caso un nome accettabile era r8168-0.1_alpha1, anche se sarebbe stato più corretto (attenendosi alla versione del driver presente sul sito) il nome r8168-8.002.00_alpha1.
  3. Per scrivere da 0 l’ebuild bisogna cominciare dall’header: questo può essere recuperato dal file /usr/portage/header.txt.
  4. In secondo luogo bisogna settare le variabili necessarie: SLOT=”0″, LICENSE (indicare la licenza con cui sono forniti i driver), KEYWORDS (solitamente i fornitori del driver indicano che tipo di architeetture sono supportate), DESCRIPTION, SRC_URI (dove scaricare i driver), HOMEPAGE, IUSE (potrebbe rimanere vuoto). Se sono richieste particolari dipendenze potrebbero essere espresse attraverso le variabili DEPEND e RDEPEND. Infine, bisogna indicare la variabile S, cioè il nome della cartella all’interno del quale bisognerà lavorare: la cosa più semplice potrebbe essere scomppattare il driver, analizzare il nome della directory creata ed impostare S=${WORKDIR}/nome_directory. Nel mio caso quindi ho impostato S=${WORKDIR}/r8168-8.002.00
  5. Come installare tale driver? per prima cosa leggete il readme contenuto all’interno del file scompattato. Questo conterrà le istruzioni necessarie all’installazione. Possiamo dividere queste istruzioni in 3 macrogruppi: istruzione di compilazione (prima del make install), istruzioni di installazione (make install e simili), istruzioni post-installazione (dopo il make install). Nel mio caso al primo gruppo apparteneva il comando make clean modules, al secondo make install, al terzo depmod -a.
  6. La suddivisione al punto precedente è necessaria per capire dove inserire i comandi all’interno dell’ebuild. le instruzioni di compilazione all’interno di src_compile(), le istruzioni di installazione all’interno di src_install() e le eventuali istruzioni post-installazione in pkg_postinst().
  7. Una attenzione particolare è riservata a make install: quando viene inserito nell’ebuild dovrà essere aggiunto il parametro DESTDIR=${D}. In questo modo il pacchetto sarà installato nella sandbox e solo dopo nella fase di merging nel sistema. Questo, come nel mio caso, potrebbe non bastare: infatti i Makefile del driver potrebbero contenere path assoluti. Per evitare ciò bisogna creare una patch e aggiungerla all’albero di portage all’interno della cartella files.
  8. Se è necessario applicare patch sarà necessario modificare ulteriormente la nostra ebuild, aggiungendo la linea inerith eutils e la funzione src_unpack(). Questa consetrà delle seguenti 3 istruzioni:
    unpack ${A}cd "${S}"
    
    epatch "${FILESDIR}"/nome_patch
  9. Una volta fatto completato l’ebuild bisognerà eseguire il comando: ebuild /path/to/ebuild/nome_ebuild.ebuild digest.
  10. Ora rimane da lanciare emerge e vedere che succede: se tutto funziona avete creato la vostra ebuild.

Creare una patch? E come si fà?
È abbastanza semplice: si copia il file da patchare. Tale nuovo file sarà modificato opportunamente aggiungendo, modificando o eliminando elementi nel file: ad esempio nel caso siano presenti path assolute queste potrebbero essere fatte precedere da ${DESTDIR}. Una volta modificato opportunamente, saremo pronti a creare il nostro patchfile: diff -u origfile newfile > patchfile. Attenzione al path inserito per newfile: deve essere tale che sia possibile riferircisi dalla posizione corrente durante la fase di installazione.

Spero che queste righe possano essere utili a qualche gentooista per risolvere i propri problemi.

Tags: > > > > > > > > > > > > >
Il contenuto di questo Blog è rilasciato sotto Licenza Creative Commons (Leggi)