2012-07-13 11 views
9

Estoy desarrollando módulos kernel en este momento, y los tiempos de construcción están empezando a entrar en mi piel. Como efecto secundario, estoy tomando demasiados descansos de "café" durante las compilaciones.Tratando de encontrar todos los módulos del kernel necesarios para mi máquina usando la secuencia de comandos de shell

Así que estaba buscando una manera de construir solo las cosas que necesito para mi plataforma. Los capítulos 7 y 8 de "linux kernel in a nutshell" ofrecían un buen detalle de cómo hacerlo a mano. Es una buena lectura: http://www.kroah.com/lkn/

Pero a pesar de que entiendo las cosas, esto sigue siendo un montón de ajustes para que funcione.

2.6.32 y kernels posteriores agregaron un nuevo objetivo make localmodconfig. que escanea a través de lsmod y cambia el archivo .config de manera apropiada. Así que pensé que encontré mi "automatización". Pero este script perl también tiene un problema.

Este hilo se describen los problemas: https://bbs.archlinux.org/viewtopic.php?pid=845113

Hubo también una propuesta de solución que aparentemente trabajaba para otros, es para ejecutar el script directamente en lugar de utilizar el objetivo del maquillaje.

Aunque para mí, make localmodconfig no funciona en absoluto. su por lo siguiente:

make clean 
make mrproper 
cp /boo/config-'uname -r' .config 
make localmodconfig 

y se detiene con

vboxguest config not found!! 
nf_defrag_ipv6 config not found!! 
vboxsf config not found!! 
vboxvideo config not found!! 

La cosa es que mi entorno de desarrollo del núcleo está dentro de VirtualBox. Estos módulos de vbox se instalaron cuando elegí instalar "la adición de invitado de virtualbox".

Y el módulo netfilter podría ser un módulo específico de Distribución (Muchos módulos de filtro de red no son parte del kernel principal, así que no me sorprende), que no está incluido en el núcleo principal.

Ahora la solución alternativa es obviamente descargar este módulo y volver a intentarlo. Pero estoy pensando si hay parche para el streamline_config.pl que permitirá al usuario excluir ciertos módulos si lo desea. El problema es que tengo cero conocimiento sobre perl y me gusta de esa manera.

Así que mis problemas en pocas palabras

  1. parches streamline_config.pl por lo que puede dar una lista de nombre de módulo como argumento que se excluirán del proceso el archivo de configuración.

    El script se encuentra en kernel.org

  2. EDIT: Se ha eliminado la materia sobre script de perl no se está ejecutando. Como señaló Mugen Kenichi (¿Qué tan tonto puedo ser?). Pero aún así, haga que localmodconfig no funcione porque no tiene ningún código de módulos en el árbol de fuentes. parche streamline_config.pl requisito todavía válido.

+2

no se puede ejecutar un script Perl con 'sh'. Prueba 'perl' y no obtendrás esos errores' my: command not found' y los errores perl o advertencias en su lugar. –

+0

Parece que soy el tipo más estúpido del mundo. ¿Cómo podría hacerlo :) – Aftnix

+0

¿Realmente el script falla? Desde el código, parece que solo imprime errores, pero no falla si el código de un módulo no está en el árbol. Ver [línea 375] (http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=blob;f=scripts/kconfig/streamline_config.pl;h=bccf07ddd0b67a0e2f761fd5721f274a49bf9bbb ; hb = HEAD # l375) –

Respuesta

8

Cualquier otra persona tratando de construir una imagen del núcleo mínimo también en busca de reducir el tiempo de construcción, debe hacer lo siguiente:

1) una copia de distribución de configuración del núcleo en su árbol de fuentes.Se puede hacer con cualquier orden dada a continuación:

$zcat /proc/config.gz > .config 

o

$cp /boot/config-'uname -r' .config 

2) Uso localmodconfig objetivo.

$make localmodconfig 

Utilizará lsmod para encontrar qué módulos se cargan en este momento. Luego buscará en .config de distribución para habilitarlos y deshabilitar otros.

Es importante saber que no siempre funciona sin problemas. Por lo tanto, debe modificar aún más su configuración utilizando make menuconfig. Verá que algunos módulos todavía están marcados para ser construidos, lo que en realidad es innecesario para su sistema.

A veces, los módulos fuera de árbol pueden provocar que falle localmodconfig. Si ese es el caso, puede solucionar este problema de dos formas:

a) descargue los módulos de fuera de árbol y pruebe make localmodconfig nuevamente. b) Ejecutar el script Perl directamente:

$chmod +x script/kconfig/streamline_config.pl 
$perl script/kconfig/streamline_config.pl > .config 

3) Instalar ccache [1]. Mejorará dramáticamente tu tiempo de construcción. Guarda en caché los objetos. Por lo tanto, reducirá las compilaciones posteriores.

Su posible que ccache está incluido en el repositorio de la distribución de manera que se puede instalar a través apt-get o yum. En CentOS está disponible en el repositorio de EPEL. [2]

4) Dar tantos núcleos como sea posible para el trabajo de construcción

$make -j8 CC="ccache gcc" 

Mis resultados son:

real 3m10.871s 
user 4m36.949s 
sys 1m52.656s 

[1] http://ccache.samba.org/ [2] http://fedoraproject.org/wiki/EPEL

+1

me acaba de ahorrar horas de pasar por la configuración (con mi hijo interfiriendo con mi tipeo ☺). Con su consejo, pude cambiar la compilación en todos los módulos activos con un simple script sed. ¡Gracias! 'Cp .config .config- viejo; make localmodconfig; para i en $ (grep = m .config | xargs); do sed "s/$ i/$ (echo $ i | sed s/= m/= y /) /" -i .config- viejo; cp .config-old .config; done' –

+1

Es bueno saber que esto te ayudó. – Aftnix

+0

no es el script streamline_config.pl en 'scripts' no 'script'? –

Cuestiones relacionadas