tl;dr: creo un’immagine di Kali Linux per un computer ARM, usando debootstrap, linux e u-boot.
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 . Kali Linux per IMX6 semplicemente non esiste (sto preparando), quindi bisogna compilarlo da soli.
Il processo di avvio è abbastanza semplice:
- L'hardware viene inizializzato.
- Da alcune aree del dispositivo di memorizzazione (scheda SD/eMMC/etc) vengono letti ed eseguiti il bootloader.
- Il bootloader cerca il kernel del sistema operativo e lo carica in un’area di memoria per eseguirlo.
- Il kernel carica il resto del sistema operativo.
Per il mio lavoro, questo livello di dettaglio è sufficiente; puoi leggere ulteriori dettagli . Le suddette “alcune” aree variano da scheda a scheda, e ciò crea alcune complessità con l'installazione. L'avvio delle piattaforme ARM server 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:
- Impostiamo la scheda SD per utilizzare la partizione MBR:
parted -s /dev/mmcblk0 mklabel msdos - Creiamo una partizione di
/boot128 megabyte:parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Il primo megabyte deve essere lasciato per la partizione stessa e per il bootloader. - Creiamo il FS radice per l'intera capacità rimanente:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100% - Se per caso non sono stati creati o modificati i file delle partizioni, eseguire `partprobe`, quindi la tabella delle partizioni verrà ri-letta.
- Creiamo il filesystem della partizione di avvio con etichetta
BOOT:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1 - 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:
- Montiamo la partizione in
/mnt/(usa un punto di montaggio più comodo per te):mount /dev/mmcblk0p2 /mnt - Iniziamo a riempire il filesystem:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Il parametro--includeindica di installare pacchetti aggiuntivi, ho specificato l'emulatore QEMU compilato staticamente. Questo consente di eseguirechrootin un ambiente ARM. Il significato delle altre opzioni può essere trovato inman debootstrap. Ricorda che non tutte le schede ARM supportano l'architetturaarmhf. - A causa delle differenze architetturali
debootstrapsi esegue in due fasi, la seconda si esegue così:chroot /mnt/ /debootstrap/debootstrap --second-stage - Ora dobbiamo fare chroot:
chroot /mnt /bin/bash - Riempire
/etc/hostse/etc/hostnameil FS di destinazione. Compila analogamente ai contenuti sul tuo computer locale, non dimenticare solo di sostituire il nome host. - 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 comandopasswd. - Impostiamo la password per
rootcomandopasswd. - La preparazione dell'immagine per me si conclude con la compilazione
/etc/fstaball'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.
- 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 - Configuriamo prima della compilazione:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. La configurazione si trova nella directoryarch/arm/configs/. Se non c'è, puoi provare a trovarne una già pronta e passare il nome del file in questa directory come parametroKBUILD_DEFCONFIG. In caso estremo, passa direttamente al punto successivo. - Facoltativamente, puoi modificare le impostazioni:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig - E cross-compiliamo l'immagine:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- - Ora puoi copiare il file con il kernel:
cp arch/arm/boot/zImage /mnt/boot/ - E i file con il DeviceTree (descrizione dell'hardware presente sulla scheda):
cp arch/arm/boot/dts/*.dtb /mnt/boot/ - 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. , quindi ho ignorato.
Compiliamo il bootloader:
- Cloniamo il branch stabile del repository:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10 - Passiamo alla directory:
cd u-boot - 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. - 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 байта? Так предлагают сделать в . 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!
Fonte: habr.com
