Qual è il vantaggio di compilare il tuo kernel Linux?


101

Quali benefici potrei vedere compilando un kernel Linux da solo? C'è qualche efficienza che potresti creare personalizzandola sul tuo hardware?


la semplice domanda di quale sia il vantaggio diventa vaga o fuori dal contesto molto rapidamente. Sarebbe meglio chiedere a What are the pros and cons of compiling your own kernel? Contro = non facile, molte situazioni senza valore aggiunto. Pro = sicurezza, prestazioni, se sai cosa stai facendo, dispositivi NAS per esempio, usando Linux per far funzionare un pezzo di hardware e avere capacità di rete e grafica.
ron

Risposte:


73

Nella mia mente, l'unico vantaggio che ottieni dalla compilazione del tuo kernel Linux è:

Imparerai come compilare il tuo kernel Linux.

Non è qualcosa che si deve fare per una maggiore velocità / memoria / xxx qualunque cosa. È una cosa preziosa da fare se questo è lo stadio in cui ti senti nel tuo sviluppo. Se vuoi avere una comprensione più approfondita di cosa sia tutta questa faccenda "open source", su come e quali siano le diverse parti del kernel, allora dovresti provare. Se stai solo cercando di accelerare il tempo di avvio di 3 secondi, allora ... qual è il punto ... vai a comprare un SSD. Se sei curioso, se vuoi imparare, compilare il tuo kernel è un'ottima idea e probabilmente ne otterrai molto.

Detto questo, ci sono alcuni motivi specifici in cui sarebbe opportuno compilare il proprio kernel (come diverse persone hanno sottolineato nelle altre risposte). Generalmente questi derivano da un'esigenza specifica che hai per un risultato specifico, ad esempio:

  • Devo far avviare / eseguire il sistema su hardware con risorse limitate
  • Devo testare una patch e fornire feedback agli sviluppatori
  • Devo disabilitare qualcosa che sta causando un conflitto
  • Ho bisogno di sviluppare il kernel Linux
  • Devo abilitare il supporto per il mio hardware non supportato
  • Devo migliorare le prestazioni di x perché sto colpendo gli attuali limiti del sistema (e so cosa sto facendo)

Il problema sta nel pensare che ci sia qualche vantaggio intrinseco nella compilazione del proprio kernel quando tutto sta già funzionando come dovrebbe essere, e non penso che ci sia. Anche se puoi passare innumerevoli ore disabilitando cose che non ti servono e modificando le cose che sono modificabili, il fatto è che il kernel Linux è già abbastanza ben sintonizzato (dalla tua distribuzione) per la maggior parte delle situazioni dell'utente.


25
Direi che se vuoi creare il tuo kernel semplicemente per l'esperienza di apprendimento, lo fai con una distribuzione Linux basata su sorgenti come Gentoo o Linux From Scratch. La documentazione sull'installazione di Gentoo Stage 2 è un'eccellente guida per capire cosa significa compilare Linux dal kernel.
Sandy,

D'accordo ... quei due progetti sono costruiti per questo tipo di cose.
gabe.

Ovviamente sai che in realtà ti contraddici nella tua risposta. Se l'unico vantaggio della compilazione del kernel fosse imparare come farlo, allora sarebbe inutile - non avere alcun valore. Ma poi qualche parola dopo dici che è una cosa preziosa ...
rozcietrzewiacz

@rozcietrzewiacz La conoscenza ha il massimo valore. Compilare un kernel ti aiuta ad ampliare le tue conoscenze. Se non lo compri, ecco questo: la conoscenza è potere e le persone pagano buoni soldi per ottenere potere, e il denaro detiene valore nel mondo di oggi, quindi dalla proprietà transitiva ....: P
lunchmeat317

Sono d'accordo, ne vale la pena solo per le conoscenze acquisite.
1100110

35

La maggior parte degli utenti non ha bisogno di compilare il proprio kernel, la loro distribuzione ha fatto questo lavoro per loro. Di solito le distribuzioni includeranno un set di patch per integrarsi con determinate parti del modo in cui funziona la distribuzione, backport dei driver di dispositivo e correzioni da versioni più recenti, ma inedite del kernel o funzionalità che stanno sperimentando con i loro utenti.

Quando compili il tuo kernel, hai un paio di opzioni, puoi compilare un kernel Linus Torvalds ufficiale, questo non includerà nessuna delle patch o personalizzazioni aggiunte dalla tua distribuzione (che può essere buona o cattiva) oppure puoi usa il tuo strumento di ricostruzione della distribuzione per creare il tuo kernel.

I motivi per cui potresti voler ricostruire il tuo kernel includono:

  • Correggere i bug o aggiungere una funzionalità specifica a un sistema di produzione, dove non si può davvero rischiare di aggiornare l'intero kernel per una o due correzioni.
  • Per provare un driver di dispositivo particolare o una nuova funzionalità
  • Per estendere il kernel, lavoraci su
  • test di alcuni dei moduli o delle funzionalità "Alpha".

