Obtendo GNU / Linux em uma placa ARM do zero (por exemplo, Kali e iMX.6)

tl; dr : construir uma imagem de Kali Linux para um computador ARM, em um programa debootstrap, linux e u-boot. Se você comprou algum dispositivo de placa única não muito popular, poderá se deparar com a falta de uma imagem de seu kit de distribuição favorito para ele. Quase a mesma coisa aconteceu com o Flipper One planejado . Kali Linux para IMX6 simplesmente não existe (estou cozinhando), então tenho que construí-lo sozinho.











O processo de download é bastante simples:



  1. O ferro é inicializado.
  2. De alguma área no dispositivo de armazenamento (cartão SD / eMMC / etc), o bootloader é lido e executado.
  3. O carregador procura o kernel do sistema operacional, carrega-o em alguma área da memória e executa.
  4. O kernel carrega o resto do sistema operacional.


Este nível de detalhe é suficiente para a minha tarefa, você pode ler os detalhes em outro artigo . As "algumas" áreas mencionadas acima variam de placa para placa, o que cria algumas dificuldades com a instalação. Eles estão tentando padronizar o carregamento de plataformas ARM de servidor usando UEFI, mas enquanto isso não estiver disponível para todos, você terá que coletar tudo separadamente.



Construindo o sistema de arquivos raiz



Primeiro você precisa preparar as seções. Das U-Boot suporta diferentes sistemas de arquivos, eu escolhi FAT32 para /boote ext3 para a raiz, esta é a marcação de imagem padrão para Kali no ARM. Usarei o GNU Parted, mas você pode tornar a mesma coisa mais familiar fdisk. Também ele precisa dosfstoolse e2fsprogspara criar um sistema de arquivos: apt install parted dosfstools e2fsprogs.



Marcamos o cartão SD:



  1. Marque o cartão SD como usando marcação MBR: parted -s /dev/mmcblk0 mklabel msdos
  2. Criar uma seção de /boot128 megabytes: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. O primeiro megabyte perdido deve ser deixado para a própria marcação e para o carregador de inicialização.
  3. Criamos um sistema de arquivos raiz para toda a capacidade restante: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Se de repente seus arquivos de partição não tiverem sido criados ou alterados, você precisa executar `partprobe`, então a tabela de partição será relida.
  5. Crie um sistema de arquivos de partição de inicialização com o rótulo BOOT:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Crie um sistema de arquivos raiz com um rótulo ROOTFS:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2


Ótimo, agora você pode preencher. Para fazer isso, será necessário um debootstraputilitário adicional para criar um sistema de arquivos raiz, sistemas operacionais baseados em Debian apt install debootstrap.



Coletamos FS:



  1. Monte a partição para /mnt/(use um ponto de montagem mais conveniente):mount /dev/mmcblk0p2 /mnt
  2. : debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. --include , QEMU. chroot ARM-. man debootstrap. , ARM- armhf.
  3. - debootstrap , : chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. : chroot /mnt /bin/bash
  5. /etc/hosts /etc/hostname . , .
  6. . locales ( ), (dpkg-reconfigure locales tzdata). passwd.
  7. Defina uma senha para o rootcomando passwd.
  8. A preparação da imagem para mim termina com o recheio /etc/fstabinterior /mnt/.


Vou carregar de acordo com as tags criadas anteriormente, então o conteúdo ficará assim:

LABEL = ROOTFS / auto errors = remount-ro 0 1

LABEL = BOOT / boot auto defaults 0 0


Finalmente, você pode montar a partição de boot, nós precisamos dela para o kernel: `mount / dev / mmcblk0p1 / mnt / boot /`



Construindo Linux



Para construir o kernel (e, em seguida, o carregador de inicialização) no Debian Testing é necessário estabelecer um conjunto padrão de GCC, GNU make e arquivos de cabeçalho GNU C Library para a arquitetura alvo (I armhf), bem como os cabeçalhos do OpenSSL, calculadora consola bc, bisone flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Como o carregador de inicialização, por padrão, procura um arquivo zImageno sistema de arquivos da partição de inicialização, é hora de particionar a unidade flash USB.



  1. Núcleo Clone muito tempo, então basta baixar: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Descompacte-o e vá para o diretório de origem:tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Configurar antes da compilação: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. A configuração está no diretório arch/arm/configs/. Se não houver nenhum, você pode tentar encontrar e baixar um pronto e passar o nome do arquivo neste diretório para o parâmetro KBUILD_DEFCONFIG. Como último recurso, vá direto para o próximo ponto.
  3. Opcionalmente, você pode ajustar as configurações: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. E vamos compilar a imagem: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Agora você pode copiar o arquivo com o kernel: cp arch/arm/boot/zImage /mnt/boot/
  6. E arquivos com DeviceTree (descrição do hardware disponível na placa): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. E instale os módulos montados como arquivos separados: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install


O kernel está pronto. Você pode desmontar tudo:umount /mnt/boot/ /mnt/



Das U-Boot



Como o bootloader é interativo, a própria placa, um dispositivo de armazenamento e um dispositivo USB-para-UART opcional são suficientes para testar seu funcionamento. Ou seja, você pode adiar o kernel e o sistema operacional para mais tarde.



A grande maioria dos fabricantes sugere o uso do Das U-Boot para a inicialização. O suporte total geralmente é fornecido em seu próprio fork, mas eles não se esquecem de contribuir com o upstream. No meu caso, a placa é suportada na linha principal , então ignorei o fork .



Coletamos o próprio bootloader:



  1. : git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. : cd u-boot
  3. : make mx6ull_14x14_evk_defconfig. Das U-Boot, .config, .
  4. - armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx


Como resultado, obtemos um arquivo u-boot.imx, esta é uma imagem pronta que pode ser gravada em uma unidade flash USB. Escrevemos no cartão SD, saltando os primeiros 1024 bytes. Por que escolhi o alvo u-boot.imx? Por que pulei exatamente 1024 bytes? É isso que a documentação sugere . Para outras placas, o processo de construção e gravação da imagem pode ser ligeiramente diferente.



Feito, você pode inicializar. O bootloader deve relatar sua própria versão, algumas informações da placa e tentar encontrar a imagem do kernel na partição. Se não tiver êxito, ele tentará inicializar pela rede. Em geral, a saída é bastante detalhada, você pode encontrar um erro em caso de problema.



Em vez de uma conclusão



Você sabia que a testa de um golfinho não é óssea? É literalmente um terceiro olho, uma lente gordurosa para ecolocalização!










All Articles