tl; Dr.: Ik bouw een Kali Linux-image voor een ARM-computer in het programma debootstrap
, linux
и u-boot
.
Als u niet erg populaire single-board-software hebt gekocht, wordt u mogelijk geconfronteerd met het ontbreken van een afbeelding van uw favoriete distributie ervoor. Ongeveer hetzelfde gebeurde met
Het downloadproces is vrij eenvoudig:
- De hardware wordt geïnitialiseerd.
- Vanaf een bepaald gebied op het opslagapparaat (SD-kaart/eMMC/etc) wordt de bootloader gelezen en uitgevoerd.
- De bootloader zoekt naar de kernel van het besturingssysteem, laadt deze in een geheugengebied en voert deze uit.
- De kernel laadt de rest van het besturingssysteem.
Dit detailniveau is voldoende voor mijn taak, je kunt de details lezen
Het rootbestandssysteem bouwen
Eerst moet je de secties voorbereiden. Das U-Boot ondersteunt verschillende bestandssystemen, ik heb voor FAT32 gekozen /boot
en ext3 voor root, dit is de standaard afbeeldingsindeling voor Kali op ARM. Ik gebruik GNU Parted, maar je kunt hetzelfde op een meer vertrouwde manier doen fdisk
. Je hebt ook nodig dosfstools
и e2fsprogs
een bestandssysteem maken: apt install parted dosfstools e2fsprogs
.
We markeren de SD-kaart:
- Markeer de SD-kaart als MBR-partitionering:
parted -s /dev/mmcblk0 mklabel msdos
- Maak een sectie onder
/boot
voor 128 megabytes:parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB
. De eerste gemiste megabyte moet worden gereserveerd voor de markup zelf en voor de bootloader. - We creëren een rootbestandssysteem voor de volledige resterende capaciteit:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
- Als plotseling uw partitiebestanden niet zijn aangemaakt of niet zijn gewijzigd, moet u `partprobe` uitvoeren, waarna de partitietabel opnieuw zal worden gelezen.
- Maak een bestandssysteem voor de opstartpartitie met het label
BOOT
:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
- Maak een rootbestandssysteem met een label
ROOTFS
:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2
Mooi, nu kun je het invullen. Hiervoor heb je extra nodig debootstrap
, een hulpprogramma voor het maken van rootbestandssystemen voor Debian-achtige besturingssystemen: apt install debootstrap
.
Wij verzamelen FS:
- Monteer de scheidingswand erin
/mnt/
(gebruik een handiger bevestigingspunt):mount /dev/mmcblk0p2 /mnt
- We vullen feitelijk het bestandssysteem:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali
. Parameter--include
geeft aan om extra pakketten te installeren, heb ik een statisch gebouwde QEMU-emulator gespecificeerd. Het zorgt ervoor dat je kunt presterenchroot
in de ARM-omgeving. De betekenis van de overige opties vindt u inman debootstrap
. Vergeet niet dat niet elk ARM-bord de architectuur ondersteuntarmhf
. - Vanwege het verschil in architectuur
debootstrap
wordt in twee fasen uitgevoerd, de tweede wordt als volgt uitgevoerd:chroot /mnt/ /debootstrap/debootstrap --second-stage
- Nu moet je het verpesten:
chroot /mnt /bin/bash
- Vullen
/etc/hosts
и/etc/hostname
doel FS. Vul hetzelfde in als de inhoud op uw lokale computer, vergeet alleen niet de hostnaam te vervangen. - Al het andere kun je aanpassen. Ik installeer vooral
locales
(repositorysleutels), configureer de landinstellingen en tijdzone opnieuw (dpkg-reconfigure locales tzdata
). Vergeet niet het wachtwoord in te stellen met het commandopasswd
. - Stel een wachtwoord in voor
root
teampasswd
. - De voorbereiding van het beeld voor mij eindigt met het vullen
/etc/fstab
внутри/mnt/
.
Ik zal uploaden in overeenstemming met de eerder gemaakte tags, dus de inhoud zal er als volgt uitzien:
LABEL=ROOTFS / automatische fouten=opnieuw koppelen-ro 0 1
LABEL=BOOT /boot automatische standaardwaarden 0 0
Ten slotte kun je de opstartpartitie mounten, deze hebben we nodig voor de kernel: `mount /dev/mmcblk0p1 /mnt/boot/`
Linux-build
Om de kernel (en vervolgens de bootloader) op Debian Testing te bouwen, moet je een standaardset GCC-, GNU Make- en GNU C Library-headerbestanden installeren voor de doelarchitectuur (voor mij armhf
), evenals OpenSSL-headers, consolecalculator bc
, bison
и flex
: apt install crossbuild-essential-armhf bison flex libssl-dev bc
. Omdat de standaardlader naar het bestand zoekt zImage
op het bestandssysteem van de opstartpartitie is het tijd om de flashdrive te splitsen.
- Het duurt te lang om de kernel te klonen, dus ik download gewoon:
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
. Laten we het uitpakken en naar de bronmap gaan:tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
- Configureer vóór compilatie:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig
. De configuratie bevindt zich in de directoryarch/arm/configs/
. Als die er niet is, kunt u proberen een kant-en-klaar exemplaar te vinden en te downloaden en de naam van het bestand in deze map als parameter doorgevenKBUILD_DEFCONFIG
. Ga als laatste redmiddel onmiddellijk door naar het volgende punt. - Optioneel kunt u de instellingen aanpassen:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- En compileer de afbeelding:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
- Nu kunt u het kernelbestand kopiëren:
cp arch/arm/boot/zImage /mnt/boot/
- En bestanden van DeviceTree (beschrijving van de hardware op het bord):
cp arch/arm/boot/dts/*.dtb /mnt/boot/
- En installeer de verzamelde modules in de vorm van afzonderlijke bestanden:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install
De kernel is klaar. Je kunt alles ontkoppelen: umount /mnt/boot/ /mnt/
Das U-Boot
Omdat de bootloader interactief is, heb je alleen het bord zelf, een opslagapparaat en optioneel een USB-naar-UART-apparaat nodig om de werking ervan te testen. Dat wil zeggen dat u de kernel en het besturingssysteem voor later kunt uitstellen.
De overgrote meerderheid van de fabrikanten biedt aan om Das U-Boot te gebruiken voor de eerste keer opstarten. Volledige ondersteuning wordt meestal geboden in hun eigen vork, maar ze vergeten niet een bijdrage te leveren aan de upstream. In mijn geval wordt het bord ondersteund
Laten we de bootloader zelf samenstellen:
- We klonen de stabiele tak van de repository:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
- Laten we naar de map zelf gaan:
cd u-boot
- De build-configuratie voorbereiden:
make mx6ull_14x14_evk_defconfig
. Dit werkt alleen als de configuratie in Das U-Boot zelf staat, anders moet je de configuratie van de fabrikant vinden en deze in de root van de repository in een bestand plaatsen.config
of op een andere door de fabrikant aanbevolen manier monteren. - We stellen de bootloader-image zelf samen met behulp van een cross-compiler
armhf
:make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx
Als resultaat krijgen we het bestand u-boot.imx
, dit is een kant-en-klare afbeelding die naar een flashstation kan worden geschreven. We schrijven naar de SD-kaart en slaan de eerste 1024 bytes over. Waarom heb ik voor Target gekozen? u-boot.imx
? Waarom heb ik precies 1024 bytes gemist? Dit is wat ze voorstellen om te doen
Klaar, je kunt opstarten. De bootloader moet zijn eigen versie rapporteren, wat informatie over het bord, en proberen de kernelimage op de partitie te vinden. Als dit niet lukt, zal het proberen via het netwerk op te starten. Over het algemeen is de uitvoer behoorlijk gedetailleerd, u kunt de fout vinden als er een probleem is.
In plaats Output
Wist je dat het voorhoofd van een dolfijn niet benig is? Het is letterlijk een derde oog, een vette lens voor echolocatie!
Bron: www.habr.com