tl; dr: Sto costruendo un'immagine Kali Linux per un computer ARM, nel programma debootstrap
, linux
и u-boot
.
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
Il processo di download è abbastanza semplice:
- L'hardware è inizializzato.
- Da qualche area del dispositivo di archiviazione (scheda SD/eMMC/ecc.) il bootloader viene letto ed eseguito.
- Il bootloader cerca il kernel del sistema operativo, lo carica in un'area di memoria e lo esegue.
- Il kernel carica il resto del sistema operativo.
Questo livello di dettaglio è sufficiente per il mio compito, puoi leggere i dettagli
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:
- Contrassegna la scheda SD come se utilizzasse il partizionamento MBR:
parted -s /dev/mmcblk0 mklabel msdos
- 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. - Creiamo un file system root per l'intera capacità rimanente:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
- 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.
- Crea un file system per la partizione di avvio con l'etichetta
BOOT
:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
- 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:
- Montare la partizione
/mnt/
(usa un punto di montaggio più conveniente):mount /dev/mmcblk0p2 /mnt
- 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 esibirtichroot
nell'ambiente ARM. Il significato delle restanti opzioni è riportato inman debootstrap
. Non dimenticare che non tutte le schede ARM supportano l'architetturaarmhf
. - 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
- Ora devi rovinare tutto:
chroot /mnt /bin/bash
- riempire
/etc/hosts
и/etc/hostname
bersaglio FS. Compila lo stesso contenuto del tuo computer locale, ricorda solo di sostituire il nome host. - 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 comandopasswd
. - Imposta una password per
root
Il gruppopasswd
. - 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.
- 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
- Configura prima della compilazione:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig
. La configurazione si trova nella directoryarch/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 parametroKBUILD_DEFCONFIG
. Come ultima risorsa, passa immediatamente al punto successivo. - Facoltativamente è possibile modificare le impostazioni:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- E compila in modo incrociato l'immagine:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
- Ora puoi copiare il file del kernel:
cp arch/arm/boot/zImage /mnt/boot/
- E file da DeviceTree (descrizione dell'hardware sulla scheda):
cp arch/arm/boot/dts/*.dtb /mnt/boot/
- 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
Assembliamo il bootloader stesso:
- Cloniamo il ramo stabile del repository:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
- Andiamo alla directory stessa:
cd u-boot
- 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.config
o assemblare in qualsiasi altro modo consigliato dal produttore. - 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
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!
Fonte: habr.com