Libertonia
Portada · Todo · Software Libre · Desarrolladores · Comunidad · Internet · Tecnología · Meta · Diarios
Guía de compilación del núcleo Linux para torpes ;-)

Documentación
Por Quique
departamento querer-es-poder , Sección Comunidad
Puesto a las Tue Jan 7th, 2003 at 05:52:59 PM CET
A partir de un documento que escribí hace un par de años, he escrito un mini-tutorial que explica como compilar el núcleo Linux paso a paso. Aunque no se explica la configuración del núcleo (que es demasiado extensa como para tratarla en un mini-manual como éste), creo que puede ser útil para usuarios noveles, porque se va repasando el proceso instrucción por instrucción. Por supuesto, se admiten todo tipo de correcciones y sugerencias.

 


Ah, el documento se licencia bajo la GNU FDL :-)
< Sobre Libertonia y Barrapunto (11 comments) | La libertad de las imágenes (9 comments) >
Enlaces Relacionados
· como compilar el núcleo Linux
· More on Documentación
· Also by Quique

Menu
· crear cuenta
· FAQ
· búsqueda
· Fuentes de Noticias

Login
Nueva cuenta
Usuario:
Contraseña:

Ver: Modo: Orden:
Guía de compilación del núcleo Linux para torpes ;-) | 20 comentarios (11 temáticos, 9 editoriales, 0 ocultos)
¿Pero qué #$%& es eso de "make dep"? (4.80 / 5) (#15)
por jorginius ("jorginius" en Google Mail) a las Wed Jan 8th, 2003 at 07:39:23 PM CET
(Información Usuario) http://www.rodriguezmoreno.com

Bueno, viendo que se está desatando una tormenta de comentarios editoriales respecto a cuando y a cuando no hace falta un "make dep" (que no son muy "editoriales", que digamos :-)) y que ya no tengo ganas de estudiar, explico un poco como va esto del Makefile del kernel y las dependencias.

Ojo Quique, que esto no es lo que yo entiendo "para novatos" y no es la contribución que te prometí ;-)

