2014-04-24 18 views
14

Ho core i5 con 8gb di RAM. Ho installato VMware workstation 10.0.1 sul mio computer. Ho installato Fedora 20 Desktop Edition su VMware come SO guest.Come velocizzare la compilazione del kernel Linux?

Sto lavorando al codice sorgente del kernel Linux v 3.14.1. Sto sviluppando un programmatore I/O per il kernel Linux. Dopo ogni modifica al codice ogni volta ci vogliono circa 1 ora e 30 minuti per compilare e installare l'intero codice del kernel per vedere le modifiche.

compilazione e l'installazione comandi: make menuconfig, make, make modules, make modules_install, make install

Quindi la mia domanda è possibile ridurre 1 ora e 30 minuti di tempo in solo 10 a 15 minuti?

+0

c'è un po 'noto 'gconfig' menù che è incredibilmente più conveniente vs' make menuconfig –

risposta

2
  1. Usa make accumulo parallelo con -j opzione
  2. Compilare solo per l'architettura di destinazione, dal momento che altrimenti rendere costruirà il kernel per ogni architettura elencato.

vale a dire per esempio invece di correre:

make 

run:

make ARCH=<your architecture> -jN 

dove N è il no di core presenti sulla macchina (cat /proc/cpuinfo liste il no di nuclei). Per esempio, per i386 target e host macchina con 4 cores (uscita di cat /proc/cpuinfo):

make ARCH=i386 -j4 

Allo stesso modo è possibile eseguire l'altro rendono bersagli (modules, modules_install, install) con -jN bandiera.

Nota:make fa un controllo dei file modificati e compila solo i file che sono stati modificati in modo che solo la formazione iniziale dovrebbe prendere tempo, successivo costruisce sarà più veloce.

+0

Scusate il fatto che sono un po 'nuovo per le cose del kernel, quindi potete per favore approfondire "make ARCH = -jN". E sì, hai fatto solo compilare il codice modificato che impiega circa 10 minuti, ma i comandi "make modules_install" richiedono circa 45 minuti per creare file .ko. Qualche commento per favore? – momersaleem

+0

Supponiamo che il computer di destinazione sia 'i386' e che la macchina abbia' 4 core', quindi puoi eseguire il tuo make come: 'make ARCH = i386 -j4'. – brokenfoot

18

Non fare make menuconfig per ogni modifica apportata alle origini, poiché attiverà una compilazione completa di tutto, indipendentemente da quanto sia banale la modifica. Questo è necessario solo quando l'opzione di configurazione del kernel cambia, e questo dovrebbe accadere durante lo sviluppo.

Basta fare:

make 

o se si preferisce la compilazione parallela:

make -j4 

o qualunque sia il numero di operazioni simultanee si voglia.

Quindi il make install, ecc. Può essere necessario per la distribuzione dei file binari di recente costruzione, ovviamente.

Un altro trucco è configurare il kernel al minimo necessario per i test. Ho trovato che per molte attività una compilazione UML (User Mode Linux) è la più veloce. Potresti anche trovare utile make localmodconfig invece di make menuconfig per iniziare.

+0

l'argomento '-j' dovrebbe essere 1.5x il numero di core –

5

Non è necessario eseguire make menuconfig di nuovo ogni volta che si apporta una modifica: è necessario solo una volta per creare il file del kernel .config. (O forse ancora una volta, se si modifica Kconfig file per aggiungere o modificare le opzioni di configurazione, ma questo certamente non dovrebbe accadere spesso.)

condizione che il vostro .config è lasciato solo, in esecuzione make dovrebbe ricompilare solo i file che hai modificato. Ci sono alcuni file che devono essere compilati ogni volta, ma la stragrande maggioranza no.

+0

Grazie per i vostri commenti. Come hai detto, esegui "make menuconfig" una sola volta. Va bene. Il comando "make" verrà eseguito ogni volta dopo ogni modifica del codice, ovviamente. Ma è anche necessario eseguire "make modules", "make modules_install" e "make install" ogni volta dopo ogni modifica nel codice per vedere le mie modifiche? – momersaleem

+1

'make modules' crea i moduli,' make modules_install' installerà i moduli nella loro directory di default che è '/ lib/{your-kernel-version-name}/modules' e' make install' "installa" il nuovo kernel , come nel copiare l'immagine del kernel compresso nel percorso predefinito, in genere/boot/insieme a System.map e ai file .config. Tornando alla tua domanda, se hai apportato alcune modifiche ai moduli, è sicuramente necessario. Dato che apparentemente lavori sullo scheduler, probabilmente stai lavorando con il kernel centrale, quindi non c'è bisogno di fare un 'make modules' dato che non farà nulla – HighOnMeat

0

Forse in aggiunta ai suggerimenti precedenti, l'utilizzo del software ccache (https://ccache.samba.org/) e una directory di compilazione sull'unità SSD dovrebbero ridurre drasticamente il tempo di compilazione.

0

Se si dispone di RAM sufficiente e non si sta utilizzando la macchina durante la creazione del kernel, è possibile generare un numero elevato di lavori simultanei. Ma assicurati che la tua RAM sia sufficiente altrimenti il ​​sistema si bloccherà e si bloccherà.

2

make -j utilizzerà tutte le CPU disponibili.

+0

genera centinaia di processi del compilatore e il sistema si blocca –

+0

@OlegMikheev Non l'ho visto nel programma precedente, forse puoi specificare un limite di conteggio del lavoro se ciò accade, ad esempio 'make -j 4' come suggerito in altre risposte. –

0

ccache dovrebbe essere in grado di velocizzare notevolmente i tempi di compilazione. Accelera la ricompilazione memorizzando nella cache le compilation precedenti e rilevando quando viene eseguita di nuovo la stessa compilation. La tua prima compilation con ccache sarà più lenta poiché è necessario popolare la cache, ma le build successive dovrebbero essere molto più veloci.

Se non si vuole storie con le configurazioni di ccache si può solo correre in questo modo per compilare il kernel:

ccache make 
Problemi correlati