tl; dr: Estou construíndo unha imaxe de Kali Linux para un ordenador ARM, no programa debootstrap
, linux
и u-boot
.
Se compraches un só pagador non moi popular, podes atopar a falta dunha imaxe do teu kit de distribución favorito para iso. Pasoulle practicamente o mesmo
O proceso de descarga é bastante sinxelo:
- O hardware está inicializado.
- Desde algunha área do dispositivo de almacenamento (tarxeta SD/eMMC/etc) o cargador de arranque é lido e executado.
- O cargador busca o núcleo do sistema operativo e cárgao nalgunha área de memoria e execútao.
- O núcleo carga o resto do SO.
Para a miña tarefa, este nivel de detalle é suficiente, podes ler os detalles
Construír o sistema de ficheiros raíz
Primeiro cómpre preparar seccións. Das U-Boot admite diferentes sistemas de ficheiros, eu escollín FAT32 para /boot
e ext3 para root, esta é a marca de imaxe estándar para Kali baixo ARM. Usarei GNU Parted, pero podes facer o mesmo máis familiar fdisk
. Tamén necesitarás dosfstools
и e2fsprogs
para crear un sistema de ficheiros: apt install parted dosfstools e2fsprogs
.
Partición da tarxeta SD:
- Marque a tarxeta SD como usando a partición MBR:
parted -s /dev/mmcblk0 mklabel msdos
- Crear unha sección para
/boot
para 128 megabytes:parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB
. O primeiro megabyte perdido débese deixar para o propio marcado e para o cargador de arranque. - Cree un FS raíz para o resto da capacidade:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
- Se de súpeto non creou nin cambiou ficheiros de partición, cómpre executar `partprobe`, entón a táboa de particións volverase ler.
- Cree un sistema de ficheiros de partición de arranque etiquetado
BOOT
:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
- Crea un sistema de ficheiros raíz cunha etiqueta
ROOTFS
:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2
Xenial, agora podes enchelo. Isto requirirá ademais debootstrap
, unha utilidade para crear FS root en sistemas operativos similares a Debian: apt install debootstrap
.
Recollemos FS:
- Monte a partición en
/mnt/
(utiliza un punto de montaxe máis cómodo para ti):mount /dev/mmcblk0p2 /mnt
- En realidade, enchemos o sistema de ficheiros:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali
... Parámetro--include
especifica instalar adicionalmente algúns paquetes, especifiquei un emulador QEMU construído de forma estática. Permítelle realizarchroot
ao contorno ARM. O significado das outras opcións pódese atopar enman debootstrap
. Non esquezas que non todas as placas ARM admiten a arquitecturaarmhf
. - Debido á diferenza de arquitecturas
debootstrap
realízase en dúas etapas, a segunda realízase do seguinte xeito:chroot /mnt/ /debootstrap/debootstrap --second-stage
- Agora tes que xirar:
chroot /mnt /bin/bash
- Enchemos
/etc/hosts
и/etc/hostname
obxectivo FS. Encha o mesmo que o contido no seu ordenador local, lembre de substituír só o nome de host. - Podes personalizar todo o demais. En particular, instalo
locales
(claves do repositorio), reconfiguración de locais e zona horaria (dpkg-reconfigure locales tzdata
). Non esquezas establecer o contrasinal co comandopasswd
. - Establece un contrasinal para
root
o equipopasswd
. - A preparación da imaxe para min complétase recheo
/etc/fstab
dentro/mnt/
.
Subirei de acordo coas etiquetas creadas anteriormente, polo que o contido será así:
LABEL=ROOTFS/erros automáticos=remount-ro 0 1
LABEL=BOOT /boot auto por defecto 0 0
Finalmente, pode montar a partición de arranque, necesitarémola para o núcleo: `mount /dev/mmcblk0p1 /mnt/boot/`
Construíndo Linux
Para construír o núcleo (e despois o cargador de arranque) en Debian Testing, cómpre instalar o conxunto estándar de ficheiros de cabeceira GCC, GNU Make e GNU C Library para a arquitectura de destino (teño armhf
), así como cabeceiras OpenSSL, calculadora da consola bc
, bison
и flex
: apt install crossbuild-essential-armhf bison flex libssl-dev bc
. Xa que o cargador predeterminado busca un ficheiro zImage
no sistema de ficheiros da partición de arranque, é hora de romper a unidade flash.
- A clonación do núcleo é demasiado longa, así que só descargarei:
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
. Descomprimir e ir ao directorio de orixe:tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
- Configure antes de compilar:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig
. A configuración está no directorioarch/arm/configs/
. Se non o hai, pode tentar buscar e descargar un preparado e pasar o nome do ficheiro neste directorio ao parámetroKBUILD_DEFCONFIG
. En casos extremos, proceda inmediatamente ao seguinte parágrafo. - Opcionalmente, pode modificar a configuración:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- E compila a imaxe cruzada:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
- Agora podes copiar o ficheiro do núcleo:
cp arch/arm/boot/zImage /mnt/boot/
- E ficheiros de DeviceTree (descrición do hardware dispoñible no taboleiro):
cp arch/arm/boot/dts/*.dtb /mnt/boot/
- E instala os módulos ensamblados como ficheiros separados:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install
O núcleo está listo. Podes desmontar todo: umount /mnt/boot/ /mnt/
Das U Boot
Dado que o cargador de arranque é interactivo, a propia placa, un dispositivo de almacenamento e un dispositivo USB a UART opcional son suficientes para probar o seu funcionamento. É dicir, pode aprazar o núcleo e o sistema operativo para máis tarde.
A gran maioría dos fabricantes suxiren usar Das U-Boot para o arranque principal. O soporte completo adoita proporcionarse no seu propio fork, pero non esquezas contribuír na fase ascendente. No meu caso, o taboleiro é compatible
Recollemos o propio cargador de arranque:
- Clona a rama estable do repositorio:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
- Imos ao propio directorio:
cd u-boot
- Preparando a configuración de compilación:
make mx6ull_14x14_evk_defconfig
. Isto só funciona se a configuración está no propio Das U-Boot, se non, terás que buscar a configuración do fabricante e poñela na raíz do repositorio no ficheiro.config
, ou montado doutra forma recomendada polo fabricante. - Recollemos a propia imaxe do cargador de arranque cun compilador cruzado
armhf
:make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx
Como resultado, obtemos o ficheiro u-boot.imx
, esta é unha imaxe preparada que se pode escribir nunha unidade flash USB. Escribimos na tarxeta SD, saltando os primeiros 1024 bytes. Por que escollín o destino u-boot.imx
? Por que perdeu exactamente 1024 bytes? Isto é o que se propoñen facer
Feito, podes descargar. O cargador de arranque debería informar da súa propia versión, algunha información sobre o taboleiro e tentar atopar a imaxe do núcleo na partición. Se falla, tentará iniciar a través da rede. En xeral, a saída é bastante detallada, podes atopar un erro en caso de problema.
En vez de unha conclusión
Sabías que a fronte dun golfiño non é ósea? É literalmente un terceiro ollo, unha lente graxa para a ecolocalización.
Fonte: www.habr.com