Avvio di GNU/Linux su una scheda ARM da zero (usando Kali e iMX.6 come esempio)

tl; dr: Sto costruendo un'immagine Kali Linux per un computer ARM, nel programma debootstrap, linux и u-boot.

Avvio di GNU/Linux su una scheda ARM da zero (usando Kali e iMX.6 come esempio)

Se hai acquistato un software a scheda singola non molto popolare, potresti trovarti di fronte alla mancanza di un'immagine della tua distribuzione preferita. Più o meno è successa la stessa cosa con pianificato Flipper One. Semplicemente non esiste Kali Linux per IMX6 (lo sto preparando), quindi devo assemblarlo da solo.

Il processo di download è abbastanza semplice:

  1. L'hardware è inizializzato.
  2. Da qualche area del dispositivo di archiviazione (scheda SD/eMMC/ecc.) il bootloader viene letto ed eseguito.
  3. Il bootloader cerca il kernel del sistema operativo, lo carica in un'area di memoria e lo esegue.
  4. Il kernel carica il resto del sistema operativo.

Questo livello di dettaglio è sufficiente per il mio compito, puoi leggere i dettagli in un altro articolo. Le “alcune” zone sopra menzionate differiscono da scheda a scheda, il che crea alcune difficoltà di installazione. Caricamento delle piattaforme server ARM cercando di standardizzare utilizzando UEFI, ma sebbene non sia disponibile per tutti, dovrai assemblare tutto separatamente.

Costruire il file system root

Per prima cosa devi preparare le sezioni. Das U-Boot supporta diversi file system, per cui ho scelto FAT32 /boot ed ext3 per root, questo è il layout dell'immagine standard per Kali su ARM. Utilizzerò GNU Parted, ma puoi fare lo stesso in un modo più familiare fdisk. Avrai anche bisogno di dosfstools и e2fsprogs per creare un file system: apt install parted dosfstools e2fsprogs.

Contrassegniamo la scheda SD:

  1. Contrassegna la scheda SD come se utilizzasse il partizionamento MBR: parted -s /dev/mmcblk0 mklabel msdos
  2. Crea una sezione sotto /boot per 128 megabyte: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Il primo megabyte mancato deve essere lasciato per il markup stesso e per il bootloader.
  3. Creiamo un file system root per l'intera capacità rimanente: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Se improvvisamente i file delle partizioni non sono stati creati o non sono stati modificati, è necessario eseguire `partprobe`, quindi la tabella delle partizioni verrà riletta.
  5. Crea un file system per la partizione di avvio con l'etichetta BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Crea un file system root con un'etichetta ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Ottimo, ora puoi compilarlo. Per questo avrai inoltre bisogno debootstrap, un'utilità per creare file system root per sistemi operativi simili a Debian: apt install debootstrap.

Raccogliamo FS:

  1. Montare la partizione /mnt/ (usa un punto di montaggio più conveniente): mount /dev/mmcblk0p2 /mnt
  2. In realtà riempiamo il file system: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali... Parametro --include indica di installare in aggiunta alcuni pacchetti, ho specificato un emulatore QEMU costruito staticamente. Ti permette di esibirti chroot nell'ambiente ARM. Il significato delle restanti opzioni è riportato in man debootstrap. Non dimenticare che non tutte le schede ARM supportano l'architettura armhf.
  3. A causa della differenza nell'architettura debootstrap viene eseguita in due fasi, la seconda viene eseguita in questo modo: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Ora devi rovinare tutto: chroot /mnt /bin/bash
  5. riempire /etc/hosts и /etc/hostname bersaglio FS. Compila lo stesso contenuto del tuo computer locale, ricorda solo di sostituire il nome host.
  6. Puoi personalizzare tutto il resto. In particolare, installo locales (chiavi del repository), riconfigurare le impostazioni locali e il fuso orario (dpkg-reconfigure locales tzdata). Non dimenticare di impostare la password con il comando passwd.
  7. Imposta una password per root Il gruppo passwd.
  8. La preparazione dell'immagine per me termina con il riempimento /etc/fstab interno /mnt/.