Molti sviluppatori lo usano per creare anche versioni personalizzate del kernel per sistemi embedded o settop box in cui hanno bisogno di driver di dispositivo speciali o vogliono rimuovere funzionalità di cui non hanno bisogno.


8
+1. Bambini di questi tempi, non sanno nemmeno cosa significhi "make menuconfig" e non hanno mai dovuto patchare il loro codice di rete del kernel per evitare che venissero generati da script kiddies. Fortunatamente quei giorni sono quasi tutti andati.
axel_c,

2
dovresti aggiungerlo bisectper scoprire dove è stato introdotto un bug ...
xenoterracide

1
sorprendente come questo commento sia stato votato quando non ha nulla a che fare con la domanda del PO. "La maggior parte degli utenti non ...." dai adesso. La domanda di OP è molto chiara sul voler conoscere i benefici; non la tua opinione su ciò che "la maggior parte degli utenti" fa qua e là.
Eric

30

La compilazione del kernel consente di includere solo le parti rilevanti per il proprio computer, il che lo rende più piccolo e potenzialmente più veloce, soprattutto al momento dell'avvio. I kernel generici devono includere il supporto per la maggior parte dell'hardware possibile; all'avvio rilevano quale hardware è collegato al tuo computer e carica i moduli appropriati, ma ci vuole tempo per fare tutto ciò e hanno bisogno di caricare moduli dinamici, piuttosto che avere il codice inserito direttamente nel kernel. Non c'è motivo di avere il tuo kernel in grado di supportare 400 CPU diverse quando ce n'è solo una nel tuo computer o di supportare mouse bluetooth se non ne hai uno, è tutto lo spazio sprecato che puoi liberare


15
Sono d'accordo con la maggior parte della tua risposta, ma sarei curioso di alcuni fatti concreti su "considerevolmente più veloce". Non vorrei dare a un nuovo utente l'impressione che il suo desktop funzionerà generalmente più velocemente con un kernel costruito a mano (dalla mia esperienza con Gentoo, questo semplicemente non è vero). Puoi quantificare i guadagni nella velocità di avvio?
Sandy,

2
Questa risposta era vera 15 anni fa, ma al giorno d'oggi non è rilevante. La maggior parte dei driver arriva comunque in moduli, quindi occupano solo spazio sul disco, non in memoria. (O alcune distribuzioni arrivano ancora senza initrd? Senza un initrd il kernel deve includere tutti i driver di cui potrebbe aver bisogno per avviarsi.) Per quanto riguarda il tempo di avvio, i pochi driver che impiegano più di un millesimo di secondo a cercare di rilevare hardware inesistente possono essere disabilitati con un'opzione di avvio del kernel.
Gilles,

1
@Michael se si tratta di un'ipotesi non verificata, penso che sostituire "considerevolmente più veloce" con "potenzialmente più veloce" nella tua risposta potrebbe essere una buona idea ... solo per assicurarsi che nessun n00bs sia fuorviato. :-)
Sandy,

3
@Sandy concordato, dal momento che sembra che io sia uno di quei n00bs :). Risolto
Michael Mrozek

2
Penso che "considerevolmente" più velocemente sia in realtà giustificato dall'avvertenza di cui stiamo parlando dei tempi di avvio. I kernel di distro di serie impiegano 5-10 secondi in più per avviarsi rispetto a quello che ho rimosso per non cercare alcun hardware che non intendo utilizzare. La velocità del tempo di esecuzione è probabilmente trascurabile, non riesco a misurarla in modo affidabile.
Caleb,

24

Non posso credere che la risposta accettata qui inizi dicendo "Non è qualcosa che devi fare per più velocità / memoria / xxx".

Questo è totalmente falso. Costruisco abitualmente i miei kernel su ordinazione per rimuovere sia il codice non necessario, sia per includere il codice di miglioramento delle prestazioni principalmente legato all'hardware. Ad esempio, eseguo alcuni hardware più vecchi e posso ottenere alcuni miglioramenti delle prestazioni abilitando i driver del kernel raramente abilitati come il supporto del chipset HPT36x su alcuni Mobo più vecchi che hanno questo built-in.

Un altro esempio, BIG SMP in Slackware è l'impostazione predefinita e su un Dell 2800, ad esempio, consumerà una stampa di dimensioni considerevoli per eseguire cose come GFSD (non come un modulo del kernel) che, tra l'altro, consuma tick della CPU per qualcosa che I non ho bisogno. Allo stesso modo per NFSD e altri catch-all per compiacere tutte le mentalità, il che va bene se stai solo cercando di ottenere un Linux su una scatola e in esecuzione ma se ti interessa "speed / memory / xxx qualunque", allora queste cose contano e funzionano .

