tl;dr: ik ben een Kali Linux-image aan het bouwen voor een ARM-computer, in het programma debootstrap, linux en u-boot.
Als je een minder populaire single-board computer hebt gekocht, kan het zijn dat je geen image van je favoriete distributie kunt vinden. Ongeveer hetzelfde is gebeurd met . Kali Linux voor IMX6 is er gewoon niet (ik ben het aan het voorbereiden), dus moet ik het zelf assembleren.
Het opstartproces is vrij eenvoudig:
- De hardware wordt geïnitialiseerd.
- Uit een bepaald gebied op het opslagapparaat (SD-kaart/eMMC/etc.) wordt de bootloader gelezen en uitgevoerd.
- De bootloader zoekt de kernel van het besturingssysteem en laadt deze in een bepaald geheugen en voert deze uit.
- De kernel laadt de rest van het besturingssysteem.
Voor mijn taak is dit niveau van detail voldoende, details kun je lezen . De hierboven genoemde "bepaalde" gebieden verschillen van bord tot bord, wat bepaalde complicaties bij de installatie met zich meebrengt. De opstartprocessen van server-ARM-platforms met behulp van UEFI, maar zolang dit niet beschikbaar is voor iedereen, moet alles afzonderlijk worden samengesteld.
De opbouw van het root-bestandssysteem
Eerst moeten de partities worden voorbereid. Das U-Boot ondersteunt verschillende FS, ik koos FAT32 voor /boot en ext3 voor de root, dit is de standaardindeling van images voor Kali op ARM. Ik zal GNU Parted gebruiken, maar je kunt hetzelfde doen met een meer vertrouwde fdisk. Ook heb je dosfstools en e2fsprogs nodig voor het maken van FS: apt install parted dosfstools e2fsprogs.
We partitioneren de SD-kaart:
- We markeren de SD-kaart als gebruikmakend van een MBR-partitionering:
parted -s /dev/mmcblk0 mklabel msdos - We creëren een partitie voor
/bootvan 128 megabyte:parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. De eerste gemiste megabyte moet worden gereserveerd voor de eigen partitionering en voor de bootloader. - We creëren het root FS voor de rest van de capaciteit:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100% - Als je per ongeluk geen partitiebestanden hebt gemaakt of gewijzigd, voer dan `partprobe` uit, dan wordt de partitionering opnieuw gelezen.
- We creëren het bestandssysteem voor de bootpartitie met de label
BOOT:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1 - We creëren het root FS met de label
ROOTFS:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2
Geweldig, nu kunnen we het vullen. Hiervoor is bovendien debootstrap, een programma voor het maken van root FS voor Debian-achtige besturingssystemen: apt install debootstrap.
We assembleren het FS:
- We monteren de partitie in
/mnt/(gebruik een voor jou gemakkelijker mountpunt):mount /dev/mmcblk0p2 /mnt - Laten we het bestandssysteem invullen:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. De parameter--includegeeft aan om extra pakketten te installeren. Ik heb de statisch gecompileerde QEMU-emulator opgegeven. Deze maakt het mogelijk omchrootin een ARM-omgeving te werken. De betekenis van de andere opties kan worden bekeken inman debootstrap. Vergeet niet dat niet elke ARM-bord de architecture ondersteuntarmhf. - Vanwege de verschillen in architecture
debootstrapwordt het in twee fasen uitgevoerd, de tweede fase gaat als volgt:chroot /mnt/ /debootstrap/debootstrap --second-stage - Nu moeten we chrooten:
chroot /mnt /bin/bash - We vullen
/etc/hostsen/etc/hostnamedoelbesturingsysteem. Vul het aan volgens de inhoud op jouw lokale computer, vergeet niet om de hostnaam te vervangen. - Daarnaast kunnen we alles verder configureren. In het bijzonder installeer ik
locales(repository sleutels), herconfigureer ik locales en tijdzone (dpkg-reconfigure locales tzdata). Vergeet niet om een wachtwoord in te stellen met het commandopasswd. - Stel een wachtwoord in voor
rootmet het commandopasswd. - De voorbereiding van de afbeelding eindigt voor mij met het invullen van
/etc/fstabbinnenin/mnt/.
Ik zal laden volgens de eerder gemaakte labels, dus de inhoud zal als volgt zijn:
LABEL=ROOTFS / auto errors=remount-ro 0 1
LABEL=BOOT /boot auto defaults 0 0
Ten slotte kunnen we de opstartpartitie mounten, die hebben we nodig voor de kernel: `mount /dev/mmcblk0p1 /mnt/boot/`
Linux build
Om de kernel (en later de bootloader) op Debian Testing te bouwen, moet je de standaardset van GCC, GNU Make en de headerbestanden van de GNU C Library voor de doelarchitectuur installeren (ik heb armhf), evenals de OpenSSL headers, een consolecalculator bc, bison en flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Aangezien de bootloader standaard het bestand zImage in het bestandssysteem van de opstartpartitie zoekt, is het tijd om de stick te partitioneren.
- De kernel klonen duurt te lang, dus ik download hem gewoon:
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Laten we uitpakken en naar de directory met de bronbestanden gaan:tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1 - Laten we configureren voordat we compileren:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. De configuratie bevindt zich in de directoryarch/arm/configs/. Als deze niet bestaat, kun je proberen een kant-en-klare te vinden en de bestandsnaam in deze directory door te geven aan de parameterKBUILD_DEFCONFIG. In het uiterste geval ga je direct naar het volgende punt. - Optioneel kun je de instellingen verder aanpassen:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig - En laten we de afbeelding cross-compileren:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- - Nu kunnen we het bestand met de kernel kopiëren:
cp arch/arm/boot/zImage /mnt/boot/ - En bestanden met DeviceTree (beschrijving van de beschikbare hardware op het bord):
cp arch/arm/boot/dts/*.dtb /mnt/boot/ - En installeer de verzamelde modules als aparte 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
Aangezien de bootloader interactief is, is de enige vereiste voor de controle van de werking het bord, het opslagmedium en optioneel een USB-to-UART apparaat. Dat wil zeggen, je kunt de kernel en OS voor later bewaren.
De overgrote meerderheid van de fabrikanten biedt het gebruik van Das U-Boot voor de primaire opstart aan. Volledige ondersteuning wordt meestal geboden in hun eigen fork, maar ook upstream vergeten ze niet te bijdragen. In mijn geval wordt het bord ondersteund in , daarom negeerde ik het.
We bouwen de bootloader:
- We klonen de stabiele tak van de repository:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10 - We gaan naar de directory:
cd u-boot - We bereiden de buildconfiguratie voor:
make mx6ull_14x14_evk_defconfig. Dit werkt alleen als de configuratie bestaat in Das U-Boot zelf, anders moet je de configuratie van de fabrikant vinden en deze in de root van de repository in het bestand plaatsen.config, of bouw het op een andere door de fabrikant aanbevolen manier. - We bouwen de image van de bootloader met de 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 image die naar een USB-stick kan worden geschreven. Schrijf naar de SD-kaart, waarbij de eerste 1024 bytes worden overgeslagen. Waarom heb ik de target gekozen u-boot.imx? Почему пропустил именно 1024 байта? Так предлагают сделать в . Voor andere borden kan het bouwproces van de image en het schrijven iets verschillen.
Klaar, je kunt opstarten. De bootloader moet zijn eigen versie melden, wat informatie over het bord geven en proberen de kernel image op de partitie te vinden. Bij mislukking zal hij proberen op te starten via het netwerk. Over het algemeen is de output behoorlijk gedetailleerd, je kunt fouten vinden in geval van problemen.
Ter afsluiting
Wist je dat het voorhoofd van een dolfijn niet botachtig is? Het is letterlijk een derde oog, een vetlens voor echolocatie!
Bron: habr.com
