archivo kernel.img
Cuando se usa el kernel de Linux, el kernel.img
archivo 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.img
archivo de stock no contiene initramfs
mientras que kernel_emergency.img
sí.
Nota: La guía oficial de compilación del núcleo en eLinux wiki sugiere que debe usar la imagetool-uncompressed.py
herramienta para preparar el kernel.img
archivo. Era necesario en los primeros días de RaspberyPi, pero hoy en día el gestor de arranque puede manejar archivos Image
y zImage
archivos 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.org
sitio) no es compatible con RaspberryPi. Además, versatil_config
no es bueno para RaspberryPi, debe usarlo bcmrpi_defconfig
en su lugar (se encuentra en fuentes de kernel compatibles con RaspberryPi) o bcmrpi_emergency_defconfig
si 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):
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_COMPILE
opción en todos sus make
comandos.
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
git
utilidad y puede hacerlo incluso en RapsberryPi): haga clic en el ZIP
icono, un poco debajo de la Code
pestaña en la parte superior del sitio. Esto debería permitirle descargar los últimos archivos de origen como zip
archivo. 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 git
utilidad (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 1
argumento que impide que git descargue todo el historial del desarrollo (que es enorme):
git clone --depth 1 git://github.com/raspberrypi/linux.git
Utilice la configuración predeterminada proporcionada por la fundación:
cp arch/arm/configs/bcmrpi_defconfig .config
Ejecute make oldconfig
y 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
Compila el núcleo:
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
Copie los módulos del kernel a /tmp/modules
:
make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
Usar Image
archivo comokernel.img
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 initramfs
se 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 iniramfs
imagen, intente construir el suyo. Todo lo que debería ser necesario para esto es apuntar a la CONFIG_INITRAMFS_SOURCE
opción de configuración del núcleo uing del directorio descargado .
Notas finales
Entonces debes hacer esto en 3 pasos:
- Intente construir y arrancar el kernel sin
initramfs
archivo.
- Intente agregar
initramfs
contenido listo a su núcleo.
- Cambie este
initramfs
contenido para satisfacer sus necesidades.