Start af GNU/Linux på et ARM-kort fra bunden (ved brug af Kali og iMX.6 som eksempel)

tl; dr: Jeg bygger et Kali Linux-image til en ARM-computer i programmet debootstrap, linux и u-boot.

Start af GNU/Linux på et ARM-kort fra bunden (ved brug af Kali og iMX.6 som eksempel)

Hvis du har købt en ikke særlig populær enkeltbetaler, kan du støde på manglen på et billede af dit foretrukne distributionssæt til det. Der skete stort set det samme planlagte Flipper One. Der er simpelthen ikke noget Kali Linux til IMX6 (jeg laver mad), så jeg skal selv samle det.

Downloadprocessen er ret enkel:

  1. Hardware er initialiseret.
  2. Fra et eller andet område på lagerenheden (SD-kort/eMMC/etc) læses og udføres bootloaderen.
  3. Indlæseren leder efter kernen i operativsystemet og indlæser den i et eller andet hukommelsesområde og udfører den.
  4. Kernen indlæser resten af ​​OS.

Til min opgave er dette detaljeringsniveau nok, du kan læse detaljerne i en anden artikel. De "nogle" områder, der er nævnt ovenfor, er forskellige fra bræt til bræt, hvilket skaber nogle installationsbesvær. Indlæser server ARM-platforme forsøger at standardisere bruger UEFI, men så længe det ikke er tilgængeligt for alle, bliver du nødt til at samle alt separat.

Opbygning af rodfilsystemet

Først skal du forberede sektioner. Das U-Boot understøtter forskellige filsystemer, jeg valgte FAT32 til /boot og ext3 for root, dette er standardbilledmarkeringen for Kali under ARM. Jeg vil bruge GNU Parted, men du kan gøre det samme mere bekendt fdisk. Du skal også bruge dosfstools и e2fsprogs for at oprette et filsystem: apt install parted dosfstools e2fsprogs.

Partitionering af SD-kortet:

  1. Marker SD-kortet som bruger MBR-partitionering: parted -s /dev/mmcblk0 mklabel msdos
  2. Opret en sektion til /boot for 128 megabyte: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Den første mistede megabyte skal efterlades til selve opmærkningen og til bootloaderen.
  3. Opret en root FS for resten af ​​kapaciteten: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Hvis du pludselig ikke har oprettet eller ændret partitionsfiler, skal du udføre `partprobe`, så bliver partitionstabellen genlæst.
  5. Opret et boot partition filsystem mærket BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Opret et rodfilsystem med en etiket ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Godt, nu kan du udfylde det. Dette vil desuden kræve debootstrap, et værktøj til at skabe root FS på Debian-lignende operativsystemer: apt install debootstrap.

Vi indsamler FS:

  1. Monter skillevæggen til /mnt/ (brug et mere praktisk monteringspunkt til dig selv): mount /dev/mmcblk0p2 /mnt
  2. Faktisk fylder vi filsystemet: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parameter --include specificerer yderligere at installere nogle pakker, specificerede jeg en statisk bygget QEMU-emulator. Det giver dig mulighed for at præstere chroot til ARM-miljøet. Betydningen af ​​de andre muligheder kan findes i man debootstrap. Glem ikke, at ikke alle ARM-kort understøtter arkitekturen armhf.
  3. På grund af forskellen i arkitekturer debootstrap udføres i to trin, den anden udføres som følger: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Nu skal du spinde: chroot /mnt /bin/bash
  5. udfylde /etc/hosts и /etc/hostname mål FS. Udfyld det samme som indholdet på din lokale computer, husk kun at erstatte værtsnavnet.
  6. Du kan tilpasse alt andet. Især installerer jeg locales (lagernøgler), rekonfigurering af lokaliteter og tidszone (dpkg-reconfigure locales tzdata). Glem ikke at indstille adgangskoden med kommandoen passwd.
  7. Indstil en adgangskode til root hold passwd.
  8. Forberedelsen af ​​billedet for mig afsluttes ved at udfylde /etc/fstab inden /mnt/.

