Comment réduire la taille de l'initrd lors de la compilation de votre noyau?

13

Lorsque je compile mon propre noyau, je fais essentiellement ce qui suit:

  1. Je télécharge les sources depuis www.kernel.org et les décompresse.

  2. Je copie mon précédent .configaux sources et fais un make menuconfigpour surveiller les nouvelles options et modifier la configuration selon la nouvelle politique du noyau.

  3. Ensuite, je le compile: make -j 4

  4. Enfin, je l' installe: su -c 'make modules_install && make install'.

  5. Après quelques tests, je supprime l'ancien noyau (de /bootet /lib/modules) et je tourne complètement avec le nouveau (cette dernière étape m'a sauvé la vie plusieurs fois! C'est un pro-tip !).

Le problème est que j'obtiens toujours un /boot/initrd.img-4.x.xqui est énorme par rapport à ceux de ma distribution. Voici le contenu de mon /boot/répertoire actuel à titre d'exemple:

# 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

Comme vous l'avez peut-être remarqué, la taille de mes initrd.imgfichiers est environ 10 fois supérieure à celle de ma distribution.

Alors, est-ce que je fais quelque chose de mal lors de la compilation de mon noyau? Et, comment puis-je réduire la taille de mon initrd.img?

perror
la source
wiki.gentoo.org/wiki/… et voyez ce qui le rend si énorme. Il peut s'agir de tonnes de modules du noyau ou de bibliothèques ... ou de tout autre chose. Si vous ne regardez pas le contenu de l'archive, ce n'est qu'une conjecture.
frostschutz

Réponses:

19

En effet, tous les modules du noyau ne sont pas supprimés. Vous devez le dépouiller pour réduire sa taille.

Utilisez cette commande:

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

Cela réduira considérablement la taille. Après avoir exécuté la commande ci-dessus, vous pouvez continuer à créer initramfs / initrd

SHW
la source
Wow, je n'aurais jamais pensé que le décapage des modules diviserait la taille de l' initrdimage par 10 ... Merci beaucoup, cela a bien fonctionné!
perror
Le devrait être un espace entre {}et +.
phk
15

J'ai fait des recherches supplémentaires sur le problème pour savoir quel est le meilleur moyen de supprimer les modules et voici le processus complet que j'ai trouvé (SHW a quand même apporté la réponse mais le processus que j'ai trouvé est en quelque sorte plus standardisé):

  1. Téléchargez www.kernel.orget décompressez les sources .

  2. Copiez votre précédent .configvers les sources et faites un make menuconfigpour surveiller les nouvelles options et modifiez la configuration en fonction de la nouvelle politique du noyau.

  3. Ensuite, compilez-le:

    $> make -j 4
    
  4. Enfin, installez-le:

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
  5. Après quelques tests, supprimez l'ancien noyau des répertoires /bootet /lib/modules.

Le INSTALL_MOD_STRIPquand est défini pour 1ajouter un strip --strip-debuglors de l'installation du module, ce qui suffit pour réduire considérablement la taille.

Voir: INSTALL_MOD_STRIP dans Documentation/kbuild/kbuild.txt.

perror
la source
7

Vous pouvez également modifier la configuration de votre initramfs.conf

Trouvez le fichier sur /etc/initramfs-tools/initramfs.conf

Il existe un paramètre qui indique que MODULES=mostcela inclut la plupart des modules de votre image initrd.

Le changer en MODULES=depceci fait que le générateur initramfs devine quels modules inclure.

Consultez la page de manuel pour initramfs.conf ici .

REMARQUE 1: Après avoir effectué les étapes ci-dessus, la taille de mon image initramfs est passée de 282 Mo à 99 Mo. (c'est toujours assez grand mais c'est une amélioration significative)

REMARQUE 2: j'ai également essayé de supprimer les modules du noyau à /lib/modules/<kernel version>. Les modules fournis par les mises à jour du système d'exploitation sont supprimés (taille = 211 Mo) et donc l'image intiramfs correspondante est d'environ 15 Mo. Après avoir supprimé les modules du noyau vanilla que j'ai compilé moi-même, la taille du dossier était de 185 Mo et l'image intramfs était de 16 Mo. Ainsi, après toutes les optimisations, la taille est passée de 282 Mo à 16 Mo !! Pour le décapage, utilisez ce code

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

Dans le code ci-dessus, remplacez <kernel_release>par la version du noyau dont vous souhaitez supprimer les modules.

Pour plus de discussion, consultez ce lien .

Le code ci-dessus doit être exécuté en tant que sudoousu

sohom154
la source