Cosa succede in ogni fase del processo di compilazione del kernel Linux?


27

Ho letto molti tutorial su come costruire kernel personalizzati e avviare Ubuntu usando quei kernel, e ho seguito con successo le guide e i kernel personalizzati avviati, ma non ho idea di cosa faccia ciascuno dei comandi nelle guide e cosa stia effettivamente accadendo ogni comando.

La procedura descritta sul sito di Ubuntu fa un sacco di lavoro con fakeroot, dpkg, make-kpkg, alcuni initramfs, e altre cose orribili che le opere, ma semplicemente non aiuta a capire che cosa sta succedendo.

  • Qual è l'output di makein una directory del kernel linux?
  • Crea una "immagine del kernel compressa"?
  • Qual è il nome del file "immagine del kernel compresso" e dove si trova?
  • Cosa fa make modules?
  • Dovrebbe make modulesessere fatto prima o dopo make?
  • Non makecrea i miei moduli automaticamente?
  • Qual è il processo (in inglese, non solo l'elenco dei comandi) di aggiungere kernel di nuova creazione all'elenco dei kernel di avvio?
  • Cosa fa make install?
  • Lo make installaggiungerò al mio elenco di kernel di avvio in modo che non debba fare altro?
  • C'è un equivalente make modules_install?

Questo dovrebbe essere suddiviso in più domande.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Risposte:


34

Dall'alto...

  • makecompila e collega l'immagine del kernel. Questo è un singolo file chiamato vmlinuz.
  • make modulescompila i singoli file per ogni domanda a cui hai risposto Mdurante la configurazione del kernel. Il codice oggetto è collegato al kernel appena creato. (Per le domande con risposta Y, queste sono già parte di vmlinuze per le domande con risposta Nvengono saltate).
  • make installinstalla il kernel creato su /vmlinuz.
  • make modules_installinstalla i moduli del kernel su /lib/moduleso /lib/modules/<version>.

Per quanto riguarda l'aggiunta all'elenco dei kernel disponibili, è gestito dal boot loader. È diverso per ogni boot loader, ma grubè il più comune su x86 e amd64, quindi lo descriverò. In realtà è abbastanza semplice. Sguardi Grub in /, /boote /lib/modulesper qualsiasi cosa che sembra che potrebbe essere un kernel di lavoro e lo aggiunge. E sì, questa è una descrizione semplificata.

Quelle "cose ​​orribili" extra nella documentazione di Ubuntu sono cose extra per creare un debpacchetto. Quando lo fai per più di te stesso è molto meglio impacchettarlo. Passerai in tempo.

La costruzione del kernel e dei moduli è mantenuta separata perché per le persone che hanno bisogno (cioè gli sviluppatori del kernel) spesso apportano modifiche solo a un modulo. Possono applicare le loro modifiche, ricostruire e installare solo i moduli. Ciò consente di risparmiare molto tempo quando deve essere eseguito 20 volte al giorno. Non verrà mai aggiornato per avere un singolo make everythingcomando. Invece, corri make && make modules && make install && make modules_install proprio come la documentazione dice di fare . Il processo di compilazione favorisce gli sviluppatori del kernel, non tu. E così dovrebbe essere.

In realtà non c'è quasi motivo per nessuno, tranne gli sviluppatori del kernel o i distro packager di compilare un kernel. In quasi ogni circostanza la funzionalità del kernel che desideri è già stata creata per te ed è disponibile in uno dei kernel preconfezionati. Ci sono eccezioni, ma al giorno d'oggi sono estremamente rare.

Non che ti scoraggi dal creare il tuo kernel, in realtà ti incoraggio a farlo. Penso che costruire il tuo kernel da zero sia una pratica inestimabile per imparare come funziona tutto laggiù. In parte, perché forse un giorno sarà l'eccezione che ha bisogno di. Ma ti insegna anche molto sul processo di kernel e boot in generale. Sarai una persona migliore per averlo fatto.


1
Grazie mille per la descrizione del processo leggibile dall'uomo. Ho qualche dubbio La mia compilation del kernel ha prodotto vmlinux e non vmlinuz. Penso che la differenza sia la compressione. Devo comprimere l'immagine manualmente? È /vmlinuzuna directory nella cartella principale? quando eseguo un'installazione make verrà creata questa directory e vi verrà inserito un nuovo kernel? Sarà make modules_installsostituire i miei moduli attualmente installati? Supponiamo di posizionare il mio vmlinux nella directory / boot, devo fare qualcos'altro (come modificare i file di configurazione di grub e fare grub-update o qualcosa del genere?)
AnkurVj

3
Hai ragione, la differenza è la compressione. Il comando make bzimageè cosa fa. /vmlinuzè un file binario, non una directory. Ho creato solo kernel impacchettati da circa 5 anni, quindi non ricordo esattamente il comportamento di modules_installun kernel installato direttamente. Grub troverà il tuo kernel /bootsenza aiuto. Sì, è necessario eseguire sempre grub-updatedopo l'installazione di un nuovo kernel.
bahamat,

quindi avrei dovuto farlo make bzimageinvece di make? Devo fare un make cleane make bzimageancora? Di /vmlinuzcosa si intende il file verrà creato nella directory principale o nella directory dei sorgenti del kernel di Linux?
AnkurVj,

1
Non importa se il tuo kernel è compresso o meno. Non compresso occupa solo un po 'più di spazio su disco. Qualunque cosa con il prefisso /è un percorso assoluto, quindi sì, questo è un file nella radice.
bahamat,

1
@GuyAvraham I moduli con risposta Ysono compilati in (cioè fanno parte di vmlinuz). I moduli con risposta Mvengono compilati come moduli caricabili. I moduli con risposta Nnon vengono compilati. make modules_installsi applica solo alle risposte M.
Bahamat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.