Come ridurre la dimensione di initrd durante la compilazione del kernel?


13

Quando compilo il mio kernel, sostanzialmente quello che faccio è il seguente:

  1. Scarica le fonti da www.kernel.org e le decomprimo.

  2. Copio il mio precedente .configsui sorgenti e faccio un make menuconfigcontrollo delle nuove opzioni e modifico la configurazione in base alla nuova politica del kernel.

  3. Quindi, lo compilo: make -j 4

  4. Infine, lo installo: su -c 'make modules_install && make install'.

  5. Dopo alcuni test, rimuovo il vecchio kernel (da /boote /lib/modules) e corro completamente con quello nuovo (quest'ultimo passaggio mi ha salvato la vita più volte! È un suggerimento professionale !).

Il problema è che ottengo sempre un valore /boot/initrd.img-4.x.xenorme rispetto a quelli della mia distribuzione. Ecco il contenuto della mia /boot/directory attuale come esempio:

# ls -alFh
total 243M
drwxr-xr-x  5 root root 4.0K Mar 16 21:26 ./
drwxr-xr-x 25 root root 4.0K Feb 25 09:28 ../
-rw-r--r--  1 root root 2.9M Mar  9 07:39 System.map-4.4.0-1-amd64
-rw-r--r--  1 root root 3.1M Mar 11 22:30 System.map-4.4.5
-rw-r--r--  1 root root 3.2M Mar 16 21:26 System.map-4.5.0
-rw-r--r--  1 root root 170K Mar  9 07:39 config-4.4.0-1-amd64
-rw-r--r--  1 root root 124K Mar 11 22:30 config-4.4.5
-rw-r--r--  1 root root 126K Mar 16 21:26 config-4.5.0
drwxr-xr-x  5 root root  512 Jan  1  1970 efi/
drwxr-xr-x  5 root root 4.0K Mar 16 21:27 grub/
-rw-r--r--  1 root root  19M Mar 10 22:01 initrd.img-4.4.0-1-amd64
-rw-r--r--  1 root root 101M Mar 12 13:59 initrd.img-4.4.5
-rw-r--r--  1 root root 103M Mar 16 21:26 initrd.img-4.5.0
drwx------  2 root root  16K Apr  8  2014 lost+found/
-rw-r--r--  1 root root 3.5M Mar  9 07:30 vmlinuz-4.4.0-1-amd64
-rw-r--r--  1 root root 4.1M Mar 11 22:30 vmlinuz-4.4.5
-rw-r--r--  1 root root 4.1M Mar 16 21:26 vmlinuz-4.5.0

Come avrai notato, le dimensioni dei miei initrd.imgfile sono circa 10 volte più grandi di quelle della mia distribuzione.

Quindi, faccio qualcosa di sbagliato durante la compilazione del mio kernel? E come posso ridurre le dimensioni del mio initrd.img?


wiki.gentoo.org/wiki/… e scopri cosa lo rende così enorme. Potrebbe essere tonnellate di moduli del kernel o librerie ... o qualcos'altro del tutto. Se non guardi il contenuto dell'archivio è solo una congettura.
frostschutz,

Risposte:


19

Questo perché tutti i moduli del kernel non sono eliminati. Devi tagliarlo a dimensioni ridotte.

Usa questo comando:

SHW@SHW:/tmp# cd /lib/modules/<new_kernel>
SHW@SHW:/tmp# find . -name *.ko -exec strip --strip-unneeded {} +

Ciò ridurrà drasticamente le dimensioni. Dopo aver eseguito il comando precedente, è possibile procedere alla creazione di initramfs / initrd


Caspita, non avrei mai pensato che la rimozione dei moduli avrebbe diviso la dimensione initrddell'immagine per 10 ... Grazie mille, ha funzionato bene!
Perror

Dovrebbe essere uno spazio tra {}e +.
phk,

15

Ho fatto qualche ricerca in più sul problema per sapere qual è il modo migliore per rimuovere i moduli ed ecco il processo completo che ho trovato (ancora SHW ha portato la risposta ma il processo che ho trovato è in qualche modo più standardizzato):

  1. Scarica le fonti da www.kernel.orge decomprimilo.

  2. Copia il tuo precedente .confignei sorgenti e fai un make menuconfigcontrollo delle nuove opzioni e modifica la configurazione in base alla nuova politica del kernel.

  3. Quindi, compilarlo:

    $> make -j 4
    
  4. Infine, installalo:

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
  5. Dopo alcuni test, rimuovere il vecchio kernel /boote le /lib/modulesdirectory.

Il INSTALL_MOD_STRIPquando impostato per 1aggiungere una strip --strip-debugdurante l'installazione del modulo, che è sufficiente a ridurre drasticamente le dimensioni.

Vedi: INSTALL_MOD_STRIP in Documentation/kbuild/kbuild.txt.


7

Puoi anche cambiare la configurazione del tuo initramfs.conf

Trova il file su /etc/initramfs-tools/initramfs.conf

C'è un'impostazione che dice che MODULES=mostinclude la maggior parte dei moduli della tua immagine initrd.

Modificandolo in MODULES=depquesto modo il generatore di initramfs indovina quali moduli includere.

Dai un'occhiata alla manpage di initramfs.conf qui .

NOTA 1: dopo aver eseguito i passaggi precedenti, la dimensione dell'immagine initramfs è stata ridotta da 282 MB a 99 MB. (È ancora abbastanza grande ma è un miglioramento significativo)

NOTA 2: Ho anche provato a rimuovere i moduli del kernel su /lib/modules/<kernel version>. I moduli forniti dagli aggiornamenti del sistema operativo sono eliminati (dimensione = 211 MB) e quindi l'immagine intiramfs corrispondente è di circa 15 MB. Dopo aver rimosso i moduli del kernel vanilla che mi sono compilato, la dimensione della cartella era 185 MB e l'immagine intramfs era 16 MB. Quindi, dopo tutte le ottimizzazioni, la dimensione è scesa da 282 MB a 16 MB !! Per lo stripping usa questo codice

find /lib/modules/<kernel_release>/ -iname "*.ko" -exec strip --strip-unneeded {} \;

Nel codice precedente sostituire <kernel_release>con la versione del kernel da cui si desidera rimuovere i moduli.

Per ulteriori discussioni guarda questo link .

Il codice sopra deve essere eseguito come sudoosu

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.