Jeg vil uploade i overensstemmelse med de tags, der er oprettet tidligere, så indholdet bliver som dette:

LABEL=ROOTFS / auto errors=remount-ro 0 1
LABEL=BOOT /boot auto standard 0 0

Til sidst kan du montere opstartspartitionen, vi skal bruge den til kernen: `mount /dev/mmcblk0p1 /mnt/boot/`

Opbygning af Linux

For at bygge kernen (og derefter bootloaderen) på Debian Testing, skal du installere standardsættet af GCC, GNU Make og GNU C Library header-filerne til målarkitekturen (jeg har armhf), samt OpenSSL headers, konsollommeregner bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Da standardindlæseren leder efter en fil zImage på opstartspartitionens filsystem er det tid til at bryde flashdrevet.

  1. Kloning af kernen er for lang, så jeg vil bare downloade: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Pak ud og gå til kildebiblioteket: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Konfigurer før kompilering: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Konfigurationen er i mappen arch/arm/configs/. Hvis der ikke er nogen, kan du prøve at finde og downloade en færdiglavet og videregive navnet på filen i denne mappe til parameteren KBUILD_DEFCONFIG. I ekstreme tilfælde skal du straks fortsætte til næste afsnit.
  3. Du kan valgfrit justere indstillingerne: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Og krydskompiler billedet: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Nu kan du kopiere kernefilen: cp arch/arm/boot/zImage /mnt/boot/
  6. Og filer fra DeviceTree (beskrivelse af hardware tilgængelig på tavlen): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Og installer modulerne samlet som separate filer: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Kernen er klar. Du kan afmontere alt: umount /mnt/boot/ /mnt/

Dens U-støvle

Da bootloaderen er interaktiv, er selve kortet, en lagerenhed og en valgfri USB-til-UART-enhed nok til at teste dens funktion. Det vil sige, at du kan udsætte kernen og OS til senere.

Langt de fleste producenter foreslår at bruge Das U-Boot til primær boot. Fuld støtte gives normalt i sin egen gaffel, men glem ikke at bidrage i opstrøms. I mit tilfælde er bestyrelsen støttet i hovedlinjedet er derfor gaffel Jeg ignorerede.

Vi samler selve bootloaderen:

  1. Klon den stabile gren af ​​depotet: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Lad os gå til selve mappen: cd u-boot
  3. Forberedelse af build-konfigurationen: make mx6ull_14x14_evk_defconfig. Dette virker kun, hvis konfigurationen er i selve Das U-Boot, ellers bliver du nødt til at finde producentens konfiguration og sætte den i roden af ​​repository i filen .config, eller samlet på anden måde anbefalet af producenten.
  4. Vi samler selve bootloader-billedet med en cross-compiler armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Som et resultat får vi filen u-boot.imx, dette er et færdiglavet billede, der kan skrives til et USB-flashdrev. Vi skriver til SD-kortet og springer de første 1024 bytes over. Hvorfor valgte jeg mål u-boot.imx? Hvorfor gik glip af præcis 1024 bytes? Dette er, hvad de foreslår at gøre i dokumentation. For andre tavler kan billedopbygningen og brændingsprocessen være lidt anderledes.

Færdig, du kan downloade. Bootloaderen skal rapportere sin egen version, nogle oplysninger om boardet og prøve at finde kernebilledet på partitionen. Hvis det mislykkes, vil det forsøge at starte over netværket. Generelt er output ret detaljeret, du kan finde en fejl i tilfælde af et problem.

I stedet for en konklusion

Vidste du, at en delfins pande ikke er knoglet? Det er bogstaveligt talt et tredje øje, en fed linse til ekkolokalisering!

Start af GNU/Linux på et ARM-kort fra bunden (ved brug af Kali og iMX.6 som eksempel)

Start af GNU/Linux på et ARM-kort fra bunden (ved brug af Kali og iMX.6 som eksempel)

Kilde: www.habr.com