Sto compilando un kernel personalizzato su Ubuntu e sto correndo il problema che il mio kernel non sembra sapere dove cercare il firmware. Sotto Ubuntu 8.04, il firmware è legato alla versione del kernel allo stesso modo dei moduli driver. Ad esempio, kernel 2.6.24-24-generic memorizza i propri moduli del kernel in:In che modo Linux Kernel sa dove cercare il firmware del driver?
/lib/modules/2.6.24-24-generic
e il suo firmware:
/lib/firmware/2.6.24-24-generic
Quando ho compilare il kernel di Ubuntu 2.6.24-24-generic secondo "Alternate Build Method: The Old-Fashioned Debian Way" Ricevo la directory dei moduli appropriata e tutti i miei dispositivi funzionano tranne quelli che richiedono firmware come la mia scheda wireless Intel (modulo ipw2200).
Il registro del kernel mostra per esempio che quando ipw2200 cerca di caricare il firmware del sottosistema kernel controlla il caricamento del firmware è in grado di individuarlo:
ipw2200: Detected Intel PRO/Wireless 2200BG Network Connection
ipw2200: ipw2200-bss.fw request_firmware failed: Reason -2
numerr-base.h definisce come:
#define ENOENT 2 /* No such file or directory */
(La funzione che restituisce ENOENT mette un meno di fronte ad essa.)
ho cercato di creare un link simbolico in/lib/firmware, dove ha il nome di mio kernel alla directory 2.6.24-24-generica, tuttavia questo ha provocato lo stesso errore. Questo firmware è non GPL, fornito da Intel e confezionato da Ubuntu. Non credo che abbia un legame reale con una particolare versione del kernel. cmp
mostra che le versioni nelle varie directory sono identiche.
Quindi, come fa il kernel a sapere dove cercare il firmware?
Aggiornamento
ho trovato this solution per l'esatto problema che sto avendo, tuttavia, non funziona più come Ubuntu ha eliminato /etc/hotplug.d
e non più memorizza il firmware in /usr/lib/hotplug/firmware
.
Update2
qualche ricerca più alzato alcuni più risposte. Fino alla versione 92 di udev
, il programma firmware_helper
era il modo in cui il firmware veniva caricato. A partire da udev
93 questo programma è stato sostituito con uno script denominato firmware.sh che fornisce funzionalità identiche per quanto posso dire. Entrambi questi hardcoded il percorso del firmware a /lib/firmware
. Ubuntu sembra ancora utilizzare il binario /lib/udev/firmware_helper
.
Il nome del file del firmware è passato al firmware_helper
nella variabile d'ambiente $FIRMWARE
che è concatenato al percorso /lib/firmware
e utilizzato per caricare il firmware.
La richiesta effettiva per caricare il firmware è fatto da parte del conducente (ipw2200 nel mio caso) tramite la chiamata di sistema:
request_firmware(..., "ipw2200-bss.fw", ...);
Ora da qualche parte tra il driver chiamando request_firmware
e firmware_helper
guardando la variabile $FIRMWARE
ambiente , il nome del pacchetto del kernel viene anteposto al nome del firmware.
Quindi chi lo fa?
Qualcuno potrebbe aggiungere un commento per spiegare perché stanno votando per chiudere questa domanda? Apprezzerei il feedback. –
Viene votato per la chiusura perché "appartiene a serverfault.com". Dal momento che la questione non riguarda la programmazione e piuttosto l'amministrazione, questo è in linea con le dichiarazioni di missione di entrambi i siti. – ephemient
Grazie per il feedback. Ho considerato questa una domanda di programmazione poiché si è verificato un problema durante il tentativo di creare un kernel personalizzato. Mi piacerebbe sapere perché, in particolare, qualcuno considererebbe questo non correlato alla programmazione, anche se penso di aver qualche buona idea del perché. –