# [kernel] Duda con archivo System.map [Solucionado]

## Mcklaren

Buenas a tod@s y feliz año nuevo antes de nada. Bien este post es para intentar de solucionar una duda que tengo que este archivo, ya que cada vez que miro un manual de gentoo de como instalar kernel o actualizar en algunos ponen que copie el archivo System.map a /boot, otros no dicen nada, otros ponen que lo llame con la version del kernel, por ejemplo, System.map-2.6.23, entonces la verdad que tengo dudas y que no veo solucion por ninguna parte. Buscando en el foro he encontrado este post: https://forums.gentoo.org/viewtopic-t-335604-highlight-system+map.html en el cual no me aclaro mucho. Porque otra cosa que no entiendo es si el sistema necesita el archivo System.map en /boot si al copiarlo lo llamo System.map-2.6.23 por ejemplo entonces cambia de nombre y estaría en el mismo problema que sino lo pongo ¿no?, es decir, si lo pongo con otro nombre teoricamente el System.map no existe. Bueno la verdad que no tengo ni idea de esto y es bastante confuso ya que en el manual oficial de gentoo no dicen nada de copiar el System.map a /boot. Asi que nada mas espero que alguien me ilumine con alguna solucion clara. Gracias y saludos.Last edited by Mcklaren on Wed Jan 09, 2008 7:29 am; edited 3 times in total

----------

## Stolz

Jamás he tenido que copiar el archivo System.map a /boot. No lo uso para nada y no hay rastro de él en mi partición /boot. Por tanto se puede decir que el sistema no necesita el archivo System.map.

Por lo que me suena haber leído  solo lo necesitas si tu ordenador está asignando mal el orden de las unidades. Yo me olvidaría de él salvo que experimentes problemas con el nombrado de las unidades o salvo que el propio sistema te diga  que lo necesita con un mensaje de error. 

Saludozzzzzz

----------

## Mcklaren

Ok, pues entonces creo que sudo rm -rf /boot/Syst[TAB] hará un buen trabajo  :Wink: , muchas gracias Stolz por tu respuesta.

----------

## Stolz

Ojo que los usuarios de Genkernel mencionan a veces el system.map. No tengo ni idea de Genkernel porque nunca lo he usado pero si lo usas, antes de borrar el archivo infórmate si genkernel lo usa, o al menos,  haz una copia.

Saludozzzzzzz

----------

## i92guboj

System.map es una tabla de símbolos y direcciones.

En programación, un símbolo es un nombre. Los nombres identifican a funciones y variables. El tema es que el kernel no se siente cómodo nombrando a algo que se llame "initial_code", por ejemplo. El kernel identifica las variables y funciones por su dirección en memoria, es decir, mediante un número.

Nosotros podemos referencias las cosas por un nombre más o menos inteligible al programar, y la máquina y el kernel están contentos con sus numeritos. System.map es precisamente una tabla con todos los símbolos del kernel y su dirección asociada. Sin embargo, dicha tabla no siempre es correcta, porque es estática, y puede no estár en sincronía con el kernel que estamos usando. Sin embargo hay otra que siempre lo está, y es /proc/kallsyms. Como todo lo que hay en /proc, kallsyms es generada en tiempo de arranque, y representa en forma de sistema de ficheros una serie de estructuras internas del kernel (/proc no existe realmente en disco ni nada que se le parezca).

Estas tablas son útiles más que nada cuando tenemos que depurar un volcado del kernel.

Cuando nos llega un kernel oops se nos proporciona un volcado de los registros de la cpu. El registro de dirección es ip (eip en arquitecturas no paleolíticas), por tanto, teniendo la dirección de eip y nuestro kallsyms, podemos transformar dicho número en un nombre de símbolo. La dirección de por sí no sirve para nada en un reporte del kernel (siempre hay que adjuntar el kallsyms o un system.map que esté sincronizado con nuesttro kernel actual). De esta forma, sabemos en qué función ha tenido lugar el fallo, y es mucho más fácil encontrarlo.