Tutte le mie scatole di produzione sono kernel personalizzati. Se sono su hardware comune come un hardware della serie Dell (2800, 2850, 2900, ecc ...), è semplice copiare il file .config del kernel in ogni box e compilare il kernel e installarlo.


3
Penso che il punto principale della risposta accettata sia che per la maggior parte dell'hardware, le prestazioni ottenute compilando il proprio kernel non valgono il tempo necessario per imparare a farlo (e capire cosa significano le opzioni). Questo è probabilmente esperienziale: sarebbe bello trovare alcuni numeri su questo.
Andres Riofrio,

beh, allora è disonesto non affermarlo nella domanda originale e quindi accettare la risposta che si basa sui motivi che asserisci.
Eric,

2
Bene, non è colpa mia se la mia risposta è stata accettata. E mentre sì, ci sono casi in cui la compilazione del kernel ti aiuterà a "migliorare le prestazioni" o ad iniziare a funzionare su una macchina a bassa potenza, ho ipotizzato che la domanda originale fosse stata posta da qualcuno che non aveva uno specifico bisogno in anticipo, ed era solo curioso in senso generale quale fosse il vantaggio di compilare un kernel. Direi che solo le persone con requisiti specifici in mente beneficiano delle modifiche del kernel. Dal momento che la mia risposta è stata accettata, la migliorerò per affrontare le ragioni più
energiche

14

Ecco alcune situazioni in cui la compilazione del proprio kernel ti gioverà:

  • Un kernel con caricamento del modulo disabilitato è più sicuro. Ciò richiederà di selezionare i moduli di cui sai di aver bisogno e di includerli come parte del kernel, invece di compilarli come moduli.

  • Disabilitare il supporto per / dev / kmem o paralizzarlo con l'opzione del compilatore appropriata è una buona cosa per la sicurezza. Penso che la maggior parte delle distro lo faccia per impostazione predefinita ora.

  • Preferisco non usare initrd quando possibile. La personalizzazione del kernel per l'hardware da cui si elimina elimina initrd.

  • A volte una versione successiva del kernel avrà le caratteristiche di cui hai bisogno, ma oggi è molto raro. Ricordo che quando ho iniziato a usare Debian per la prima volta, usava i kernel 2.4, ma avevo bisogno di un kernel 2.6 per il supporto udev.

  • La disabilitazione dei protocolli / opzioni di rete non necessari può accelerare le prestazioni TCP / IP.

  • Disabilitare le opzioni che non ti servono riduce l'ingombro di memoria del kernel, il che è importante in ambienti con poca RAM. Quando si utilizza un sistema RAM da 256 MB come router, questo aiuta.

  • Trovo che tutti i dispositivi "tty" in / dev siano fastidiosi nei sistemi in cui generalmente accedo solo tramite seriale o ssh.


Tutto vero. Tuttavia, la rimozione del caricamento del modulo può causare problemi all'avvio: la maggior parte, se non tutte, le distribuzioni oggi presuppongono che i moduli debbano essere caricati. L'ultima volta che ho spento i moduli, durante il processo di avvio di Red Hat è stata visualizzata una serie di messaggi di errore.
Mei,

7

La compilazione del tuo kernel ti consente di partecipare al processo di sviluppo del kernel, sia che si tratti di cose semplici come fornire gli ID dei dispositivi PCI / USB per un driver esistente che potrebbero far funzionare un dispositivo più nuovo per te, sia coinvolto profondamente nella mischia del core sviluppo del kernel.

Consente inoltre di testare i kernel di sviluppo sull'hardware e di fornire feedback in caso di regressioni. Questo può essere particolarmente utile per te e gli altri se hai un hardware insolito. Se aspetti un kernel distro, può richiedere del tempo prima che le correzioni dei rapporti sui problemi vengano filtrate in una nuova versione del kernel distro.

Personalmente mi piace anche compilare i miei kernel per includere il supporto solo per l'hardware che ho. Quando esegui i kernel di distro e guardi l'output di lsmod(8), vedi molti moduli caricati per l'hardware che non hai. Questo può inquinare l'elenco dei moduli, / proc, / sys e i tuoi log in modo tale che quando stai cercando qualcosa che può essere nascosto tra il rumore; Inoltre, non puoi essere sicuro al 100% che quei moduli non contribuiscano a un problema che stai tentando di diagnosticare.


6

Ho la seconda risposta di gabe. (Il mio commento è troppo lungo, quindi sto postando come risposta).

