guardate che "compilato da solo" ed "initrd" sono due cose diverse, molto diverse.
Initrd, il cui supporto è presente nel kernel (nella serie 2.6 si chiama initramfs) serve per mettere a disposizione del kernel file e procedure d'inizializzazione necessarie in fase di pre-boot, prima che init abbia montato il filesystem root.
Questo può includere è vero il caricamento di moduli, come il caso classico dei moduli relativi al filesystem, operazione che è bypassabile compilando quei moduli staticamente, ma assolutamente non solo.
Un esempio classico è l'inizializzazione dei volumi LVM nel caso in cui la root sia un LVM a sua volta. Ci sono poi i driver userspace utilizzati da connector, come il recente aggiunto v86d per il supporto a VBE3, oppure fuse per il supporto a filesystem alternativi, etc etc.
..
....
.............
Non dimentichiamo la visualizzazione di uno splash grafico!!!! (non ho resistito :P . )
Per cui il discorso "compila statico e non ti serve l'initrd" mi sembra sia un po'... come dire... sbagliato, o quantomeno semplicistico. initramfs (formerly initrd) è una delle caratteristiche del kernel linux, come tale ha le sue potenzialità e se torvalds e soci hanno pensato di metterlo dentro, io CREDO che possa essere saggio non sottovalutarlo
Comunque, rispondendo al post, il comando per creare un initrd è "mkinitrd". L'initrd altro non è che un file compresso con all'interno uno pseudo-filesystem che viene caricato dal kernel subito dopo il bootstrap.
Su slackware, questo *file compresso* (da ora *immagine*) di default è collocato in /boot e si chiama, molto significativamente, initrd.gz
Il file viene costruito comprimendo una directory, di default /boot/initrd-tree, il cui contenuto diventerà lo pseudo-filesystem di cui sopra.
Puoi chiamare mkinitrd più volte con parametri diversi, ogni volta che lo chiami l'initrd-tree viene modificato per rispecchiare le nuove caratteristiche e viene creata la nuova immagine.
Se usi il comando mkinitrd da solo, il file immagine verrà ricreato con le modifiche apportate all'initrd-tree senza che l'initrd-tree venga modificato dal comando.
I parametri fondamentali sono:
- -c Azzera il vecchio initrd-tree e riparte con uno nuovo
- -f Specifica il filesystem usato da root (il nome riconosciuto da mount, quindi ext3, reiserfs, etc)
- -r Specifica la partizione di root (/dev/tuapartizione)
Quindi, ad esempio, per creare un nuovo initrd per un sistema che usa come filesystem ext3 ed ha come partizione root /dev/hda1
A questi parametri puoi aggiungere degli switch come:
- -L Abilita il supporto ad LVM. Purtroppo in questa versione di mkinitrd non esiste uno switch analogo per RAID, ma ho letto che sarà incluso da PAT nella nuova versione (al momento chi come me si è fatto un raid software con il kernel, deve modificarsi l'initrd-tree a manina).
- -C Abilita il supporto a cryptsetup per la partizione di root. Richiede che sia specificato anche -r (vedi sopra)
Quindi, ad esempio, per aggiungere il supporto ad LVM ad un initrd esistente, basta scrivere:
Se non ti vanno bene i nomi che mkinitrd usa di default o se vuoi gestire più initrd-tree contemporaneamente (ad esempio uno per ogni kernel che usi, se ne usi più d'uno), puoi usare i parametri:
- -s Permette di specificare un source-tree alternativo a /boot/initrd-tree
- -o Permette di specificare un immagine alternativa a /boot/initrd.gz
Quindi ad esempio per creare un immagine specifica per il kernel 2.6.21.5-smp, basta scrivere:
Codice: Seleziona tutto
mkinitrd -c -s /boot/initrd-tree-2.6.21.5-smp -o /boot/initrd.gz-2.6.21.5-smp
unico neo: se specifichi nomi diversi secondo questo schema, dovrai SEMPRE specificarli entrambi ogni volta che vuoi manipolare quell'immagine con mkinitrd (secondo me è un bug che PAT risolverà).
Infine, arriviamo al discorso moduli.
Se dentro la tua initrd vuoi inserire dei moduli del kernel che devono essere caricati insieme all'initrd, ad esempio i moduli necessari al filesystem od al chipset, puoi usare i seguenti parametri:
- -k La versione del kernel da usare
- -m L'elenco dei moduli da caricare, separati da virgola
Quindi, rimanendo sull'esempio dell'initrd 2.6.21.5-smp, supponendo di volerci caricare dentro reiserfs.ko per il supporto a reiserfs, scriveremo:
Codice: Seleziona tutto
mkinitrd -s /boot/initrd-tree-2.6.21.5-smp -o /boot/initrd.gz-2.6.21.5-smp -k 2.6.21.5 -m reiserfs
come avrai notato ho omesso il parametro -c perchè l'avevamo creato precedentemente. Per esser sicuro della numerazione del kernel, dai un occhiata alla directory /lib/modules.
Ora dovresti conoscere i parametri e l'utilizzo di mkinitrd sufficientemente per usarlo da solo
Un ultima nota: dopo aver creato/aggiornato un immagine initrd, devi aggiornare anche lilo. E' sufficiente scrivere "lilo" senza parametri, come credo saprai.
Ovviamente prima devi aver modificato /etc/lilo.conf specificando l'initrd da usare per ogni voce del menù. Ad esempio:
Codice: Seleziona tutto
# Linux bootable partition config begins
image = /boot/vmlinuz-generic-2.6.21.5-smp
initrd = /boot/initrd.gz-2.6.21.5-smp
root = /dev/hda2
label = Linux26215
read-only
# Linux bootable partition config ends
spero d'esserti stato d'aiuto