Caricherò in base ai tag creati in precedenza, quindi il contenuto sarà così:

ETICHETTA=ROOTFS / errori automatici=rimonta-ro 0 1
ETICHETTA=BOOT /boot automatico predefinito 0 0

Infine, puoi montare la partizione di avvio, ne avremo bisogno per il kernel: `mount /dev/mmcblk0p1 /mnt/boot/`

Compilazione di Linux

Per compilare il kernel (e quindi il bootloader) su Debian Testing, è necessario installare un set standard di file header GCC, GNU Make e GNU C Library per l'architettura di destinazione (per me armhf), nonché intestazioni OpenSSL e calcolatrice della console bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Poiché il caricatore predefinito cerca il file zImage sul file system della partizione di avvio, è ora di dividere l'unità flash.

  1. Ci vuole troppo tempo per clonare il kernel, quindi scaricherò semplicemente: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Scompattiamo e andiamo alla directory dei sorgenti: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Configura prima della compilazione: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. La configurazione si trova nella directory arch/arm/configs/. Se non ce n'è, puoi provare a trovarne e scaricarne uno già pronto e passare il nome del file in questa directory come parametro KBUILD_DEFCONFIG. Come ultima risorsa, passa immediatamente al punto successivo.
  3. Facoltativamente è possibile modificare le impostazioni: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. E compila in modo incrociato l'immagine: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Ora puoi copiare il file del kernel: cp arch/arm/boot/zImage /mnt/boot/
  6. E file da DeviceTree (descrizione dell'hardware sulla scheda): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. E installa i moduli raccolti sotto forma di file separati: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Il kernel è pronto. Puoi smontare tutto: umount /mnt/boot/ /mnt/

L'U-Boot

Poiché il bootloader è interattivo, tutto ciò che serve per testarne il funzionamento è la scheda stessa, un dispositivo di archiviazione e, facoltativamente, un dispositivo da USB a UART. Cioè, puoi posticipare il kernel e il sistema operativo per dopo.

La stragrande maggioranza dei produttori offre l'utilizzo di Das U-Boot per il primo avvio. Il pieno supporto viene solitamente fornito nel proprio fork, ma non dimenticano di contribuire all’upstream. Nel mio caso, la scheda è supportata linea principaleCosì forchetta L'ho ignorato.

Assembliamo il bootloader stesso:

  1. Cloniamo il ramo stabile del repository: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Andiamo alla directory stessa: cd u-boot
  3. Preparazione della configurazione della build: make mx6ull_14x14_evk_defconfig. Funziona solo se la configurazione è nello stesso Das U-Boot, altrimenti dovrai trovare la configurazione del produttore e inserirla nella radice del repository in un file .configo assemblare in qualsiasi altro modo consigliato dal produttore.
  4. Assembliamo l'immagine del bootloader stessa utilizzando un compilatore incrociato armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Di conseguenza otteniamo il file u-boot.imx, questa è un'immagine già pronta che può essere scritta su un'unità flash. Scriviamo sulla scheda SD, saltando i primi 1024 byte. Perché ho scelto Target u-boot.imx? Perché ho perso esattamente 1024 byte? Questo è ciò che propongono di fare documentazione. Per altre schede, il processo di creazione e registrazione delle immagini potrebbe essere leggermente diverso.

Fatto, puoi avviare. Il bootloader deve riportare la propria versione, alcune informazioni sulla scheda e provare a trovare l'immagine del kernel sulla partizione. In caso di insuccesso, tenterà l'avvio tramite la rete. In generale, l'output è abbastanza dettagliato, puoi trovare l'errore se c'è un problema.

Invece di una conclusione

Sapevi che la fronte del delfino non è ossea? È letteralmente un terzo occhio, una lente grassa per l'ecolocalizzazione!

Avvio di GNU/Linux su una scheda ARM da zero (usando Kali e iMX.6 come esempio)

Avvio di GNU/Linux su una scheda ARM da zero (usando Kali e iMX.6 come esempio)

Fonte: habr.com