También hay aplicaciones que pueden usar system.map para algunas cosas interesantes, por ejemplo, creo que klogd era capaz de buscar símbolos automáticamente al producirse un oops y en los logs pone el símbolo en lugar de la dirección de eip (que es totalmente inútil). Seguramente habrá más programas que lo usen, pero como Stolz dice más arriba, no es algo vital ni por lo que el usuario medio se deba preocupar (a no ser que suelas mandar reportes de bugs del kernel).

EDIT: Se me olvidó comentar: el registro de dirección, eip, contiene una dirección de memoria. Pero lo importante es la dirección contenida en eip siempre apunta a la siguiente instrucción, por eso es tan importante a la hora de saber donde ha fallado un programa (incluído el kernel, que a fin de cuentas es un programa más).

----------

## ackward

He tenido que mirarlo porque lo he visto infinidad de veces (cada vez que compilo un kernel) y nunca lo he copiado.

La documentacion en system.map

El fichero contiene la tabla de simbolos, traduce direcciones de memoria a nombre de funciones y variables. Es decir que salvo que necesites debugar el kernel no lo necesitas para nada. Ese fichero se crea/actualiza cada vez que se compila el kernel, la verdad es que casi todas las aplicaciones/modulos que se instalan (nvidia, wireless,etc...) que dependan del kernel necesitan un /usr/src/linux valido (mismo que "uname -r"), donde o lo encuentra o tiene las fuentes.

----------

## Mcklaren

Buenas de nuevo, ahora que he visto el post veo que han seguido posteando asi que nada gracias a tod@s, otra cosa i92guboj muchas gracias por tu explicación pero siento decirte que casi no me enterado de nada   :Embarassed: , asi que si eres tan amable de poder aclararme solo una cosa, según veo que postea ackward no es necesario a menos que debugger el kernel, pues bien como eso no lo hago ya que no tengo conocimientos para poder hacerlo (ojala pudiese, seria señal de que sabría bastante) entonces no seria realmente necesario en mi caso ¿no?. Y otra cosa más de querer usarlo como debería hacerlo, es decir, yo ahora actualizo mi kernel, hago un make menuconfig despues un make && make modules_install cuando acaba hago un cp ../arch/i386/boot/bzImage /boot/kernel-version hasta aquí correcto todo, pero el System.map que lo copio tal como está, es decir, lo copio como System.map tal cual o lo copio como System.map-version, y una última cosa el System.map tambien tengo que copiarlo cada vez recompile el kernel por cualquier motivo, por ejemplo, tengo ya mi kernel compilado e instalado pero hoy he aprendido algo nuevo y lo recompilo para mejorarlo entonces aparte del bzImage tengo que copiar de nuevo el System.map ?. Pues esto es todo, espero que me aclaren ya del todo mi gran duda.

----------

## i92guboj

 *Mcklaren wrote:*   

> Buenas de nuevo, ahora que he visto el post veo que han seguido posteando asi que nada gracias a tod@s, otra cosa i92guboj muchas gracias por tu explicación pero siento decirte que casi no me enterado de nada  , asi que si eres tan amable de poder aclararme solo una cosa, según veo que postea ackward no es necesario a menos que debugger el kernel, pues bien como eso no lo hago ya que no tengo conocimientos para poder hacerlo (ojala pudiese, seria señal de que sabría bastante) entonces no seria realmente necesario en mi caso ¿no?.

 

Exacto. Siento que mi explicación haya sido demasiado espinosa, he intentado hacerlo lo más asequible que he podido pero estos temas son un poco oscuros jeje. En cualquier caso, la respuesta es acertada: no necesitas para nada dicho archivo si no planeas depurar tu kernel ni mandar reportes de bugs del kernel a los desarrolladores del mismo.

 *Quote:*   

> Y otra cosa más de querer usarlo como debería hacerlo, es decir, yo ahora actualizo mi kernel, hago un make menuconfig despues un make && make modules_install cuando acaba hago un cp ../arch/i386/boot/bzImage /boot/kernel-version hasta aquí correcto todo, pero el System.map que lo copio tal como está, es decir, lo copio como System.map tal cual o lo copio como System.map-version, y una última cosa el System.map tambien tengo que copiarlo cada vez recompile el kernel por cualquier motivo, por ejemplo, tengo ya mi kernel compilado e instalado pero hoy he aprendido algo nuevo y lo recompilo para mejorarlo entonces aparte del bzImage tengo que copiar de nuevo el System.map ?. Pues esto es todo, espero que me aclaren ya del todo mi gran duda.

 

