Como reduzir o tamanho do initrd ao compilar seu kernel?

9

Quando eu compilo meu próprio kernel, basicamente o que eu faço é o seguinte:

  1. Eu faço o download das fontes do site www.kernel.org e descompacte-o.

  2. Eu copio meu .config anterior para as fontes e faço um make menuconfig para observar as novas opções e modificar a configuração de acordo com a nova política do kernel.

  3. Então, eu compilo: make -j 4

  4. Por fim, eu o instalo: su -c 'make modules_install && make install' .

  5. Após alguns testes, eu removi o kernel antigo (de /boot e /lib/modules ) e corri completamente com o novo (este último passo salvou minha vida várias vezes! É um pro- dica !).

O problema é que sempre recebo um /boot/initrd.img-4.x.x que é enorme comparado aos da minha distribuição. Aqui o conteúdo do meu diretório /boot/ atual como um exemplo:

# 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 você deve ter notado, o tamanho dos meus arquivos initrd.img é cerca de 10 vezes maior do que os da minha distribuição.

Então, eu faço algo errado ao compilar meu kernel? E como posso reduzir o tamanho do meu initrd.img ?

    
por perror 17.03.2016 / 11:04

3 respostas

15

Isso porque todos os módulos do kernel não são removidos. Você precisa despir para diminuir o tamanho.

Use este comando:

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

Isso reduzirá drasticamente o tamanho. Depois de executar o comando acima, você pode continuar a criar o initramfs / initrd

    
por 17.03.2016 / 11:16
12

Eu fiz uma pesquisa extra sobre o problema para saber qual é a melhor maneira de obter os módulos removidos e aqui está o processo completo que encontrei (ainda assim o SHW trouxe a resposta, mas o processo que encontrei é de alguma forma mais padronizado):

  1. Faça o download das fontes em www.kernel.org e descompacte-as.

  2. Copie seu .config anterior para as fontes e faça um make menuconfig para observar as novas opções e modificar a configuração de acordo com a nova política do kernel.

  3. Em seguida, compile:

    $> make -j 4
    
  4. Por fim, instale-o:

    $> su -c 'make INSTALL_MOD_STRIP=1 modules_install && make install'
    
  5. Após alguns testes, remova o kernel antigo dos diretórios /boot e /lib/modules .

O INSTALL_MOD_STRIP quando definido como 1 adiciona strip --strip-debug ao instalar o módulo, o que é suficiente para reduzir drasticamente o tamanho.

Veja: INSTALL_MOD_STRIP em Documentation/kbuild/kbuild.txt .

    
por 17.03.2016 / 12:18
3

Você também pode alterar a configuração do seu initramfs.conf

Encontre o arquivo em /etc/initramfs-tools/initramfs.conf

Existe uma configuração que diz que MODULES=most inclui a maioria dos módulos da sua imagem initrd.

Altere para MODULES=dep , o que faz com que o gerador initramfs adivinhe quais módulos incluir.

Confira a manpage do initramfs.conf aqui .

OBSERVAÇÃO 1: Após executar as etapas acima, o tamanho da minha imagem initramfs reduziu de 282 MB para 99 MB (isso ainda é grande o suficiente, mas é uma melhoria significativa)

NOTA 2: Eu também tentei remover os módulos do kernel em /lib/modules/<kernel version> . Os módulos fornecidos pelas atualizações do sistema operacional são removidos (tamanho = 211 MB) e, portanto, a imagem intiramfs correspondente é de cerca de 15 MB. Depois de remover os módulos do kernel vanilla que eu mesmo compilei, o tamanho da pasta era de 185 MB e a imagem do intramfs era de 16 MB. Então, depois de todas as otimizações, o tamanho caiu de 282 MB para 16 MB !! Para decapagem use este código

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

No código acima, substitua <kernel_release> pela versão do kernel da qual você deseja remover os módulos.

Para ver mais discussões, consulte link .

O código acima deve ser executado como sudo ou su

    
por 17.03.2016 / 12:13