L'intero kernel è caricato in memoria all'avvio?


14

Ho letto questo popolare documento IBM (lo vedo riferito abbastanza spesso sul web) che spiega la funzione del disco RAM iniziale.

Ho colpito un muro nel concettualizzare come funziona però.

Nel documento dice

Il boot loader, come GRUB, identifica il kernel da caricare e copia in memoria l'immagine del kernel e qualsiasi initrd associato

Sono già confuso: copia l'intero kernel in memoria o solo in parte? Se l'intero kernel è in memoria, allora perché abbiamo bisogno del disco RAM iniziale?

Pensavo che lo scopo di initrd fosse quello di essere in grado di avere una piccola immagine del kernel generalizzata e initrd installerà i moduli corretti prima che venga caricata l'immagine del kernel. Ma se l'intero kernel è già in memoria, perché abbiamo bisogno di initrd?

Ciò solleva anche un'altra cosa che mi confonde: dove si trovano i moduli che vengono caricati nel kernel? Tutti i moduli del kernel sono memorizzati all'interno di initrd?


Sì. L'intero kernel. E i suoi primi rootfs. Ma i kernel Linux non hanno usato initrd in molti anni.
Mikeserv,

Giusto, lo stavo leggendo. È stato in gran parte sostituito da initramfs giusto? Ed è ancora un processo simile con initramfs corretto?
user1028270,

1
è stato completamente sostituito per tutti i kernel dalla serie 2.6. Ma il processo è in qualche modo simile, tranne per il fatto che initramfs non è mai smontato: è sempre lì e anche sempre radice. Devi montare il tuo sviluppatore di root su di esso, in realtà. Ci sono anche i vantaggi di non dover emulare uno sviluppatore di blocchi separato e simili.
Mikeserv,

Bene, leggerò l'articolo a cui ti sei collegato. Quindi i moduli del kernel sono archiviati nei rootfs di initramfs?
user1028270,

1
@edwardtorvalds: tutto è gestito udevnormalmente e sì automaticamente.
Mikeserv,

Risposte:


17

L'intero kernel viene caricato in memoria all'avvio, in genere insieme a un initramfsgiorno d' oggi. (È ancora possibile configurare un sistema per l'avvio senza un initramfsma questo è insolito su desktop e server.)

Il initramfsruolo è quello di fornire le funzionalità necessarie per montare i filesystem "reali" e continuare ad avviare il sistema. Ciò comporta moduli del kernel e anche vari binari: è necessario almeno un udevpo 'di rete e kmodche carica i moduli.

I moduli possono essere caricati nel kernel più tardi del semplice avvio, quindi non c'è alcuna preparazione speciale del kernel da parte di initramfs. Possono essere archiviati ovunque: il initramfs, /lib/modulessul vero filesystem, in un albero di sviluppo se stai sviluppando un modulo ... Gli initramfsunici devono contenere i moduli necessari per montare il filesystem di root (che contiene il resto).


OK ha senso per me. Penso che stavo fondendo l'immagine del kernel e il file system che utilizza, che ovviamente sono totalmente separati.
user1028270,

5

L'intero kernel (ma non i suoi moduli) verrà caricato in memoria. Se ci sono moduli di cui il kernel avrà bisogno prima che sia disponibile un filesystem (questo di solito significa i driver per i filesystem e i loro dispositivi), allora quei moduli saranno negli initramfs (in memoria), e il kernel li caricherà da lì. Altri moduli possono essere caricati in un secondo momento dal file system.


3

Il kernel nelle moderne configurazioni Linux è fortemente basato su moduli, cioè il kernel proprio (caricato all'avvio nella RAM) include solo la minima funzionalità minima, tutto il resto è compilato come moduli (caricabile in fase di runtime). Per farlo funzionare anche quando, ad esempio, i dispositivi o i filesystem richiesti per l'avvio sono moduli, initramfsviene caricato con il kernel (come suggerisce il nome, questa è un'area RAM con un semplice filesystem, montato all'avvio). Questo filesystem temporaneo è montato /e contiene programmi di avvio e i moduli richiesti. Una volta terminato l'avvio initramfs, Linux esegue a pivot_root(8), montando il vero /e lanciando il initramfscontenuto.

Il punto di questa complessità è che, ad esempio, una distribuzione può compilare un kernel (kernel minimo e set completo di moduli) e, al momento dell'installazione del kernel, creare un initramfshardware su misura per l'hardware e l'installazione della macchina target. Tutto ciò è necessario a causa della grande varietà di dispositivi e configurazioni di "Personal Computer".


Non lo fa pivot_root.
Mikeserv,
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.