A meno che tu non abbia uno scopo altamente specializzato (ad esempio macchine incorporate, rigorosa creazione di profili di sicurezza), non vedo alcun vantaggio pratico nel compilare il tuo kernel se non quello di vedere come è fatto. Esaminando metodicamente le opzioni, vedere come interagiscono tra loro per costruire il sistema è un ottimo modo per capire come funziona il sistema. È sorprendente quello che scopri quando provi a rimuovere componenti che non sembrano avere alcuno scopo per le attività che stai cercando di svolgere.

Attenzione però: perché saltare nella tana del coniglio è senza dubbio esilarante, risucchia più notti e fine settimana di quanto pensassi possibile!


3

Al lavoro, usiamo i kernel arrotolati a mano per applicare patch out-of-tree come vserver e unionfs.

A casa, sto compilando kernel rotolati a mano per scoprire quale commit ha introdotto un bug che sto riscontrando. Una volta terminato, probabilmente mi atterrerò su un kernel a rotazione manuale fino a quando il bug non verrà corretto nella mia distribuzione (Debian), a quel punto ritornerei di nuovo ai loro kernel.


2

Questa discussione è antichissima e tuttavia è ancora valida oggi come lo era quando è stata posta la domanda!

La risposta è: compili il kernel linux di tua scelta secondo le tue necessità e requisiti.

Sono validi molti scenari:

  1. Sei un ingegnere e hai bisogno che la tua build soddisfi i requisiti / requisiti di prestazioni e sicurezza del tuo sistema, ti ricompili per soddisfare e / o superare i criteri specificati.

  2. Sei un utente normale e hai un vecchio sistema che vuoi continuare a lavorare il più a lungo possibile, ti ricompili per aggiungere / rimuovere componenti per mantenere il tuo vecchio sistema ottimizzato.

  3. Sei un utente normale con l'ultimo hardware più veloce e ha memoria / RAM più che sufficiente. Non è necessario ricompilare, ma è ancora possibile se si è interessati a saperne di più sul proprio sistema.

  4. Vuoi solo essere come un utente quotidiano di Microsoft e / o Mac, non ricompilare e semplicemente andare con gli aggiornamenti dalla tua distribuzione a monte.

  5. Mantieni gli scenari in arrivo :-)

A differenza degli utenti Mac / Windows, ciò che Linux fornisce è la scelta. La scelta di semplificare o ottimizzare il sistema in base alle proprie esigenze.


1

Per la maggior parte degli usi, i kernel generici sono adatti praticamente a qualsiasi hardware. Inoltre, di solito contengono (ed) patch specifiche per la distribuzione, quindi la compilazione del proprio kernel può (potrebbe) causare problemi.

I reson per compilare il proprio kernel sono:

  • Stai usando una distribuzione basata sul sorgente, quindi non esiste un kernel "generico"
  • Sei sviluppatore del kernel e sviluppi il kernel
  • Ad esempio, è necessario personalizzare il kernel per i dispositivi integrati con un disco rigido molto limitato
  • Alcuni driver non sono compilati in (caso molto raro)
  • Vuoi patchare il kernel E sai cosa stai facendo
  • Vuoi imparare a compilare il kernel

Se non usassi la distribuzione basata sul sorgente non compilerei affatto il kernel.


1

Un altro caso oltre ai molti citati qui per avere kernel compilati personalizzati è la creazione di ambienti di avvio di rete specializzati in cui il caricamento del modulo non è fattibile e si devono distribuire kernel completamente funzionanti a macchine specifiche per compiti specifici.


1

Sono sorpreso che nessuno abbia menzionato questo motivo per compilare un kernel personalizzato:

perché vuoi usare un compilatore C / c ++ diverso. GCC è abbastanza buono per compilare il kernel di Linux. Ma ci sono compilatori di gran lunga superiori là fuori! Le ottimizzazioni di GCC sono un po 'alla base del compilatore C / C ++ di Intel. E Intel fornisce le librerie di primitive sulle prestazioni e lo strumento vtune, entrambi indispensabili per la produzione di un kernel linux ad alte prestazioni. Puoi arrivare così lontano solo con GCC e G ++. Praticamente, qualunque cosa tu faccia, il compilatore limiterà il risultato. Quindi, utilizzo il compilatore Intel e le librerie delle prestazioni. È un po 'grande: 1,5 GB di download, ma questo mi dà un'idea di ciò che è contenuto in un buon compilatore.

Il compilatore C / C ++ di Intel è disponibile gratuitamente per uso non commerciale. Ma è più facile accedere alla pagina di download del compilatore Intel c ++ con licenza non commerciale che cercare nel sito Web di Intel. Di solito non uso GCC / G ++ per niente. E non devi essere un programmatore. Basta impostare il proprio ambiente e modificare due righe nel file make in modo che puntino al compilatore Intel.

Quindi puoi ottenere una certa velocità seria!


-1

Se vuoi installare Linux su hardware molto specifico, ad esempio più esotico di un DS , dovrai compilare in modo incrociato il tuo kernel.

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.