Yo lo hago así:

```

make && make install modules_install

```

El "install" suelto que hay en mitad copia el kernel y todo lo necesario a su sitio correcto, incluyendo ficheros config y map. Si lo quieres hacer a mano, tendrías que copiar los demás ficheros a mano. Pero realmente no son necesarios. Lo único necesario es el kernel. 

Si usas ese comando que he puesto más arriba, no tienes que copiar el kernel a mano. Tan solo asegúrate de que /boot está montado antes de lanzar "make install modules_install" y todo irá a su sitio. Luego configuras grub.conf para poner tu nuevo kernel. De todas formas, este proceso también actualiza el link /boot/vmlinuz para apuntar al último kernel instalado.

Si no comprendes algo o algo de lo que digo te suena a chino no dudes en preguntar. Intentaré explicarlo de otra forma, y si no, seguro que alguien por aquí puede  :Smile: 

----------

## Mcklaren

Ahora parece que lo estoy viendo cada vez mas claro   :Wink:  bueno fuera bromas, antes de nada i92guboj muchas gracias por tu ayuda (además somos paisanos, acabo antes yendo a tu casa   :Laughing:  ). La unica duda que tengo es que con el install lo que haces es que instalas automaticamente todo en su sitio, ok perfecto mejor todavia, pero mi duda es ¿el bzImage que lo instala en /boot como bzImage tal cual o te lo instala automaticamente con el nombre del kernel ya?, es decir, que te lo instala como /boot/bzImage o te lo instala como /boot/bzImage-2.6.23 por ejemplo. 

Y otra cosilla si te lo instala por ejemplo como /boot/bzImage yo puedo renombrarlo a /boot/kernel-2.6.23 sin problemas o romperia algun enlaze o algo raro (siento mi ignorancia en estos momentos, pero no me fio ya que nunca use el install este, da a entender que no tengo ni idea de gentoo   :Crying or Very sad:  ). Bueno creo que una vez tenga estas ideas claras y con el metodo que me has explicado para instalar todo sobra que me preocupe de System.map etc ya que el install hara todo el trabajo por mi o casi todo   :Wink:  Gracias de nuevo.

----------

## Cereza

Yo también uso make && make install modules_install.

Ningún bzImage jeje, esto crea ya directamente /boot/vmlinuz-2.6.23.12 /boot/config-2.6.23.12 y /boot/System.map-2.6.23.12 (o la versión del kernel en cuestión) vmlinuz-blabla es el kernel ya compilado que le pasas a grub.conf, no tienes que renombrar nada, así que no romperas nada.

Saludos :)

----------

## i92guboj

Como bien dice cereza, te copia los tres archivos, cada uno con su número de versión. Además de ésto hace otras dos cosas dentro del dir /boot:

1.- renombra system.map, config y vmzlinuz a system.map.old, config.old y  vmzlinuz.old respectivamente.

2.- crear tres symlinks llamados system.map, config y vmlinuz que apuntan a los tres nuevos archivos recién copiados.

Para mí esto no tiene utilidad alguna, porque en grub.conf siempre uso el nombre del archivo real, y no de los symlinks. Pero hay personas que usan /boot/vmlinuz como kernel. Si tú eres de estos, lo bueno de todo eso que he puesto arriba es que tu vmlinuz se actualiza automáticamente y no tienes que editor tu grub.conf para cambiarlo.  :Wink: 

----------

## ackward

Yo por mi parte siempre lo hago en 2 partes (make bzImage && make modules_install y copiar bzimage/editar grub), con kernels maduros quiza no sea tan critico pero siempre hay algun problemilla (por ejemplo usaba el 2.6.21ck y al pasar al 2.6.23 dejo de funcionar la red, no reconocia la tarjeta, porque el driver sk98 ha cambiado). 

