tl; dr: Estoy construyendo una imagen de Kali Linux para una computadora ARM, en el programa debootstrap
, linux
и u-boot
.
Si compró algunos de pago único no muy populares, es posible que le falte una imagen de su kit de distribución favorito. Más o menos le pasó lo mismo
El proceso de descarga es bastante simple:
- El hardware se inicializa.
- Desde algún área del dispositivo de almacenamiento (tarjeta SD/eMMC/etc) se lee y ejecuta el gestor de arranque.
- El cargador busca el núcleo del sistema operativo y lo carga en algún área de memoria y lo ejecuta.
- El kernel carga el resto del sistema operativo.
Para mi tarea, este nivel de detalle es suficiente, puedes leer los detalles
Construyendo el sistema de archivos raíz
Primero necesitas preparar secciones. Das U-Boot admite diferentes sistemas de archivos, elegí FAT32 para /boot
y ext3 para root, este es el marcado de imagen estándar para Kali bajo ARM. Usaré GNU Parted, pero puedes hacer lo mismo más familiar fdisk
. también necesitarás dosfstools
и e2fsprogs
para crear un sistema de archivos: apt install parted dosfstools e2fsprogs
.
Partición de la tarjeta SD:
- Marque la tarjeta SD para usar la partición MBR:
parted -s /dev/mmcblk0 mklabel msdos
- Crear una sección para
/boot
para 128 megas:parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB
. El primer megabyte perdido debe dejarse para el marcado en sí y para el gestor de arranque. - Cree un FS raíz para el resto de la capacidad:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
- Si de repente no ha creado o cambiado los archivos de partición, debe ejecutar `partprobe`, luego se volverá a leer la tabla de partición.
- Cree un sistema de archivos de partición de arranque etiquetado
BOOT
:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
- Crear un sistema de archivos raíz con una etiqueta
ROOTFS
:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2
Genial, ahora puedes llenarlo. Esto requerirá además debootstrap
, una utilidad para crear root FS en sistemas operativos similares a Debian: apt install debootstrap
.
Recolectamos FS:
- Monte la partición para
/mnt/
(use un punto de montaje más conveniente para usted):mount /dev/mmcblk0p2 /mnt
- En realidad llenamos el sistema de archivos:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali
. Parámetro--include
especifica para instalar adicionalmente algunos paquetes, especifiqué un emulador QEMU construido estáticamente. Te permite realizarchroot
al entorno ARM. El significado de las otras opciones se puede encontrar enman debootstrap
. No olvide que no todas las placas ARM admiten la arquitecturaarmhf
. - Debido a la diferencia en las arquitecturas
debootstrap
se realiza en dos etapas, la segunda se realiza de la siguiente manera:chroot /mnt/ /debootstrap/debootstrap --second-stage
- Ahora necesitas girar:
chroot /mnt /bin/bash
- Rellene
/etc/hosts
и/etc/hostname
FS de destino. Complete lo mismo que el contenido en su computadora local, recuerde reemplazar solo el nombre de host. - Puedes personalizar todo lo demás. En particular, instalo
locales
(claves de repositorio), reconfiguración de locales y zona horaria (dpkg-reconfigure locales tzdata
). No olvides establecer la contraseña con el comandopasswd
. - Establecer una contraseña para
root
el equipopasswd
. - La preparación de la imagen para mí se completa rellenando
/etc/fstab
dentro/mnt/
.
Subiré de acuerdo con las etiquetas creadas anteriormente, por lo que el contenido será así:
ETIQUETA=ROOTFS / errores automáticos=remontar-ro 0 1
ETIQUETA=ARRANQUE /arranque automático por defecto 0 0
Finalmente, puede montar la partición de arranque, la necesitaremos para el kernel: `mount /dev/mmcblk0p1 /mnt/boot/`
Construyendo Linux
Para compilar el kernel (y luego el cargador de arranque) en Debian Testing, debe instalar el conjunto estándar de GCC, GNU Make y los archivos de encabezado de la biblioteca GNU C para la arquitectura de destino (tengo armhf
), así como encabezados OpenSSL, calculadora de consola bc
, bison
и flex
: apt install crossbuild-essential-armhf bison flex libssl-dev bc
. Dado que el cargador predeterminado busca un archivo zImage
en el sistema de archivos de la partición de arranque, es hora de romper la unidad flash.
- Clonar el núcleo es demasiado largo, así que simplemente descargaré:
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
. Descomprima y vaya al directorio de origen:tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
- Configurar antes de compilar:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig
. La configuración está en el directorio.arch/arm/configs/
. Si no hay ninguno, puede intentar encontrar y descargar uno listo y pasar el nombre del archivo en este directorio al parámetroKBUILD_DEFCONFIG
. En casos extremos, pase inmediatamente al párrafo siguiente. - Opcionalmente, puede modificar la configuración:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- Y compilar de forma cruzada la imagen:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
- Ahora puede copiar el archivo del kernel:
cp arch/arm/boot/zImage /mnt/boot/
- Y archivos de DeviceTree (descripción del hardware disponible en la placa):
cp arch/arm/boot/dts/*.dtb /mnt/boot/
- E instale los módulos ensamblados como archivos separados:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install
El núcleo está listo. Puedes desmontar todo: umount /mnt/boot/ /mnt/
Bota Das U
Dado que el cargador de arranque es interactivo, la placa en sí, un dispositivo de almacenamiento y un dispositivo USB a UART opcional son suficientes para probar su funcionamiento. Es decir, puede posponer el kernel y el sistema operativo para más adelante.
La gran mayoría de los fabricantes sugieren usar Das U-Boot para el arranque principal. El soporte completo generalmente se proporciona en su propia bifurcación, pero no se olvide de contribuir en la parte superior. En mi caso, la placa se apoya en
Recopilamos el gestor de arranque en sí:
- Clona la rama estable del repositorio:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
- Vamos al propio directorio:
cd u-boot
- Preparando la configuración de compilación:
make mx6ull_14x14_evk_defconfig
. Esto solo funciona si la configuración está en Das U-Boot, de lo contrario, deberá encontrar la configuración del fabricante y colocarla en la raíz del repositorio en el archivo..config
, o ensamblado de otra manera recomendada por el fabricante. - Recopilamos la imagen del cargador de arranque con un compilador cruzado
armhf
:make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx
Como resultado, obtenemos el archivo u-boot.imx
, esta es una imagen preparada que se puede escribir en una unidad flash USB. Escribimos en la tarjeta SD saltándonos los primeros 1024 bytes. ¿Por qué elegí el objetivo? u-boot.imx
? ¿Por qué se perdieron exactamente 1024 bytes? Esto es lo que proponen hacer en
Listo, puedes descargar. El cargador de arranque debe informar su propia versión, alguna información sobre la placa e intentar encontrar la imagen del kernel en la partición. Si falla, intentará arrancar a través de la red. En general, la salida es bastante detallada, puede encontrar un error en caso de un problema.
En lugar de una conclusión
¿Sabías que la frente de un delfín no es huesuda? ¡Es literalmente un tercer ojo, una lente grasa para la ecolocalización!
Fuente: habr.com