¿Qué contiene un árbol fuente del núcleo? ¿Está relacionado con los encabezados del kernel de Linux?

25

En los libros, que normalmente leído referencias al árbol de código fuente de Linux en /usr/src/linuxel juego habitual de los subdirectorios ( arch, block, crypto, ...).

Esperaba que este árbol contuviera los archivos binarios que componen el núcleo. En mi sistema (Ubuntu 10.04) ...

  1. para los diferentes núcleos que tengo (usando descargas de software automatizadas, no instaladas manualmente), encuentro en este lugar dos subdirectorios para cada núcleo de la siguiente manera:

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. En los subdirectorios esperaba archivos binarios, entre otros. Sin embargo, verifiqué una buena cantidad del árbol, y el último subdirectorio de aquí parece tener siempre un Makefile(al leerlo, por lo general suena más como un archivo de configuración que como un archivo de instalación), más ocasionalmente algunos otros archivos aislados (mayormente Kconfig)

Mi pregunta puede ser ingenua, pero estoy un poco confundido. Es (2) lo que debería esperar ver en el Kernel Source Tree; ¿Y por qué tengo la referencia explícita a 'encabezados'? Necesitaba instalar linux-generic-headersun tiempo atrás para algún otro software y no estoy seguro de si esto podría estar relacionado. Me doy cuenta de que hay una buena razón para los makefiles (por ejemplo, para instalar módulos en el subdirectorio / driver), pero (más o menos) ¿solo makefiles?

gnometorule
fuente

Respuestas:

30

Los kernel-headerpaquetes de distribución contienen, como su nombre lo indica, solo los archivos de encabezado del núcleo (más la plomería necesaria) que se requieren para construir software como los módulos del núcleo.

No debe esperar encontrar archivos binarios en absoluto en un directorio de origen del núcleo , a excepción de la salida de compilación. (Si se configura y construye un núcleo mismo, el directorio de fuentes del núcleo también contiene los objetos compilados, módulos, el propio núcleo construido y algunos otros bits binarios y piezas que lo hacen funcionar.)
KConfigArchivos son una descripción de las opciones de configuración del kernel (y sus dependencias) que están disponibles para un directorio / módulo dado.
Aparte de eso, es todo (principalmente) código fuente C, archivos de encabezado y Makefiles. Hay algunos scripts de ayuda aquí y allá, y también fuente de ensamblaje.

Los paquetes de encabezado (lo que instaló) solo contienen la parte de encabezado de lo anterior (y no todo eso, solo los encabezados "exportados") y parte de la infraestructura de compilación. Entonces, lo que estás viendo se espera. Los paquetes de encabezado no contienen código fuente C (a excepción de algunos códigos auxiliares y código de infraestructura de compilación). El objetivo de tener este tipo de paquete es ahorrar espacio (y ancho de banda): todo el árbol de fuentes del núcleo de Linux es bastante grande y completamente innecesario si no tiene la intención de compilar el núcleo usted mismo. Los paquetes de encabezado se crean y envían mediante distribuciones para proporcionar las cosas correctas necesarias para construir módulos, pero no más. (Ciertamente no contienen el núcleo compilado).

Abordar su comentario: los paquetes de encabezado no se reubican en ningún lado. Están diseñados para versiones específicas del núcleo, empaquetados en un directorio específico, y eso es todo. Es solo un conjunto de archivos. (Tenga en cuenta que los paquetes de encabezado no necesariamente tienen la misma versión que los paquetes binarios del kernel estable actual; los paquetes de encabezado son genéricos y pueden estar rezagados con respecto al kernel real que está ejecutando. Sin embargo, no deben ser de un kernel versión que es más reciente que el núcleo actual instalado (o de destino).)

Los archivos binarios del kernel instalados generalmente se instalan en el /bootdirectorio, junto con los archivos binarios del cargador de arranque y los archivos de configuración. (Esto a veces es un sistema de archivos independiente, no montado de forma predeterminada). El nombre exacto de los archivos depende del núcleo y la distribución. (También lo hace el gestor de arranque).

Los módulos de kernel instalados residen en subdirectorios de:

/lib/modules/`uname -r`/

Entonces, por ejemplo, en mi sistema, actualmente están en

/lib/modules/3.1.4-gentoo/

Código fuente del núcleo completo : en Ubuntu, si desea que las fuentes del núcleo completo construyan un núcleo usted mismo, debe instalarlo siguiendo las instrucciones aquí .

También puede descargar un tarball de origen kernel.orgy descomprimirlo en algún lugar ( no sobrescriba los archivos instalados de Ubuntu si usa este tarball, mantenga sus cosas personales y las cosas administradas por RPM por separado).

/usr/src/linuxes un lugar tradicional para colocar fuentes de kernel, pero nada le impide colocar fuentes de kernel en otro lugar. Esta ruta también suele ser solo un enlace simbólico a un directorio. Por ejemplo, tengo esto en mi máquina:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

El enlace simbólico está ahí para simplificar la creación de aplicaciones que dependen de la fuente del núcleo. Vincula esa ruta a su núcleo en ejecución (o destino) para que no tenga que especificar la versión exacta o la información de ruta cuando construye un módulo fuera del árbol. Ayuda un montón para distribuciones basadas en fuente al menos.

Estera
fuente
Muchas gracias por esta respuesta detallada y bastante completa. Esto me había estado molestando por un tiempo. Si no estoy extendiendo demasiado mi bienvenida, y si encuentra el tiempo, ¿podría agregar amablemente, siguiendo: (a) Leí lo anterior que en mi caso (no kernel autoinstalado), algunos (uno) del sub los directorios deberían (podrían) contener el núcleo C y el código fuente del ensamblador. ¿Dónde estaría eso? No es una lista completa, solo que cuando busqué entre 20 y 30 de los subdirectorios, nunca encontré uno. He descargado los archivos fuente del núcleo de kernel.org; Solo quiero entender mejor mi sistema. (b) ...
gnometorule
... entonces, ¿dónde (genéricamente) se encuentran los archivos binarios del núcleo cuando no instala el núcleo usted mismo, como en mi caso? (c) Usted se refiere a los "paquetes de encabezados" que tomé como 'linux-generic-headers'. ¿Es el árbol que veo de esos paquetes? En caso afirmativo, ¿se reubican donde sea que estaba el árbol de origen antes de instalarlos? Muchas gracias de nuevo.
gnometorule
(si su respuesta, el uso 'comentario answer'not por lo que al menos se puede upvote nuevo por su ayuda)
gnometorule
Expandido un poco. Los paquetes de encabezado son para encabezados. Los paquetes fuente completos proporcionan el código fuente completo. Los paquetes binarios solo proporcionan binarios.
Mat
55
linux-sourcecontiene la fuente ascendente, apt-get source linux-image-$(uname -r)obtiene la fuente del núcleo con los parches de Ubuntu.
Lekensteyn