Imagen del kernel de construcción (.img) incluyendo ramdisk

12

He construido mi kernel de Linux (3.0.1) para mi Raspberry Pi con estos pasos:

1. Downloading kernel source
2. tar xvf source.tar.bz2
3. downloading arm cross compilation tool.
4. tar xvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
5. setting up path for cross tool export PATH=$PATH:/home/shan/<cross tool folder>/bin/
6. after entering linux source dir make ARCH=arm versatile_defconfig (is this reliable   with raspberry pi)
7. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
8. zImage is generated in /arch/arm/boot

Mi pregunta es, ¿cómo puedo construir kernel.img? Creo que contiene zImage + ramdisk, pero ¿cómo puedo construir esto?

¿Alguien me puede guiar a hacer ramdisk y empacar estos dos en el archivo kernel.img? Quiero arrancar este kernel en mi Raspberry Pi.

Shantanu Banerjee
fuente
Esta es una gran pregunta que me sorprende que aún no se haya hecho.
Jivings
¿Por qué estás usando el kernel 3.0.1? ¿Se encuentra este núcleo de vainilla en el kernel.orgsitio?
Krzysztof Adamski
sí, he encontrado esto en kernel.org
Shantanu Banerjee
He agregado una nueva pregunta sobre qemu y el kernel de frambuesa pi-2 con
compilación cruzada

Respuestas:

8

archivo kernel.img

Cuando se usa el kernel de Linux, el kernel.imgarchivo se renombra linux/arch/arm/boot/Image. También debería ser posible (o al menos fue posible la última vez que lo verifiqué) usar una versión comprimida de este archivo - zImage. Puede contener integrado initramfs(ramdisk) pero no es obligatorio. Por ejemplo, el kernel.imgarchivo de stock no contiene initramfsmientras que kernel_emergency.imgsí.

Nota: La guía oficial de compilación del núcleo en eLinux wiki sugiere que debe usar la imagetool-uncompressed.pyherramienta para preparar el kernel.imgarchivo. Era necesario en los primeros días de RaspberyPi, pero hoy en día el gestor de arranque puede manejar archivos Imagey zImagearchivos regulares .

Problema con las fuentes del kernel

Lo que es muy importante es que al compilar kernel para RaspberryPi, no se puede usar cualquier versión del mismo. Solo funcionará una versión especial portada a RaspberryPi. Desafortunadamente, la versión actual actual (que se encuentra en el kernel.orgsitio) no es compatible con RaspberryPi. Además, versatil_configno es bueno para RaspberryPi, debe usarlo bcmrpi_defconfigen su lugar (se encuentra en fuentes de kernel compatibles con RaspberryPi) o bcmrpi_emergency_defconfigsi planea usar buildin initramfs.

Instrucciones de construcción del núcleo

El mejor lugar para obtener fuentes de kernel para RaspberryPi es Foundation Github . También puede encontrar algunas explicaciones útiles sobre cómo obtenerlo y cómo compilarlo en la wiki oficial de RasbperryPi . Aquí está mi pequeña versión simplificada de los pasos involucrados (NOTA: supongo que desea compilar el núcleo de forma cruzada. Es mucho más rápido y debería crear los mismos resultados, pero también es posible construir el núcleo de forma nativa en RaspberryPi):

  1. Descargue la cadena de herramientas oficial para crear la suya. De otra manera, supongo que está instalado /usr/bin/arm-linux-gnueabi-*. Si lo tiene en otro lugar, debe cambiar la CROSS_COMPILEopción en todos sus makecomandos.

  2. Vaya al sitio https://github.com/raspberrypi/linux donde puede encontrar fuentes oficiales del núcleo RapsberryPi. Puede descargar el código de dos maneras:

    • Como archivo comprimido (para usar esta opción, no tiene que instalar la gitutilidad y puede hacerlo incluso en RapsberryPi): haga clic en el ZIPicono, un poco debajo de la Codepestaña en la parte superior del sitio. Esto debería permitirle descargar los últimos archivos de origen como ziparchivo. En su lugar, podría usar git para hacer esto, pero eso (como se describe en la wiki) necesitará mucho más espacio y tiempo. Luego descomprima el archivo para obtener el árbol de origen.
    • Uso de la gitutilidad (esto no funcionó para mí en RaspberryPi, ya que probablemente haya una pequeña cantidad de RAM, pero debería funcionar bien en los sistemas de escritorio (tenga en cuenta el --depth 1argumento que impide que git descargue todo el historial del desarrollo (que es enorme):

      git clone --depth 1 git://github.com/raspberrypi/linux.git
      
  3. Utilice la configuración predeterminada proporcionada por la fundación:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. Ejecute make oldconfigy responda algunas preguntas (debería estar bien presionar enter en cada pregunta dejando la respuesta predeterminada):

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
    
  5. Compila el núcleo:

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. Copie los módulos del kernel a /tmp/modules:

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. Usar Imagearchivo comokernel.img

  8. Cargue todos los módulos desde desde /tmp/modules/lib/modules/su computadora al /lib/modules/directorio en su raíz RaspberryPi.

Agregar initramfs

Sin embargo, esto no proporciona instrucciones sobre cómo crear initramfs. Dado que este es un tema muy amplio (básicamente, debe crear un entorno de espacio de usuario de Linux funcional y realmente no hay límite en lo complicado que puede ser), no voy a cubrir esto aquí ahora. Solo notaré que initramfsse puede usar en dos formas diferentes: una independiente, donde es un archivo separado y buildin donde está integrado con el archivo de imagen del núcleo (como si estuviera en kernel_emergency.img). La segunda opción debería ser compatible con el gestor de arranque RaspberryPi, pero hay algunos rumores de que está rota en la versión actual del firmware, por lo que probablemente debería usar la versión de compilación.

La mejor manera de comenzar es usar el contenido de trabajo de initramfs (que se está usando para kernel_emergency.img) descargándolo de otro repositorio github de Foundation y solo después de que pueda arrancar el kernel usando esta iniramfsimagen, intente construir el suyo. Todo lo que debería ser necesario para esto es apuntar a la CONFIG_INITRAMFS_SOURCEopción de configuración del núcleo uing del directorio descargado .

Notas finales

Entonces debes hacer esto en 3 pasos:

  1. Intente construir y arrancar el kernel sin initramfsarchivo.
  2. Intente agregar initramfscontenido listo a su núcleo.
  3. Cambie este initramfscontenido para satisfacer sus necesidades.
Krzysztof Adamski
fuente
1
Excelente redacción, pero no deberías usarla zip; gittransfiere eficientemente los archivos y puede usarlos depth=1para evitar el historial de descargas (creo).
Alex Chamberlain
Sí, esto es cierto, pero tratar de hacer esto en RaspberryPi en sí no es una buena idea. Descargar zip funciona muy bien, por otro lado. Agregaré una breve nota sobre el uso de git también.
Krzysztof Adamski
Compilar el núcleo en la Raspberry Pi es una idea horrible en sí misma.
Alex Chamberlain
@AlexChamberlain: Es realmente lento pero definitivamente posible (lo he hecho yo mismo). Lleva una noche, así que no es tan malo. Aparte de eso, ¿por qué es tan horrible?
Krzysztof Adamski
si uso bcmrpi_emergency_defconfig, ¿contendría initramfs?
Shantanu Banerjee
0

Si está ejecutando la misma versión de Debian en ambos, usando X-Apt, dpkg-cross, etc ... y las herramientas emdebian pueden funcionar muy bien.

Fuente: utilizado para desarrollar aplicaciones c ++ para sistemas ARM integrados que ejecutan emdebian.

James Bennet
fuente