Avviare GNU/Linux su una scheda ARM da zero (prendendo come esempio Kali e iMX.6)

tl;dr: creo un’immagine di Kali Linux per un computer ARM, usando debootstrap, linux e u-boot.

Avviare GNU/Linux su una scheda ARM da zero (prendendo come esempio Kali e iMX.6)

Se hai acquistato una scheda single-board non molto popolare, potresti aver riscontrato l'assenza di un'immagine del tuo distro preferito. È più o meno lo stesso problema che si è presentato con il Flipper One pianificato. Kali Linux per IMX6 semplicemente non esiste (sto preparando), quindi bisogna compilarlo da soli.

Il processo di avvio è abbastanza semplice:

  1. L'hardware viene inizializzato.
  2. Da alcune aree del dispositivo di memorizzazione (scheda SD/eMMC/etc) vengono letti ed eseguiti il bootloader.
  3. Il bootloader cerca il kernel del sistema operativo e lo carica in un’area di memoria per eseguirlo.
  4. Il kernel carica il resto del sistema operativo.

Per il mio lavoro, questo livello di dettaglio è sufficiente; puoi leggere ulteriori dettagli in un altro articolo. Le suddette “alcune” aree variano da scheda a scheda, e ciò crea alcune complessità con l'installazione. L'avvio delle piattaforme ARM server si cerca di standardizzarlo attraverso UEFI, ma finché ciò non è accessibile a tutti, dovremo assemblare tutto separatamente.

Assemblaggio del file system radice

Per iniziare, è necessario preparare le partizioni. Das U-Boot supporta diversi FS, ho scelto FAT32 per /boot e ext3 per la radice, questa è la normale partizione delle immagini per Kali su ARM. Userò GNU Parted, ma puoi fare la stessa cosa con un software più familiare. fdisk. Saranno necessari anche dosfstools e e2fsprogs per creare il FS: apt install parted dosfstools e2fsprogs.

Partizioniamo la scheda SD:

  1. Impostiamo la scheda SD per utilizzare la partizione MBR: parted -s /dev/mmcblk0 mklabel msdos
  2. Creiamo una partizione di /boot 128 megabyte: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Il primo megabyte deve essere lasciato per la partizione stessa e per il bootloader.
  3. Creiamo il FS radice per l'intera capacità rimanente: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Se per caso non sono stati creati o modificati i file delle partizioni, eseguire `partprobe`, quindi la tabella delle partizioni verrà ri-letta.
  5. Creiamo il filesystem della partizione di avvio con etichetta BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Creiamo il filesystem radice con etichetta ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Ottimo, ora possiamo riempirla. Per questo, avremo bisogno di debootstrap, un'utilità per creare filesystem radici nei sistemi operativi basati su Debian: apt install debootstrap.

Costruiamo il FS:

  1. Montiamo la partizione in /mnt/ (usa un punto di montaggio più comodo per te): mount /dev/mmcblk0p2 /mnt
  2. Iniziamo a riempire il filesystem: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Il parametro --include indica di installare pacchetti aggiuntivi, ho specificato l'emulatore QEMU compilato staticamente. Questo consente di eseguire chroot in un ambiente ARM. Il significato delle altre opzioni può essere trovato in man debootstrap. Ricorda che non tutte le schede ARM supportano l'architettura armhf.
  3. A causa delle differenze architetturali debootstrap si esegue in due fasi, la seconda si esegue così: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Ora dobbiamo fare chroot: chroot /mnt /bin/bash
  5. Riempire /etc/hosts e /etc/hostname il FS di destinazione. Compila analogamente ai contenuti sul tuo computer locale, non dimenticare solo di sostituire il nome host.
  6. Puoi configurare tutto il resto. In particolare, installo anche locales (chiavi del repository), riconfiguro le località e il fuso orario (dpkg-reconfigure locales tzdata). Non dimenticare di impostare la password con il comando passwd.
  7. Impostiamo la password per root comando passwd.
  8. La preparazione dell'immagine per me si conclude con la compilazione /etc/fstab all'interno /mnt/.

Caricherò in conformità con le etichette create in precedenza, quindi il contenuto sarà così:

LABEL=ROOTFS / auto errors=remount-ro 0 1
LABEL=BOOT /boot auto defaults 0 0

Infine, è possibile montare la partizione di avvio, che ci servirà per il kernel: `mount /dev/mmcblk0p1 /mnt/boot/`

Costruzione di Linux

Per costruire il kernel (e successivamente il bootloader) su Debian Testing è necessario installare il pacchetto standard di GCC, GNU Make e i file di intestazione di GNU C Library per l'architettura target (nel mio caso armhf), oltre ai file di intestazione OpenSSL, calcolatrice da console bc, bison e flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Poiché il bootloader di default cerca il file zImage nella filesystem della partizione di avvio, è tempo di partizionare la chiavetta USB.

  1. Clonare il kernel richiede troppo tempo, quindi lo scarico semplicemente: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Decomprimiamo e veniamo nella directory con i sorgenti: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Configuriamo prima della compilazione: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. La configurazione si trova nella directory arch/arm/configs/. Se non c'è, puoi provare a trovarne una già pronta e passare il nome del file in questa directory come parametro KBUILD_DEFCONFIG. In caso estremo, passa direttamente al punto successivo.
  3. Facoltativamente, puoi modificare le impostazioni: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. E cross-compiliamo l'immagine: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Ora puoi copiare il file con il kernel: cp arch/arm/boot/zImage /mnt/boot/
  6. E i file con il DeviceTree (descrizione dell'hardware presente sulla scheda): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. E installare i moduli compilati come 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/

Das U-Boot

Poiché il bootloader è interattivo, per verificarne il funzionamento è sufficiente la scheda, il dispositivo di memorizzazione e, opzionalmente, un dispositivo USB-to-UART. Quindi, puoi posticipare il kernel e il sistema operativo.

La stragrande maggioranza dei produttori propone di utilizzare Das U-Boot per il boot iniziale. Di solito, il supporto completo è fornito nel proprio fork, ma non si dimenticano di contribuire anche al main. mainline, quindi fork ho ignorato.

Compiliamo il bootloader:

  1. Cloniamo il branch stabile del repository: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Passiamo alla directory: cd u-boot
  3. Prepariamo la configurazione di compilazione: make mx6ull_14x14_evk_defconfig. Funziona solo se la configurazione è presente in Das U-Boot stesso; in caso contrario, dovrai trovare la configurazione del produttore e metterla nella root del repository nel file .config, oppure creare un'immagine consigliata da un altro produttore.
  4. Creiamo noi stessi l'immagine del bootloader con un cross-compiler armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Di conseguenza otteniamo il file u-boot.imx, è un'immagine pronta da scrivere su una chiavetta USB. Scriviamo sulla scheda SD, saltando i primi 1024 byte. Perché ho scelto il target u-boot.imx? Почему пропустил именно 1024 байта? Так предлагают сделать в documentazione. Per altre schede, il processo di costruzione dell'immagine e di scrittura può variare leggermente.

Fatto, possiamo avviarci. Il bootloader dovrebbe riportare la sua versione, alcune informazioni sulla scheda e tentare di trovare l'immagine del kernel nella partizione. In caso di fallimento, proverà a avviarsi dalla rete. In generale, l'output è piuttosto dettagliato, è possibile trovare un errore in caso di problemi.

In conclusion

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

Avviare GNU/Linux su una scheda ARM da zero (prendendo come esempio Kali e iMX.6)

Avviare GNU/Linux su una scheda ARM da zero (prendendo come esempio Kali e iMX.6)

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster