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

tl;dr: ik ben een Kali Linux-image aan het bouwen voor een ARM-computer, in het programma debootstrap, linux en u-boot.

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

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 de geplande Flipper One. 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:

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

Voor mijn taak is dit niveau van detail voldoende, details kun je lezen in een ander artikel. 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 worden geprobeerd te standaardiseren 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:

  1. We markeren de SD-kaart als gebruikmakend van een MBR-partitionering: parted -s /dev/mmcblk0 mklabel msdos
  2. We creëren een partitie voor /boot van 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.
  3. We creëren het root FS voor de rest van de capaciteit: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Als je per ongeluk geen partitiebestanden hebt gemaakt of gewijzigd, voer dan `partprobe` uit, dan wordt de partitionering opnieuw gelezen.
  5. We creëren het bestandssysteem voor de bootpartitie met de label BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. 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:

  1. We monteren de partitie in /mnt/ (gebruik een voor jou gemakkelijker mountpunt): mount /dev/mmcblk0p2 /mnt
  2. Laten we het bestandssysteem invullen: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. De parameter --include geeft aan om extra pakketten te installeren. Ik heb de statisch gecompileerde QEMU-emulator opgegeven. Deze maakt het mogelijk om chroot in een ARM-omgeving te werken. De betekenis van de andere opties kan worden bekeken in man debootstrap. Vergeet niet dat niet elke ARM-bord de architecture ondersteunt armhf.
  3. Vanwege de verschillen in architecture debootstrap wordt het in twee fasen uitgevoerd, de tweede fase gaat als volgt: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Nu moeten we chrooten: chroot /mnt /bin/bash
  5. We vullen /etc/hosts en /etc/hostname doelbesturingsysteem. Vul het aan volgens de inhoud op jouw lokale computer, vergeet niet om de hostnaam te vervangen.
  6. 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 commando passwd.
  7. Stel een wachtwoord in voor root met het commando passwd.
  8. De voorbereiding van de afbeelding eindigt voor mij met het invullen van /etc/fstab binnenin /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.

  1. 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
  2. Laten we configureren voordat we compileren: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. De configuratie bevindt zich in de directory arch/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 parameter KBUILD_DEFCONFIG. In het uiterste geval ga je direct naar het volgende punt.
  3. Optioneel kun je de instellingen verder aanpassen: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. En laten we de afbeelding cross-compileren: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Nu kunnen we het bestand met de kernel kopiëren: cp arch/arm/boot/zImage /mnt/boot/
  6. En bestanden met DeviceTree (beschrijving van de beschikbare hardware op het bord): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. 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 mainline, daarom fork negeerde ik het.

We bouwen de bootloader:

  1. We klonen de stabiele tak van de repository: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. We gaan naar de directory: cd u-boot
  3. 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.
  4. 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 байта? Так предлагают сделать в de documentatie. 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!

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

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

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster