Pagina 1 di 3

Errore durante compilazione kernel

Inviato: mar 27 mar 2012, 23:41
da joe
In un altro post sull'ibernazione e il suspend ho riscontrato che utilizzando un kernel più recente, nello specifico il 3.3.0 ottengo su slackware-13.1, la possibilità di far funzionare il suspend to ram.
Siccome il kernel che avevo provato non era stato compilato da me, aveva qualche problemino sul mio portatile riguardante il supporto all'SMP che non era attivato e invece il mio processore richiede per gestire lo scaling della frequenza ecc.

Allora alla fine mi sono deciso a scaricarmi il kernel 3.3.0 e tentare la compilazione e pacchettizzazione attraverso il tool di submax kernelpkg.
Ho seguito la guida sul sito e l'unico punto in cui ho rimaneggiato qualcosa durante il make oldconfig (perchè sono partito col config attuale che è il default della 13.1) è la specificazione della famiglia della mia cpu, mentre tutti gli altri prompt del oldconfig li ho bellamente ignorati premendo invio e quindi immagino scegliendo la risposta di default.

Non ho eseguito il make menuconfig perchè mi va bene il config attuale (a parte la specifica della proc family che avevo già fatto durante l'oldconfig come detto sopra). Insomma alla fine ho lanciato kernelpkg.
La compilazione è però finita male. Ottengo il seguente errore:

Codice: Seleziona tutto

root@darkstar:/usr/src/linux# kernelpkg

+------------------------------------------------------------------------------+
|                               [[[ PROGRESS ]]]                               |
+------------------------------------------------------------------------------+
Please wait while compiling Linux kernel 3.3.0-smp...
--> Cleaning: OK
--> Building kernel: OK
--> Building modules: OK
DONE.

Please wait while building packages...
--> Building kernel-image package: cp: cannot stat `/tmp/linux-3.3/modules.builtin': No such file or directory
make: *** [_modinst_] Error 1
[ERROR] make unsuccessful. View log files in /var/log/kernelpkg/*
E nei log se vado a greppare gli erori ottengo:

Codice: Seleziona tutto

joe@darkstar:~$ cat /var/log/kernelpkg/make-bzImage.log |grep rror
include/generated/autoconf.h:12962: error: expected identifier or '(' before '!' token
make[3]: *** [drivers/acpi/acpica/exresnte.o] Error 1
make[2]: *** [drivers/acpi/acpica] Error 2
make[1]: *** [drivers/acpi] Error 2
  CC      arch/x86/math-emu/errors.o
make: *** [drivers] Error 2
  CC      fs/xfs/xfs_error.o
joe@darkstar:~$ cat /var/log/kernelpkg/make-modules.log |grep rror
include/linux/i2c.h:38: error: variably modified 'i2c_bus_type' at file scope
make[3]: *** [drivers/gpu/drm/drm_stub.o] Error 1
make[2]: *** [drivers/gpu/drm] Error 2
make[1]: *** [drivers/gpu] Error 2
make: *** [drivers] Error 2
Analizzando i log a mano con less per capirci... quelle righe sono realmente succesive, cioè non è grep che le ha messe in sequenza così tagliando dei pezzi in mezzo.
Ora, dove potrebbe stare il problema?
Come fare per risolvere?

PS.
Il suspend to ram non mi serve granchè, ma la compilazione del kernel ha sempre il suo fascino... e alla fine ho ceduto.

Re: Errore durante compilazione kernel

Inviato: mer 28 mar 2012, 9:41
da 414N
Prova ad andare nella directory dei sorgenti e dare make, per vedere esattamente cosa causa il blocco.

Re: Errore durante compilazione kernel

Inviato: mer 28 mar 2012, 9:58
da shark1500
Se c'e` veramente un errore segnalalo agli sviluppatori e lo corregono molto velocemente

Re: Errore durante compilazione kernel

Inviato: mer 28 mar 2012, 10:43
da joe
Ho provato a lanciare il make liscio redirigiendo stdout e stderr su due files distinti, riporto il tutto sotto:

Codice: Seleziona tutto

root@darkstar:/usr/src/linux# make 1>/tmp/make-kernel-hand-out.log 2>/tmp/make-kernel-hand-err.log

joe@darkstar:~$ cat /tmp/make-kernel-hand-err.log
drivers/infiniband/core/uverbs_cmd.c: In function 'ib_uverbs_create_ah':
drivers/infiniband/core/uverbs_cmd.c:2253: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.
make[3]: *** [drivers/infiniband/core/uverbs_cmd.o] Error 1
make[2]: *** [drivers/infiniband/core] Error 2
make[1]: *** [drivers/infiniband] Error 2
make: *** [drivers] Error 2

joe@darkstar:~$ tail /tmp/make-kernel-hand-out.log
  CC [M]  drivers/infiniband/core/mad.o
  CC [M]  drivers/infiniband/core/smi.o
  CC [M]  drivers/infiniband/core/agent.o
  CC [M]  drivers/infiniband/core/mad_rmpp.o
  CC [M]  drivers/infiniband/core/sa_query.o
  CC [M]  drivers/infiniband/core/multicast.o
  CC [M]  drivers/infiniband/core/ucm.o
  CC [M]  drivers/infiniband/core/user_mad.o
  CC [M]  drivers/infiniband/core/uverbs_main.o
  CC [M]  drivers/infiniband/core/uverbs_cmd.o
Booo io non ci capisco molto sinceramente....

Re: Errore durante compilazione kernel

Inviato: mer 28 mar 2012, 13:30
da shark1500
drivers/infiniband/core/uverbs_cmd.c:2253: internal compiler error: Segmentation fault
E` un bug di Gcc, non del kernel, e se segui il link ti spiega come segnalare il bug. Se vuoi provare a fare un altro metodo prima prova a dare un "make clean" e poi ridare il make e vedere se da di nuovo l'errore.

Se il problema persiste segnala la cosa a gcc, che come tutti i software non e` esente da bug nemmeno lui.

Re: Errore durante compilazione kernel

Inviato: mer 28 mar 2012, 17:17
da joe
Mi è stato anche consigliato di verificare meglio che il pacchetto tar.bz2 del kernel non sia in qualche modo corrotto. Infatti l'ho scaricato con la mia linea internet tutt'altro che stabile ed affidabile...

Ma per verificarlo devo usare pgp e non so bene come si fà, ero abituato a md5sum o shasum ecc...
Ho trovato in rete:
http://www.rigacci.org/wiki/doku.php/do ... ux/tux/gpg

dove fà proprio l'esempio del kernel, ma non vorrei che fosse roba datata...
Insomma, come faccio praticamente a verificare che il file scaricato, che è:
http://www.kernel.org/pub/linux/kernel/ ... .3.tar.bz2
sia realmente un file buono e non corrotto?
Sul repo da cui l'ho preso c'è anche il seguente file che dovrebbe contenere l'hash immagino, vi metto il link:
http://www.kernel.org/pub/linux/kernel/ ... 3.tar.sign

Come faccio a verificare che il tarbz2 del kernel sia effettivamente sano e non corrotto?

http://www.rigacci.org/wiki/doku.php/do ... ux/tux/gpg

Re: Errore durante compilazione kernel

Inviato: mer 28 mar 2012, 17:35
da 414N
Basta un semplice

Codice: Seleziona tutto

gpg --verifiy file.sign
dopo aver decompresso il solo tar dei sorgenti.
Leggi qui per una spiegazione più completa e per una soluzione one-liner che prevede xz (ma se l'archivio è bz2 puoi usare bunzip2 -c file.tar.bz2 in pipe con gpg).

Re: Errore durante compilazione kernel

Inviato: mer 28 mar 2012, 18:43
da joe
Ok riporto tutte le operazione della trafila:

Codice: Seleziona tutto

root@darkstar:/tmp# bunzib2 -c linux-3.3.tar.bz2 | gpg --verify linux-3.3.tar.sign -
gpg: Signature made Mon 19 Mar 2012 02:10:46 AM CET using RSA key ID 00411886
gpg: Can't check signature: public key not found
root@darkstar:/tmp# gpg --recv-keys 00411886
gpg: requesting key 00411886 from hkp server keys.gnupg.net
gpg: key 00411886: public key "Linus Torvalds <torvalds@linux-foundation.org>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
root@darkstar:/tmp# bunzip2 -c linux-3.3.tar.bz2 | gpg --verify linux-3.3.tar.sign -
gpg: Signature made Mon 19 Mar 2012 02:10:46 AM CET using RSA key ID 00411886
gpg: Good signature from "Linus Torvalds <torvalds@linux-foundation.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: ABAF 11C6 5A29 70B1 30AB  E3C4 79BE 3E43 0041 1886
Ok, ma... alla fine il mio tar.bz2 è buono o corrotto?
Da cosa lo capisco?

Re: Errore durante compilazione kernel

Inviato: mer 28 mar 2012, 19:04
da 414N
Se fosse corrotto la firma non verrebbe riconosciuta (riceveresti un "BAD signature", come messaggio).
Puoi provarlo usando un qualsiasi altro archivio tar.bz2 che hai sul computer.

Re: Errore durante compilazione kernel

Inviato: mer 28 mar 2012, 19:41
da joe
Ok... Quindi il pacchetto tar.bz2 del kernel è buono.

Resta quindi da capire perchè ottengo quegli errori in fase di compilazione, infatti l'ipotesi di qualche file corrotto non regge più a sto punto, giusto?
Prima di segnalare eventuali bug in gcc... (che poi sto usando la versione di default della 13.1, quindi non l'ultimissima) preferisco capire un po' meglio la faccenda.

Quindi gente se avete idee su quale direzione percorrere per venire a capo del problema, dite pure.
Grazie per l'appoggio fin qui ottenuto.

Re: Errore durante compilazione kernel

Inviato: mer 28 mar 2012, 20:23
da 414N
Da quale config sei partito? Da quello del kernel 2.6.33.4 della 13.1? Hai usato make oldconfig prima di iniziare la configurazione/compilazione?

Re: Errore durante compilazione kernel

Inviato: gio 29 mar 2012, 0:16
da joe
Intanto confermo che il kernel che hai pacchettizzato funziona bene, anche per quanto riguarda il suspend to ram, oltre che per la gestione coretta dello scalin della cpu.. Riguardo a questo punto, rispetto al vecchio kernel che usavo devo caricare a mano il modulo acpi_cpufreq che è il driver che utilizzo per la gestione della cpu e poi scalare la frequenza del processore a 1.86GHz (lavora col governor userspase) usando il tool cpufreq-set. Col vecchio kernel probabilmente il sistema riusciva a fare questa manovra in modo automatico.... non so bene perchè. Ma è solo una curiosità perchè risolvo facilmente mettendo i comandi necessari in /etc/rc.d/rc.local e via....

Ok. Tornando alla compilazione fallita.
Il config da cui sono partito è quello in uso.... ho proprio lanciato

Codice: Seleziona tutto

zcat /proc/config.gz > /usr/src/linux/.config
Nello specifico il kernel il uso e quindi il relativo config dovrebbe essere:

Codice: Seleziona tutto

# ls -l /boot/config
lrwxrwxrwx 1 root root 28 2011-01-09 17:41 /boot/config -> config-huge-smp-2.6.33.4-smp
Non è il generic liscio della 13.1, ma è pur sempre un kernel di default che era nella 13.1... Se serve posso allegarlo ma non è rimaneggiato.

Ok a quel punto ho lanciato il "make oldconfig".
Mi ha chiesto parecchie risposte... e per tutte ho premuto invio bellamente, senza pensarci troopo su anche perchè non ho idea di cosa significassero precisamente le domande (molte, troppe direi).
L'unica domanda a cui ho risposto è quella sulla cpu family per la quale ho scelto pentium4 ecc ecc... cioè il tipo del mio processore.

Finito l'oldconfig non ho lanciato il make menuconfig perchè non volevo introdurre altre variazioni alla configurazione del kernel.
Praticamente ho lanciato direttamente kernelpkg, ottenendo però gli errori riportati. Spero siano utili questi dettagli...

Re: Errore durante compilazione kernel

Inviato: gio 29 mar 2012, 9:21
da 414N
Riguardo cpufreq non so che dirti... Hai messo il caricamento di quel modulo nel file /etc/rc.d/rc.modules?
Tra parentesi, se il tuo processore è un Pentium 4 forse è meglio il driver p4-clockmod al posto di acpi-cpufreq. Prova a caricare quello e a controllare cosa compare in dmesg (a volte consiglia di passare comunque ad acpi-cpufreq).
Tornando alla compilazione del kernel, /usr/src/linux è ancora un link simbolico a /usr/src/linux-2.6.33.4? O lo hai cambiato in modo che punti al nuovo kernel (3.3)?
Dato che io non ho riscontrato problemi del genere compilando per due volte lo stesso kernel su Slackware 13.1, mi viene da pensare che forse il tuo pacchetto di gcc o di glibc sia corrotto... Prova a reinstallarli dal disco di installazione o anche tramite slackpkg.

Re: Errore durante compilazione kernel

Inviato: gio 29 mar 2012, 11:49
da joe
414N ha scritto:Riguardo cpufreq non so che dirti... Hai messo il caricamento di quel modulo nel file /etc/rc.d/rc.modules?
No... ma non c'era neanche prima.... voglio dire, cambiando il kernel e non toccando altro, il driver acpi-cpufreq che prima lavorava automaticamente senza bisogno di avviarlo, adesso non lavora più.... ...spetta, mentre scrivo mi viene in mente che forse lo avevo sbloccato tra i moduli del kernel vecchio.
Si si, il problema è quello, infatti:

Codice: Seleziona tutto

root@darkstar:~# ls -l /etc/rc.d/rc.mo*
lrwxrwxrwx 1 root root    23 2011-01-09 17:41 /etc/rc.d/rc.modules -> rc.modules-2.6.33.4-smp*
-rwxr-xr-x 1 root root 35406 2010-05-13 07:16 /etc/rc.d/rc.modules-2.6.33.4*
-rwxr-xr-x 1 root root 35406 2010-05-13 05:39 /etc/rc.d/rc.modules-2.6.33.4-smp*
-rwxr-xr-x 1 root root 28626 2012-03-27 22:00 /etc/rc.d/rc.modules-3.3.0*
Quando si sceglie il kernel 3.3.0 viene considerato il file "rc.modules-3.3.0", mentre prima col kernel di default veniva usato rc.modules-2.6.33.4-smp. Ecco cosa cambia tra i due a livello di cpu-scaling:

Codice: Seleziona tutto

root@darkstar:~# grep -i acpi-cpufreq /etc/rc.d/rc.modules-2.6.33.4-smp
  /sbin/modprobe acpi-cpufreq 2>/dev/null
root@darkstar:~# grep -i acpi-cpufreq /etc/rc.d/rc.modules-3.3.0
#/sbin/modprobe acpi-cpufreq
Cioè ero stato io a ritoccare il file del 2.6 in modo che caricasse il driver acpi-cpufreq.
Bene... quindi dovrebbe bastare decommentare la stessa cosa nel file rc-modules-3.3.0.
In realtà questo serve per definire "chi" deve gestire lo scaling.
Poi però bisogna dire come gestirlo, quindi scegliere la frequenza o il governor che si desidera.
Nel mio caso vado sempre a mano, mettendo la frequenza stabilmente al valore minimo... 1.86GHz.
Però nel rc.modules-2.6.33.4-smp vedo che vi è un bel po' di roba, proprio per stabilire questo comportamento.
Nel nuovo file invece, non ne vedo... Inoltre nel vecchio erano sbloccati parecchi drivers, non solo acpi-cpufreq,
Poi di fatto veniva usato solo quest'ultimo..

Codice: Seleziona tutto

 #
  # It should not hurt anything to try to load these modules.
  #
  # generic ACPI P-States based driver:
  /sbin/modprobe acpi-cpufreq 2>/dev/null
  # AMD mobile K6-2/3+ PowerNow!:
  /sbin/modprobe powernow-k6 2>/dev/null
  # AMD mobile Athlon PowerNow!:
  /sbin/modprobe powernow-k7 2>/dev/null
  # AMD Cool&Quiet PowerNow!:
  /sbin/modprobe powernow-k8 2>/dev/null
  # Intel SpeedStep using the SMI BIOS interface:
  /sbin/modprobe speedstep-smi 2>/dev/null
  # Intel SpeedStep on ICH-based chipsets:
  /sbin/modprobe speedstep-ich 2>/dev/null
  # Intel Enhanced SpeedStep :
  /sbin/modprobe speedstep-centrino 2>/dev/null
  # Intel Pentium4/Xeon clock modulation is not enabled by default.
  # The kernel documentation says "This adds the CPUFreq driver for Intel
  # Pentium 4 / XEON processors.  When enabled it will lower CPU temperature
  # by skipping clocks.  This driver should be only used in exceptional
  # circumstances when very low power is needed because it causes severe
  # slowdowns and noticeable latencies.  Normally Speedstep should be used
  # instead."
  # If you still want to try the Pentium4/Xeon module, uncomment the next line:
  #/sbin/modprobe p4-clockmod 2>/dev/null
  # NatSemi Geode GX / Cyrix MediaGXm:
  /sbin/modprobe gx-suspmod  2>/dev/null
  # Transmeta Crusoe / Efficeon LongRun:
  /sbin/modprobe longrun  2>/dev/null
  # VIA Cyrix Longhaul:
  /sbin/modprobe longhaul  2>/dev/null
  # nForce2 FSB changing cpufreq driver:
  /sbin/modprobe cpufreq-nforce2 2>/dev/null
  # Enhanced PowerSaver driver for VIA C7 CPUs:
  /sbin/modprobe e_powersaver 2>/dev/null
Tra parentesi, se il tuo processore è un Pentium 4 forse è meglio il driver p4-clockmod al posto di acpi-cpufreq. Prova a caricare quello e a controllare cosa compare in dmesg (a volte consiglia di passare comunque ad acpi-cpufreq).
L'unico che non viene automaticamente caricato è proprio p4-clockmod.
In realtà in passato l'avevo già provato, ma non gestiva correttamente la cpu, sembrava molto rallentata scegliendo le frequenze più basse, ma la ventolina girava comunque a palla, comunque posso sempre fare una prova.
Per la cronaca il mio processore risulta

Codice: Seleziona tutto

root@darkstar:~# uname -p
Mobile Intel(R) Pentium(R) 4 CPU 3.20GHz
Tornando alla compilazione del kernel, /usr/src/linux è ancora un link simbolico a /usr/src/linux-2.6.33.4? O lo hai cambiato in modo che punti al nuovo kernel (3.3)?
Sì si, ho dato il classico:

Codice: Seleziona tutto

rm -rf /usr/src/linux
ln -sf /tmp/linux-3.3.0 /usr/src/linux
Dato che io non ho riscontrato problemi del genere compilando per due volte lo stesso kernel su Slackware 13.1, mi viene da pensare che forse il tuo pacchetto di gcc o di glibc sia corrotto... Prova a reinstallarli dal disco di installazione o anche tramite slackpkg.
Ma su slackware-13.1 ho già compilato diversa roba... non il kernel, però di programmi ne ho compilati parecchi e senza problemi, se fosse stato corrotto il pacchetto delle glibc o gcc me ne sarei accorto molto tempo fa non credi?

Re: Errore durante compilazione kernel

Inviato: gio 29 mar 2012, 12:10
da 414N
joe ha scritto:

Codice: Seleziona tutto

root@darkstar:~# ls -l /etc/rc.d/rc.mo*
lrwxrwxrwx 1 root root    23 2011-01-09 17:41 /etc/rc.d/rc.modules -> rc.modules-2.6.33.4-smp*
-rwxr-xr-x 1 root root 35406 2010-05-13 07:16 /etc/rc.d/rc.modules-2.6.33.4*
-rwxr-xr-x 1 root root 35406 2010-05-13 05:39 /etc/rc.d/rc.modules-2.6.33.4-smp*
-rwxr-xr-x 1 root root 28626 2012-03-27 22:00 /etc/rc.d/rc.modules-3.3.0*
Occhio che Slackware cerca innanzitutto un file rc.modules-"VERSIONE-KERNEL-ATTUALE" (nel tuo caso rc.modules-3.3.0 se avvi questo kernel). Nel caso esista, viene eseguito; altrimenti carica il file /etc/rc.d/rc.modules che, essendo normalmente un link simbolico al kernel originario di Slackware, finisce col caricare i moduli che avevi impostato per il kernel 2.6.33.4.
Questo va benissimo finché i moduli che ti servono non cambiano nome da una versione all'altra del kernel, nel qual caso puoi sempre creare un file all'uopo per il nuovo kernel che non vada ad intaccare le impostazioni del vecchio kernel che magari si vuole mantenere come failsafe.
Venendo al tuo caso, a meno che non ti sia reso conto che alcuni moduli che ti servono abbiano cambiato nome dalla versione 2.6.33.4 alla 3.3, io cancellerei il file rc.modules-3.3.0, tanto i moduli che venivano caricati nel 2.6.33.4 verranno caricati anche nel 3.3.
joe ha scritto: Ma su slackware-13.1 ho già compilato diversa roba... non il kernel, però di programmi ne ho compilati parecchi e senza problemi, se fosse stato corrotto il pacchetto delle glibc o gcc me ne sarei accorto molto tempo fa non credi?
Non hai tutti i torti... Prova a compilare il kernel usando

Codice: Seleziona tutto

make V=1
in modo da poter vedere l'output completo di gcc. Ovviamente puoi usare l'opzione -j per parallelizzare un po' il lavoro ;)