Post Meta
-
Indietro
-
agosto 8, 2007 -
Linux, Programming -
5 Comments
-
Letto 990 volte
-
Comments Feed -
Stampa questo Post
8th
AGO
Driver fuori da Gentoo!!!
Posted by deepred | Filed under Linux, Programming
Questo articolo è stato pubblicato 3 anni 26 giorni giorni fa quindi alcuni contenuti o informazioni presenti in esso potrebbero non essere più validi. Questo sito non è responsabile per eventuali errori causati da questo problema.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.
- 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).
- 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.
- Per scrivere da 0 l’ebuild bisogna cominciare dall’header: questo può essere recuperato dal file /usr/portage/header.txt.
- 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
- 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.
- 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().
- 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.
- 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 - Una volta fatto completato l’ebuild bisognerà eseguire il comando: ebuild /path/to/ebuild/nome_ebuild.ebuild digest.
- 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: diff > driver > ebuild > emerge > gentoo > kernel > Linux > module-rebuild > open-source > patch > Portage > Programming > scheda-di-rete > tips


aggiungi dei tag deepred…l’hai lasciato senza tag.
inoltre il font per il codice è troppo piccolo…si legge a malapena
per i tag mi era proprio sfuggito
Per il font ho usato kbd e ieri sul fisso si vedeva bene
Cmq ora cambio
in realtà il kernel supporta tale scheda, devi aggiungere:
Realtek 8169 gigabit ethernet support
che si trova in:
Device Drivers -> Network device suport -> Network device support -> Ethernet (1000 Mbit)
È vero Lobotomia, ma come puoi vedere qui http://gentoo-wiki.com/HARDWARE_RTL8168
potrebbe esserci qualche problema se usi linux in dual boot con winzoz
tra l’altro ho avuto problemi con il driver rtl8169 fino al kernel 2.6.21
mentre con il 2.6.22 ha funzionato bene
invece i driver relatek per l’RTL8168 avevano qualche problema proprio con il kernel 2.6.22, dovuto al cambiamento di alcune strutture dati in questo nuovo kernel.
Per chi interessasse ho aggiornato il link nel post ad una versione corretta del driver r8168 tale da funzionare anche con il kernel 2.6.22 (ho solo aggiunto un paio di patch)
[...] Scheda di rete: si tratta della Realtek Gigabit Ethernet 8168. Nel kernel sono presenti i driver per la versione 8169 funzionanti anche con questa scheda. Tuttavia, in virtù dei problemi suggeriti in questo wiki e di personali disfunzioni verificatesi con il kernel 2.6.21, ho optato per l’apposito driver r8168 fornito dal vendor, anche se questo mi ha richiesto un pò di lavoro. I risultati del lavoro svolto sono descritti nel precedente post Driver fuori da Gentoo!!! [...]