GNU/Linux vanaf nul starten op een ARM-bord (met Kali en iMX.6 als voorbeeld)

tl; Dr.: Ik bouw een Kali Linux-image voor een ARM-computer in het programma debootstrap, linux и u-boot.

GNU/Linux vanaf nul starten op een ARM-bord (met Kali en iMX.6 als voorbeeld)

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 geplande Flipper One. Er is simpelweg geen Kali Linux voor IMX6 (ik ben bezig met de voorbereidingen), dus ik moet het zelf in elkaar zetten.

Het downloadproces is vrij eenvoudig:

  1. De hardware wordt geïnitialiseerd.
  2. Vanaf een bepaald gebied op het opslagapparaat (SD-kaart/eMMC/etc) wordt de bootloader gelezen en uitgevoerd.
  3. De bootloader zoekt naar de kernel van het besturingssysteem, laadt deze in een geheugengebied en voert deze uit.
  4. De kernel laadt de rest van het besturingssysteem.

Dit detailniveau is voldoende voor mijn taak, je kunt de details lezen in een ander artikel. De hierboven genoemde “sommige” gebieden verschillen van bord tot bord, wat voor enkele installatieproblemen zorgt. ARM-serverplatforms laden proberen te standaardiseren via UEFI, maar hoewel dit niet voor iedereen beschikbaar is, zul je alles apart in elkaar moeten zetten.

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:

  1. Markeer de SD-kaart als MBR-partitionering: parted -s /dev/mmcblk0 mklabel msdos
  2. 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.
  3. We creëren een rootbestandssysteem voor de volledige resterende capaciteit: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Als plotseling uw partitiebestanden niet zijn aangemaakt of niet zijn gewijzigd, moet u `partprobe` uitvoeren, waarna de partitietabel opnieuw zal worden gelezen.
  5. Maak een bestandssysteem voor de opstartpartitie met het label BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. 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:

  1. Monteer de scheidingswand erin /mnt/ (gebruik een handiger bevestigingspunt): mount /dev/mmcblk0p2 /mnt
  2. 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 presteren chroot in de ARM-omgeving. De betekenis van de overige opties vindt u in man debootstrap. Vergeet niet dat niet elk ARM-bord de architectuur ondersteunt armhf.
  3. Vanwege het verschil in architectuur debootstrap wordt in twee fasen uitgevoerd, de tweede wordt als volgt uitgevoerd: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Nu moet je het verpesten: chroot /mnt /bin/bash
  5. Vullen /etc/hosts и /etc/hostname doel FS. Vul hetzelfde in als de inhoud op uw lokale computer, vergeet alleen niet de hostnaam te vervangen.
  6. 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 commando passwd.
  7. Stel een wachtwoord in voor root team passwd.
  8. 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.

  1. 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
  2. Configureer vóór compilatie: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. De configuratie bevindt zich in de directory arch/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 doorgeven KBUILD_DEFCONFIG. Ga als laatste redmiddel onmiddellijk door naar het volgende punt.
  3. Optioneel kunt u de instellingen aanpassen: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. En compileer de afbeelding: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Nu kunt u het kernelbestand kopiëren: cp arch/arm/boot/zImage /mnt/boot/
  6. En bestanden van DeviceTree (beschrijving van de hardware op het bord): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. 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 hoofdlijndat is waarom vork Ik negeerde het.

Laten we de bootloader zelf samenstellen:

  1. We klonen de stabiele tak van de repository: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Laten we naar de map zelf gaan: cd u-boot
  3. 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 .configof op een andere door de fabrikant aanbevolen manier monteren.
  4. 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 documentatie. Voor andere borden kan het beeldopbouw- en opnameproces enigszins afwijken.

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!

GNU/Linux vanaf nul starten op een ARM-bord (met Kali en iMX.6 als voorbeeld)

GNU/Linux vanaf nul starten op een ARM-bord (met Kali en iMX.6 als voorbeeld)

Bron: www.habr.com