Si estas en tu pc, en casa, con el delante pues no pasa nada... si el servidor esta en un cliente a 300km...

Asi que siempre que preparo un nuevo kernel, creo una nueva entrada en el grub y me aseguro que el grub lo reiniciara solo 1 vez.  Grub: Booting once-only

Si el equipo no se levanta, basta con llamar por telefono para que alguien le pegue un botonazo.

El fallback que viene como recomendado no sirve, si esta mal un driver de red el sistema arrancara y para grub estara funcionando correctamente pero no tienes acceso via red con lo que a) el servidor no sirve y b) necesitas alguien con conocimientos como manos remotas (historias para no dormir... una vez, servidor en un datacenter de telefonica, domingo de madrudaga, hablando con un operador rumano que no sabia castellano...) .

----------

## Mcklaren

Buenas de nuevo, pues viendo el metodo de instalación automatico que i92guboj me mostro en las respuestas anteriores creo que la pregunta del hilo ya queda respondida. Asi que voy aclarar un poco como yo lo he entendido y asi algún día alguien haciendo una busqueda le aparece esto lo tendrá claro.

1º Como la pregunta era de que iba el archivo System.map, pues la respuesta que doy es que esto "solo" sirve para los usuarios que hacen debugger del kernel ya que tiene un mapa de todos los dispositivos etc (más arriba lo explica i92guboj de maravillas) y para los usuarios de a pie no necesitamos esto para nada asi que lo podeis omitir el copiarlo si haceis la instalación manual sin problemas. Instalación manual me refiero al make && make modules_install y despues el cp .../../../bzImage etc.

2º Si usamos el metodo que explicó tambien más arriba i92guboj, es decir, el make && make install modules_install si que no tendremos problemas ya que este copia el System.map (con la actual version del kernel, lo cual también queda respondida mi pregunta de si se puede renombrar), el vmlinuz tambien con la version del kernel y por último tambien te crea una copia del archivo config con la versión actual del kernel, el cual viene bien si actualizas de una version 2.6.23 por ejemplo a una 2.6.23.1 porque los cambios son pequeños, ahora si el kernel pega un salto mas grande de version como puede ser a una 2.6.24 hay que tener má precaución ya que puede haber cambios importantes.

3º Y para finalizar ya esto solo que decir que el enlace simbolico que crea de vmlinuz lo podeis renombrar tambien, es decir, el archivo /boot/vmlinuz-2.6.23(o la version del kernel que tengais) lo puedes renombrar sin problemas, el vmlinuz sin embargo yo lo dejaria tal cual.

Bueno pues nada más solo decir que muchisimas gracias a tod@s y que espero esto sirva para mas usuarios. Saludos.

----------

## antogc

bueno se q esta cerrado pro como viene al caso pruebo. A ver me doy cuenta de que a veces cuando reconlio el kernel, tarda muy poco en hacerlo y otras veces tarda sus 5 minutos, entonces me viene a la cabeza el pensar que a veces use información de compilación anteriores o algo asi por el estilo que evite la recompilación completa....me gustaría saber si eso es asi y de ser asi si hay alguna forma de evitarlo y poder hacer una compilación completa.

gracias...

----------

## Mcklaren

antogc si quieres hacer una instalación completa como dices lo que tienes que hacer es un make mrproper que te eliminará todos los archivos de configuración existentes incluido el .config y entonces podrás empezar de cero. Si lo que quieres es solo reconfigurar y recompilar puedes hacer un make clean para limpiar los archivos de trabajo y despues lanzar de nuevo el make && make install modules_install para instalar todo otra vez.

Te aclaro que si lo que quieres es solo recompilar lo que tienes que hacer es solo make clean, make menuconfig, reconfiguras lo que quieres y make && make install modules_install, ahora si lo que quieres es empezar de cero entonces es cuando empleas el make mrproper, pero como te dije antes cuidado que pierdes el archivo .config tambien, asi que si quieres puedes hacer una copia por si te hiciera falta. 

Creo que esto es la duda que preguntas sino es asi pues nada pregunta lo que necesites que para eso estamos. Suerte.

----------

