Construção manual do kernel do Linux: o binário resultante é 10 vezes maior que os binários pré-compilados

6

Estou usando o Linux Mint 13 MATE 32bit, estou tentando construir o kernel (principalmente por experiência e por diversão).

Por enquanto, eu gosto de compilá-lo com a mesma configuração que o kernel pré-compilado, então primeiro eu instalei o kernel pré-compilado 3.16.0-031600rc6 de kernel.ubuntu.com , inicializou com sucesso.

Então baixei o kernel 3.16.rc6 do kernel.org , descompactei, configurei para usar a configuração do kernel pré-compilado existente :

$ make oldconfig

Ele não me perguntou nada, então, o kernel pré-compilado contém todas as informações necessárias. Então eu construí (demorou cerca de 6 horas):

$ make

e, em seguida, instalado:

$ sudo make modules_install install

Então eu iniciei no meu kernel compilado manualmente, e funciona, mas o processo de inicialização é um pouco mais lento. Mas então descobri que todos os binários ( /boot/initrd.img-3.16.0-rc6 e todos os *.ko modules em /lib/modules/3.16.0-rc6/kernel são cerca de 10 vezes maiores que as versões pré-compiladas! Digamos, initrd.img-3.16.0-rc6 é 160 658 665 bytes, mas precompiled initrd.img-3.16.0-031600rc6-generic é 16 819 611 bytes. Cada módulo *.ko é similarmente maior.

Por que isso? Não especifiquei nenhuma opção especial para compilação (digitei exatamente os mesmos comandos que mencionei acima). Como construir "corretamente"?

    
por Dmitry Frank 28.07.2014 / 07:49

2 respostas

4

Apesar de que file diz, afinal de contas, é um erro depurar símbolos. Um tópico sobre isso no LKML me levou a tentar:

make INSTALL_MOD_STRIP=1 modules_install

E baixo e eis que uma comparação de dentro do diretório /lib/modules/x.x.x ; antes:

> ls -hs kernel/crypto/anubis.ko 
112K kernel/crypto/anubis.ko

E depois:

> ls -hs kernel/crypto/anubis.ko 
16K kernel/crypto/anubis.ko

Mais do que isso, o tamanho total do diretório (usando o mesmo .config ) conforme relatado por du -h passou de 185 MB para 13 MB.

Tenha em mente que além do uso de espaço em disco, isso não é tão significativo quanto parece. Os símbolos de depuração não são carregados durante o tempo de execução normal, portanto, o tamanho real de cada módulo na memória é provavelmente idêntico, independentemente do tamanho do arquivo .ko . Eu acho que a única diferença significativa que fará será no tamanho do arquivo initramfs , e a única diferença que fará será no tempo necessário para descompactar o fs. Ou seja, se você usar um initramfs descompactado , não importará.

strip --strip-all também funciona e file informa-os corretamente como stripped de qualquer forma. Por que diz que not stripped para a distro continua sendo um mistério.

    
por 28.07.2014 / 17:31
0

Após seu make oldconfig , faça um make vmlinuz . Acho que você verá que o kernel pré-compilado é um "bzImage executável", o que significa que ele é compactado no disco. Se você observar as mensagens de inicialização de perto, verá que ele está descompactando o kernel muito cedo no processo.

    
por 28.07.2014 / 15:32