¿Cómo reducir el tamaño de initrd al compilar su núcleo?

13

Cuando compilo mi propio núcleo, básicamente lo que hago es lo siguiente:

  1. Descargo las fuentes de www.kernel.org y lo descomprimo.

  2. Copio mi anterior .configa las fuentes y hago un make menuconfigseguimiento para ver las nuevas opciones y modificar la configuración de acuerdo con la nueva política del núcleo.

  3. Entonces, lo compilo: make -j 4

  4. Por último, lo instalo: su -c 'make modules_install && make install'.

  5. Después de algunas pruebas, elimino el núcleo antiguo (de /booty /lib/modules) y ejecuto completamente el nuevo (¡este último paso me salvó la vida varias veces! ¡Es un consejo profesional !).

El problema es que siempre obtengo uno /boot/initrd.img-4.x.xque es enorme en comparación con los de mi distribución. Aquí el contenido de mi /boot/directorio actual como ejemplo:

# 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

Como habrás notado, el tamaño de mis initrd.imgarchivos es aproximadamente 10 veces mayor que el de mi distribución.

Entonces, ¿hago algo mal al compilar mi kernel? Y, ¿cómo puedo reducir el tamaño de mi initrd.img?

perror
fuente
wiki.gentoo.org/wiki/... y vea lo que lo hace tan grande. Podría ser toneladas de módulos del núcleo o bibliotecas ... o algo completamente diferente. Si no miras el contenido del archivo, es solo una conjetura.
frostschutz

Respuestas:

19

Esto se debe a que todos los módulos del núcleo no están despojados. Necesitas quitarlo para reducir su tamaño.

Usa este comando:

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

Esto reducirá drásticamente el tamaño. Después de ejecutar el comando anterior, puede proceder a crear initramfs / initrd

SHW
fuente
Wow, nunca hubiera pensado que quitar los módulos dividiría el tamaño de la initrdimagen entre 10 ... ¡Muchas gracias, funcionó bien!
Perror
El debe ser un espacio entre {}y +.
phk
15

Investigué un poco más sobre el problema para saber cuál es la mejor manera de quitar los módulos y aquí está el proceso completo que encontré (todavía SHW trajo la respuesta, pero el proceso que encontré está de alguna manera más estandarizado):

  1. Descargue las fuentes www.kernel.orgy descomprímalo.

  2. Copie su anterior .configa las fuentes y haga un make menuconfigseguimiento de las nuevas opciones y modifique la configuración de acuerdo con la nueva política del núcleo.

  3. Luego, compílalo:

    $> make -j 4
    
  4. Finalmente, instálalo:

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
  5. Después de algunas pruebas, elimine el núcleo antiguo /booty los /lib/modulesdirectorios.

El INSTALL_MOD_STRIPcuando se establece en 1añadir unstrip --strip-debug al instalar el módulo, que es suficiente para reducir el tamaño drásticamente.

Ver: INSTALL_MOD_STRIP en Documentation/kbuild/kbuild.txt.

perror
fuente
7

También puede cambiar la configuración de su initramfs.conf

Encuentra el archivo en /etc/initramfs-tools/initramfs.conf

Hay una configuración que dice que MODULES=mostesto incluye la mayoría de los módulos de su imagen initrd.

Cambiarlo a MODULES=depesto hace que el generador initramfs adivine qué módulos incluir.

Consulte la página de manual de initramfs.conf aquí .

NOTA 1: Después de realizar los pasos anteriores, el tamaño de la imagen de mi initramfs se redujo de 282 MB a 99 MB (todavía es lo suficientemente grande, pero es una mejora significativa)

NOTA 2: También intenté quitar los módulos del núcleo en /lib/modules/<kernel version>. Los módulos suministrados por las actualizaciones del sistema operativo se eliminan (tamaño = 211 MB) y, por lo tanto, la imagen intiramfs correspondiente es de alrededor de 15 MB. Después de quitar los módulos del núcleo de vainilla que compilé, el tamaño de la carpeta era de 185 MB y la imagen intramfs era de 16 MB. ¡Entonces, después de todas las optimizaciones, el tamaño bajó de 282 MB a 16 MB! Para pelar use este código

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

En el código anterior, reemplace <kernel_release>con la versión del núcleo de la que desea quitar los módulos.

Para más discusión vea este enlace .

El código anterior debe ejecutarse como sudoosu

sohom154
fuente