A ver, ¿qué ocurre ahora cuando hacemos "make dep"?:
  • Se recorren todos los archivos *.c de las fuentes del kernel, se buscan las directivas "#include" que contengan y se crea una lista de los archivos de cabecera.

    El conjunto de todas esas listas se guarda en el archivo .depend de cada subdirectorio, en un formato por el cual entiende make(1) que cada archivo .c depende de su lista de *.h. De esta manera si, por ejemplo, modificamos linux/config.h, make "sabrá" que tiene que recompilar init/main.c puesto que depende de aquel.

    Podeis consultar el programa que interpreta individualmente cada archivo *.c, que se encuentra en scripts/mkdep.c.

  • Se procesan ahora los archivos de cabecera, de forma idéntica a la anterior, para averiguar las dependencias entre ellos. Así se establece que linux/config.h depende de linux/autoconf.h, por ejemplo. La lista resultante de todas estas dependencias se guarda en .hdepend.

    Como vemos, hasta aquí no hay nada que dependa de la configuración, $(TOPDIR)/.config, elegida por el usuario

    Por cierto: hablo de los *.[ch], las fuentes en ensamblador siguen un camino distinto, y más chapucilla, en esto de las dependencias.

  • Ahora viene la parte sensible: si está definida la opción CONFIG_MODVERSION (que no es en absoluto necesaria para tener un kernel modular e incluso puede estar presente en un kernel monolítico), se crea el directorio $(TOPDIR)/include/linux/modules y un archivo $(TOPDIR)/include/linux/*.ver por cada elemento susceptible de ser modular (no por cada módulo seleccionado en la configuración) más un ksyms.ver, vía genksyms(8). Además, se crea/actualiza el archivo $(TOPDIR)/include/linux/modversions.h, a partir de la versión del kernel e incluyendo todos los archivos $(TOPDIR)/include/linux/modules/*.ver generados.

    Resalto que modversions.h no entra en las dependencias de los *.h "normales", no aparece en .hdepend.

    ¿Qué contiene los *.ver?: las etiquetas de versión que serán incluidas en la definición de cada símbolo exportado, por parte de todos los (posibles) módulos y por parte de lo que no es modular (ksyms.ver). Esas etiquetas únicamente dependen de la versión del kernel y no de la configuración del usuario.
Todos estos archivos (*.ver, .config, .depend, .hdepend) no desaparecen después de un clean. Para borrarlos hace falta un mrproper.

Llegado a este punto quizás os estéis preguntando que por qué nos dicen en la documentación que hay que hacer un "make dep" cada vez que se cambia la configuración estando definida CONFIG_MODVERSION, si, aún con esa opción, de la configuración no sacamos NADA para construir las dependencias (Excepto, claro, el propio CONFIG_MODVERSION)... Y es una buena pregunta: ¿alguien se anima y la responde? ;-)



La respuesta es sencilla: (3.66 / 3) (#17)
por iarenaza a las Wed Jan 8th, 2003 at 10:42:44 PM CET
(Información Usuario) http://www.escomposlinux.org/

solo hay un par de casos en los cuales puedes evitar hacer el make dep, y un monton de ellos en los cuales no.

Explicar todos los detalles tecnicos que tu has dado arriba para mencionar que en esos casos y sólo en esos nos podemos ahorrar algo de tiempo (teniendo en cuenta el tiempo total de compilacion), es mas rapido, directo y menos lioso para quien no conoce o no quiere conocer los detalles, decir que se haga siempre el famoso make dep y listo.

Saludos. Iñaki.

[ Padre ]


No tan sencilla :-) (5.00 / 2) (#18)
por jorginius ("jorginius" en Google Mail) a las Thu Jan 9th, 2003 at 12:16:46 AM CET
(Información Usuario) http://www.rodriguezmoreno.com

Explicar todos los detalles tecnicos que tu has dado arriba para mencionar que en esos casos y sólo en esos nos podemos ahorrar algo de tiempo (teniendo en cuenta el tiempo total de compilacion)

Tal y como lo expones, parece que consideras que hablo de "casos marginales". Realmente "esos casos" en los que no hace falta un "make dep" son prácticamente todos los casos posibles... Salvo uno:

La primera vez que vayamos a compilar de unas fuentes "pristinas", hay que construir las dependencias. A partir de ahí se pueden reutilizar sin problemas todas las veces que recompilemos las fuentes, por mucho que cambiemos la configuración.

Sin obviar que distribuciones como RedHat incluyen en sus fuentes del kernel las dependencias ya creadas, con lo cual instalando el rpm de kernel-sources incluso nos podemos ahorrar el primer "make dep".

Por otro lado, el tiempo que ahorramos evitando reconstruir las dependencias es significativo... Según se puede ver reflejado en el grandioso Kernel-Aaargh! de runlevel0 :-). ¿Que no parece gran cosa comparado con lo que tarda en compilar el kernel?. Depende:

Imagina que en tu máquina tarda 20 minutos en construir las dependencias y 2-3 horas en compilar el kernel (¿ya te lo imaginas? :-)).

Ahora configuras y compilas y, al terminar, te das cuenta de que tendrías que haber añadido soporte para algo más en forma de módulo o lo que sea (a mí lo que siempre se me queda en el tintero es el "Socket Filtering", sin el cual el DHCP no va %-}). ¿Cuanto tardas en activar la opción, y recompilar el kernel?: escasamente 5 minutos. ¿Cuanto tardarías en hacerlo si tuvieras que reconstruir las dependencias?: cinco veces más (20 minutos el "make dep", 5 minutos el make del kernel).

Visto así, sí parece que ahorra tiempo ¿no?.

... Y de cualquier forma, emplear esos 5/30 minutos (según hw) para hacer algo productivo me parece más eficiente que dedicarlos a darle trote al disco y a la cpu haciendo tareas redundantes.

Es mas rapido, directo y menos lioso para quien no conoce o no quiere conocer los detalles, decir que se haga siempre el famoso make dep y listo.

También le estamos contando algo incorrecto al que "no conoce o no quiere conocer los detalles". ¿Eso vale cómo argumento en mi defensa?.

Es más, no sé si tú te incluyes en el grupo de personas que "no quiere conocer los detalles". Creo que no es el caso, pero aún así dijiste que:

[Las dependencias si hay que reconstruirlas] cada vez, ya que al elegir opciones nuevas, quitar viejas, etc. el codigo a compilar y las dependencias entre los diferentes modulos cambian.

Runlevel0 comentó algo parecido:

['dep'] en kernels monolíticos sólo se necesitaría correr una vez, pero claro, hoy en día ¿Quién quiere kernels monolíticos?.

Ambas afirmaciones parecen erroneas, luego lo de "hacer el make dep siempre" no se trata de "una muletilla" que ayuda al novato. Es un error extendido incluso entre la gente que sí se preocupa de los detalles, como nosotros tres, supongo :-).

Me concederas al menos que hay una errata muy extendida en la documentación al respecto. Parece que el contenido de kbuild/* ha quedado desfasado... Hasta que alguien demuestre lo contrario, por supuesto.

[ Padre ]


Creo que no me explico bien (3.00 / 2) (#19)
por iarenaza a las Fri Jan 10th, 2003 at 12:01:21 AM CET
(Información Usuario) http://www.escomposlinux.org/

La noticia hace referencia a un mini-tutorial sobre como compilar el kernel paso a paso. No es una obra completa sobre los entresijos de la compilación del kernel, kbuild1 y saber que es eso de MODVERSIONs.

Con esa premisa, y teniendo en cuenta el publico al que va dirijido, entrar en las consideraciones que tu haces (ojo, muy interesantes por otra parte para quien si quiera ahorrarse esos minutos[1] o segundos extra[2], además de ser formativo) me parece simplemente estar más allá de las necesidades del tutorial, de las expectativas de sus lectores y, probablemente, de su capacidad para asimilar y comprender esos detalles tan técnicos.

De ahí mi respuesta.

Saludos. Iñaki.

[1] Si, he compilado kernels en maquinas en las cuales las dependencias se llevaban su buenos 30-35 minutos y la compilacion del kernele sus dos buenas horas adicionales, asi que se a lo que te refieres :)

[2] Esta ya es para polemizar :) Si te fijas, el ahorro que tu propones sólo se produce en caso de tener que recompilar el kernel con alguna modificacion. En ese caso podemos tener dos posibles escenarios:
  • tu maquina es lo suficientemente rapida como para que no te importe poner cuidado al hacer make config y tener que recompilar una o mas veces. En este caso, como es tan rapida, el ahorro de tiempo de no hacer el make dep es mínimo.
  • tu maquina es tan lenta compilando que el evitarte el hacer make dep si solo has cambiado algo en el kernel porque se te ha olvidado la primera vez, merece la pena. En este caso, tengo la fundada sospecha que no llegas a hacer estas recompilaciones casi nunca, por la sencilla razon de que eres consciente de que cada vez que compilas el kernel (desde cero o por haber modificado solo una cosilla), le cuesta horrores (es mas una sensacion psicológica que una situación objetiva seguramente, pero al final es la que marca tus acciones). En ese caso pones buen cuidado de elegir todo lo que necesitas desde el principio, para tener que hacerlo una sola vez, con lo cual no te ahorras el make dep de turno :)
Por tanto podemos concluir que no es una errata en la documentación, simplemente es una simplificacion del caso general para describir el proceso mas habitual.

[ Padre ]


... O a lo mejor no me entiendes (3.00 / 2) (#20)
por jorginius ("jorginius" en Google Mail) a las Fri Jan 10th, 2003 at 01:56:55 AM CET
(Información Usuario) http://www.rodriguezmoreno.com

La noticia hace referencia a un mini-tutorial sobre como compilar el kernel paso a paso. No es una obra completa sobre los entresijos de la compilación del kernel, kbuild1 y saber que es eso de MODVERSIONs.

Con esa premisa, y teniendo en cuenta el publico al que va dirijido, entrar en las consideraciones que tu haces
[...] me parece simplemente estar más allá de las necesidades del tutorial

Entiendo que una descripción pomenorizada de lo que va haciendo cada target del Makefile del kernel no tiene sentido en un tutorial para novatos.

Yo no pondría en mini-cómo algo como eso. Pero sí quizás un:

"... Este paso sólo lo tienes que hacer una vez, al descomprimir las fuentes del kernel y después del primer 'make menuconfig'. A partir de ahora, si quieres hacer pruebas, añadir y quitar opciones o compilar otro kernel para otro ordenador menos potente con otro hardware, el 'make dep' te lo puedes saltar"

"... Recuerda que cuando haces un 'make mrproper' vuelves a tener las fuentes del kernel tal y como te las bajaste, así que antes de volver a compilar tendrás que hacer de nuevo un 'make menuconfig' y un 'make dep'"

Entonces, si lo que creo que podría encajar en el mini-cómo es eso, ¿por qué posteo el otro rollo técnico-infumable?: es que me sirve para argumentar lo que dije en este comentario editorial, que es el padre del hilo que trato de seguir en estos comentarios temáticos, de que las recetas mecánicas no me gustan mucho y las de compilar el kernel menos porque tradicionalmente no muestran "la forma correcta de hacer las cosas".

Además, después de decir yo "no hace falta hacer el 'make dep'" y tú responder "sí hace falta", creí que vendría bien mirarlo en detalle para salir de dudas.

Partimos de que la muletilla "make menuconfig && make dep && make clean && make bzImage && make modules && ..." se usa entera toda ella inconscientemente, sin cuestionarse si hay formas mejores de hacerlo o de si hace falta todo aquello... Porque a ver, que levante la mano el que no la use sin pensar cada vez que compile el kernel :-). Incluso runlevel0 lo llama "mantra" aquí, y por el nivel de difusión/aceptación de la fórmula mágica, parece un nombre de lo más apropiado.

Supongo que tú me dirás que si funciona y es lo que todo el mundo (je), para qué preocuparse... Hombre, pues no niego que funciona... Pero es que creo que no es sólo eso lo que se busca. A ver si explico lo que quiero decir:

¿Nunca has escuchado/leído algo como "las X del Linux me estaban fallando, así que formateé y reinstalé", y a lo mejor quien lo dijo estaba tan contento porque su (drástica) solución le funcionó?. No sé a ti pero a mí en esas ocasiones me resulta difícil permanecer callado sin decir "pues había una forma mejor de hacerlo, para la próxima vez prueba...".

Con esto del "make dep" me pasa algo parecido. Me parece tan "a cañonazos" y superfluo que tengo que decirlo ;-)

Ahora respondo la parte cotilla de tu comentario (atención lector: sino eres iarenaza te aconsejo que te lo saltes :-)).

[2] Esta ya es para polemizar :) Si te fijas, el ahorro que tu propones sólo se produce en caso de tener que recompilar el kernel con alguna modificacion. En ese caso podemos tener dos posibles escenarios:

Lo del "Socket Filtering" nos paso dos veces (el hombre es el único animal que tropieza dos veces en la misma piedra) pero te faltan por enumerar al menos dos escenarios, que me resultan mucho más conocidos :-).

En la universidad tenemos un montón de máquinas lentas SPARC (no sé si tienes experiencia con cacharros como esos, pero para que te hagas una idea, la compilación de un kernel en un SS 5 nos lleva unas seis horas y en una Classic directamente habría que dejarlas toda la noche), agrupadas por perfiles, según la tarea que desempeñan. Para cada perfil tenemos un kernel personalizado: en total creo que son cinco kernels distintos.

Como todas las máquinas son variantes de v8, podemos compilar el kernel para cada perfil simplemente compilando una vez, cambiando las opciones, haciendo de nuevo el 'make' y ahorrando un montón de tiempo sin compilar muchos archivos fuente y sin recalcular dependencias.

En realidad, se podría haber incluso ahorrado más tiempo ya que también tenemos unas cuantas Ultra más potentes sobre las que compilar... Pero hasta hace dos meses no sabíamos que se podían compilar kernels para v8 en las Ultra sin necesidad de un compilador cruzado (En las SPARC no es como en PC, que todos los micros se engloban en la misma familia: aquí tienes una rama del kernel para v9, de 64 bits, disjunta de la de v8, de 32). De todas formas, las Ultra tampoco son muy potentes, así que el tiempo que se ahorra compilando kernels sucesivos sin reconstruir las dependencias (y sin hacer el 'make clean', claro) sigue siendo considerable. Por lo menos, ya lo sabemos para cuando haya que actualizar todos los kernels.

Por cierto, ¿por qué esa manía inicial de recompilar el kernel en las SPARCS?, pues porque el kernel que viene con Debian para las SPARC32 es exclusivamente un 2.2.x, sin soporte entre otras cosas para ext3 (Y no me contéis que arrancando con el cd nosequé te instala un 2.4.x por que nó. En SPARC32, Woody no da opción de un 2.4.x).

Eso por un lado, y después tenemos el otro escenario, compuesto por yo mismo intentando depurar un 2.4.18 en una SS5 porque el khttpd no va en ellas (y en las Ultra y en los PC sí ???), por el método de "leer código, poner printk(), recompilar, reiniciar y probar a ver" (por si alguien siente curiosidad, el problema era que los hilos que atendían las peticiones del kernel se quedaban zombies nada más empezar a atender a la conexión entrante y no sólo era depurar, también había que añadir una funcionalidad nueva bastante chorra).

Si cada vez que hubo que poner comprobaciones de errores y recompilar para probar aquel engendro, hubieramos tenido que reconstruir las dependencias en esa máquina, todavía seguiríamos allí :-P.

[ Padre ]


 
Un par de cosillas (4.00 / 1) (#1)
por antonio a las Tue Jan 7th, 2003 at 12:12:49 PM CET
(Información Usuario)

El make dep && make clean && make bzImage se puede reducir a make dep clean bzImage.

Otra cosa, lo de hacer una bzImage y luego copiar el System.map y esas cosa a su sitio se puede hacer más fácil si haces un make dep clean install en vez de bzImage. Eso te deja ya todo copiado en su sitio y ejecuta lilo (claro está, habrás de tener un /etc/lilo.conf configurado para que busque el kernel donde lo deja el make install)



¿Con &&? (4.00 / 1) (#2)
por Envite a las Tue Jan 7th, 2003 at 12:24:56 PM CET
(Información Usuario)

Creo que es mejor hacer los pasos de make por separado, para tener claro el punto de fallo en caso de error.
Y o nunca hago make install, sino que cojo la imagen y la copio en /boot para luego modificar lilo.conf. Pero claro, cada maestrillo tiene su lebrillo.
No estoy de acuerdo con lo que dices, pero defenderé con mi vida tu derecho a decirlo.
Voltaire

[ Padre ]


Re: ¿Con &&? (2.50 / 2) (#10)
por runlevel0 (exterATvullferPUNTes) a las Tue Jan 7th, 2003 at 10:44:07 PM CET
(Información Usuario) http://perso.wanadoo.es/exter

'&&' es el AND lógico, si un comando falla el siguiente en la lista no se ejecuta y el error que devuelve es el del comando que falló.

Yo los agrupo cuando estoy seguro y los separo cuando no lo estoy.


-- S41002
[ Padre ]


 
Mi propia versión 'Makarruza' (3.75 / 4) (#12)
por runlevel0 (exterATvullferPUNTes) a las Tue Jan 7th, 2003 at 11:01:33 PM CET
(Información Usuario) http://perso.wanadoo.es/exter

Yo tengo algo parecido, aunque más extenso y en un tono 'algo subidillo' ;)
Hace tiempo que no lo actualizo y tiene algnos fallos de estructura, pero bueno... Se trata del

infame Kernel-Aaargh!

La última vez que lo miré me partí.
No lo tomeís muy en serio ;)

-- S41002


Sencillamente genial. (2.00 / 1) (#14)
por Lebowski a las Wed Jan 8th, 2003 at 10:33:50 AM CET
(Información Usuario) http://www.wernitz.net

Aunque tu COMO es algo informal, el tono es adecuado para gente novata ya que le ayudas a quitarle el miedo

Como todo en la vida, hay partes que tal vez debieran corregirse, pero eso es natural. En la Naturaleza lo llaman Evolución.

Lo más destacable son los pantallazos de la configuración en X --make xconfig-- ya que al menos indica qué es cada parte y al menos el aprendiz de mago sabe en dónde está. A día de hoy aún no me había encontrado una guía sobre el kernel con pantallazos. Ahí lo has bordado.

Sigo diciendo que lo mejor de todo es el tono informal con que lo cuentas como si estuvieras tomándote unas cervezas con el colega, pero que en lugar de hablar de fútbol o de tías, hablas de kernel y demás.

Mi más sinceras felicitaciones.
--- A cuidarse y a portarse mal, que es más divertido.
[ Padre ]


 
Sublime. Gracias. (2.00 / 1) (#16)
por Navegant a las Wed Jan 8th, 2003 at 08:34:10 PM CET
(Información Usuario)

Nunca me he encontrado con un documento tan "completo" (suficiente a todas luces) Y divertido. Lo he disfrutado, te lo aseguro ;-)

P.D. "Se lo recomiendo a mi mamá, mi papá, a la vecina del quinto,... y en especial al pelma de mi colega, para que no maree con la tarjeta de TV y se lo pase de muerte". ¡Ala! ;-)

[ Padre ]


 
Guía de compilación del núcleo Linux para torpes ;-) | 20 comentarios (11 temáticos, 9 editoriales, 0 ocultos)
Ver: Modo: Orden:

ecol Logo Powered by Scoop
Todas las Marcas Registradas y copyrights de esta página son propiedad de sus respectivos dueños.
Los comentarios son propiedad del que los escribe.
Los iconos de las noticias y el logotipo son propiedad de Javier Malonda.
El Resto © 2002 Escomposlinux.org y aledaños.

Puedes sindicar los contenidos de libertonia en formato RSS 1.0 y RDF 0.9. También se puede sindicar la cola de envíos pendientes de moderación.

El proyecto escomposlinux.org está dedicado a la memoria de tas

crear cuenta | faq | búsqueda