tl dr dr: construindo uma imagem Kali Linux para computador ARM, no programa debootstrap, linux и u-boot.
Se você comprou algum software de placa única não muito popular, poderá se deparar com a falta de uma imagem de sua distribuição favorita para ele. Aproximadamente a mesma coisa aconteceu com Kali Linux Simplesmente não há ninguém para o IMX6 (estou preparando um), então terei que montá-lo eu mesmo.
O processo de download é bastante simples:
- O hardware é inicializado.
- De alguma área do dispositivo de armazenamento (cartão SD/eMMC/etc) o bootloader é lido e executado.
- O bootloader procura o kernel do sistema operacional e o carrega em alguma área da memória e o executa.
- O kernel carrega o resto do sistema operacional.
Este nível de detalhe é suficiente para minha tarefa, você pode ler os detalhes . As “algumas” áreas mencionadas acima diferem de placa para placa, o que cria algumas dificuldades de instalação. Carregando plataformas de servidor ARM usando UEFI, mas embora não esteja disponível para todos, você terá que montar tudo separadamente.
Construindo o sistema de arquivos raiz
Primeiro você precisa preparar as seções. Das U-Boot suporta diferentes sistemas de arquivos, escolhi FAT32 para /boot e ext3 para root, este é o layout de imagem padrão para Kali no ARM. Usarei o GNU Parted, mas você pode fazer o mesmo de uma forma mais familiar fdisk. Você também precisará dosfstools и e2fsprogs para criar um sistema de arquivos: apt install parted dosfstools e2fsprogs.
Marcamos o cartão SD:
- Marque o cartão SD como usando particionamento MBR:
parted -s /dev/mmcblk0 mklabel msdos - Crie uma seção em
/bootpara 128 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 bootloader. - Criamos um sistema de arquivos raiz para toda a capacidade restante:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100% - Se de repente seus arquivos de partição não foram criados ou alterados, você precisa executar `partprobe`, então a tabela de partição será relida.
- Crie um sistema de arquivos para a partição de inicialização com o rótulo
BOOT:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1 - Crie um sistema de arquivos raiz com um rótulo
ROOTFS:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2
Ótimo, agora você pode preenchê-lo. Para isso você precisará adicionalmente debootstrap, um utilitário para criar sistemas de arquivos raiz Debian- sistemas operacionais similares: apt install debootstrap.
Coletamos FS:
- Monte a partição em
/mnt/(use um ponto de montagem mais conveniente):mount /dev/mmcblk0p2 /mnt - Na verdade, preenchemos o sistema de arquivos:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parâmetro--includeindica a instalação adicional de alguns pacotes, especifiquei um emulador QEMU construído estaticamente. Ele permite que você executechrootno ambiente ARM. O significado das opções restantes pode ser encontrado emman debootstrap. Não esqueça que nem toda placa ARM suporta a arquiteturaarmhf. - Devido à diferença na arquitetura
debootstrapé realizado em duas etapas, a segunda é realizada assim:chroot /mnt/ /debootstrap/debootstrap --second-stage - Agora você precisa estragar tudo:
chroot /mnt /bin/bash - Preencher
/etc/hostsи/etc/hostnamealvo FS. Preencha igual ao conteúdo do seu computador local, mas lembre-se de substituir o nome do host. - Você pode personalizar todo o resto. Em particular, eu instalo
locales(chaves de repositório), reconfigurar localidades e fuso horário (dpkg-reconfigure locales tzdata). Não se esqueça de definir a senha com o comandopasswd. - Defina uma senha para
roota equipepasswd. - A preparação da imagem para mim termina com o preenchimento
/etc/fstabdentro/mnt/.
Farei o upload de acordo com as tags criadas anteriormente, então o conteúdo ficará assim:
LABEL=ROOTFS / erros automáticos=remount-ro 0 1
LABEL=BOOT /inicialização automática padrões 0 0
Finalmente, você pode montar a partição de boot, precisaremos dela para o kernel: `mount /dev/mmcblk0p1 /mnt/boot/`
montagem Linux
Para compilar o kernel (e o carregador de inicialização posteriormente) em Debian Os testes exigem a instalação do conjunto padrão de arquivos de cabeçalho do GCC, GNU Make e da biblioteca GNU C para a arquitetura de destino (eu tenho). armhf), bem como cabeçalhos OpenSSL, calculadora de console bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Como o carregador padrão procura o arquivo zImage no sistema de arquivos da partição de inicialização, é hora de dividir a unidade flash.
- Demora muito para clonar o kernel, então vou apenas baixar:
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Vamos descompactar e ir para o diretório de origem:tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1 - Configure antes da compilação:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. A configuração está localizada no diretórioarch/arm/configs/. Se não houver, você pode tentar encontrar e baixar um já pronto e passar o nome do arquivo neste diretório como parâmetroKBUILD_DEFCONFIG. Como último recurso, passe imediatamente para o próximo ponto. - Opcionalmente, você pode ajustar as configurações:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig - E faça a compilação cruzada da imagem:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- - Agora você pode copiar o arquivo do kernel:
cp arch/arm/boot/zImage /mnt/boot/ - E arquivos do DeviceTree (descrição do hardware na placa):
cp arch/arm/boot/dts/*.dtb /mnt/boot/ - E instale os módulos coletados na forma de 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/
O U-Boot
Como o bootloader é interativo, tudo que você precisa para testar seu funcionamento é a própria placa, um dispositivo de armazenamento e, opcionalmente, um dispositivo USB para UART. Ou seja, você pode adiar o kernel e o sistema operacional para mais tarde.
A grande maioria dos fabricantes oferece o uso do Das U-Boot para a inicialização. O suporte completo geralmente é fornecido em seu próprio fork, mas eles não se esquecem de contribuir com o upstream. No meu caso, a placa é suportada em é por isso Eu ignorei.
Vamos montar o próprio bootloader:
- Clonamos o branch estável do repositório:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10 - Vamos para o próprio diretório:
cd u-boot - Preparando a configuração de compilação:
make mx6ull_14x14_evk_defconfig. Isso só funciona se a configuração estiver no próprio Das U-Boot, caso contrário você precisará encontrar a configuração do fabricante e colocá-la na raiz do repositório em um arquivo.configou monte de qualquer outra maneira recomendada pelo fabricante. - Montamos a própria imagem do bootloader usando um compilador cruzado
armhf:make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx
Como resultado obtemos o arquivo u-boot.imx, esta é uma imagem pronta que pode ser gravada em uma unidade flash. Escrevemos no cartão SD, pulando os primeiros 1024 bytes. Por que escolhi o Target u-boot.imx? Por que perdi exatamente 1024 bytes? Isto é o que eles propõem fazer em . Para outras placas, o processo de construção e gravação de imagens pode ser um pouco diferente.
Pronto, você pode inicializar. O bootloader deve reportar sua própria versão, algumas informações sobre a 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 o erro se houver algum problema.
Em vez de uma conclusão
Você sabia que a testa de um golfinho não é ossuda? É literalmente um terceiro olho, uma lente gordurosa para ecolocalização!
Fonte: habr.com
