Starte GNU/Linux på et ARM-kort fra bunnen av (bruker Kali og iMX.6 som eksempel)

tl; dr: Jeg bygger et Kali Linux-bilde for en ARM-datamaskin, i programmet debootstrap, linux и u-boot.

Starte GNU/Linux på et ARM-kort fra bunnen av (bruker Kali og iMX.6 som eksempel)

Hvis du kjøpte noe ikke veldig populær programvare for enkeltbrett, kan du bli møtt med mangelen på et bilde av favorittdistribusjonen din for den. Omtrent det samme skjedde med planlagt Flipper One. Det er rett og slett ingen Kali Linux for IMX6 (jeg forbereder meg), så jeg må montere den selv.

Nedlastingsprosessen er ganske enkel:

  1. Maskinvaren er initialisert.
  2. Fra et område på lagringsenheten (SD-kort/eMMC/etc) leses og kjøres oppstartslasteren.
  3. Oppstartslasteren ser etter operativsystemkjernen og laster den inn i et minneområde og kjører den.
  4. Kjernen laster resten av operativsystemet.

Dette detaljnivået er nok for oppgaven min, du kan lese detaljene i en annen artikkel. De "noen" områdene nevnt ovenfor er forskjellige fra brett til brett, noe som skaper noen installasjonsvansker. Laster ARM-serverplattformer prøver å standardisere bruker UEFI, men selv om dette ikke er tilgjengelig for alle, må du sette sammen alt separat.

Bygge rotfilsystemet

Først må du forberede seksjonene. Das U-Boot støtter forskjellige filsystemer, jeg valgte FAT32 for /boot og ext3 for root, dette er standard bildeoppsett for Kali på ARM. Jeg bruker GNU Parted, men du kan gjøre det samme på en mer kjent måte fdisk. Du trenger også dosfstools и e2fsprogs for å lage et filsystem: apt install parted dosfstools e2fsprogs.

Vi merker SD-kortet:

  1. Merk SD-kortet som bruker MBR-partisjonering: parted -s /dev/mmcblk0 mklabel msdos
  2. Lag en seksjon under /boot for 128 megabyte: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Den første megabyten som går glipp av, må stå igjen for selve markeringen og for oppstartslasteren.
  3. Vi lager et rotfilsystem for hele gjenværende kapasitet: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Hvis partisjonsfilene dine plutselig ikke er opprettet eller ikke har endret seg, må du kjøre `partprobe`, så vil partisjonstabellen bli lest på nytt.
  5. Opprett et filsystem for oppstartspartisjonen med etiketten BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Lag et rotfilsystem med en etikett ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Flott, nå kan du fylle det ut. For dette trenger du i tillegg debootstrap, et verktøy for å lage rotfilsystemer for Debian-lignende operativsystemer: apt install debootstrap.

Vi samler inn FS:

  1. Monter skilleveggen i /mnt/ (bruk et mer praktisk monteringspunkt): mount /dev/mmcblk0p2 /mnt
  2. Vi fyller faktisk filsystemet: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parameter --include indikerer å installere noen pakker i tillegg, spesifiserte jeg en statisk bygget QEMU-emulator. Det lar deg prestere chroot i ARM-miljøet. Betydningen av de resterende alternativene kan finnes i man debootstrap. Ikke glem at ikke alle ARM-kort støtter arkitekturen armhf.
  3. På grunn av forskjellen i arkitektur debootstrap utføres i to trinn, den andre utføres slik: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Nå må du skru det opp: chroot /mnt /bin/bash
  5. fylle /etc/hosts и /etc/hostname mål FS. Fyll inn det samme som innholdet på din lokale datamaskin, bare husk å erstatte vertsnavnet.
  6. Du kan tilpasse alt annet. Spesielt installerer jeg locales (lagernøkler), rekonfigurer lokaliteter og tidssone (dpkg-reconfigure locales tzdata). Ikke glem å angi passordet med kommandoen passwd.
  7. Angi et passord for root team passwd.
  8. Forberedelsen av bildet for meg ender med utfylling /etc/fstab innenfor /mnt/.

Jeg vil laste opp i samsvar med de tidligere opprettede taggene, så innholdet blir slik:

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

Til slutt kan du montere oppstartspartisjonen, vi trenger den for kjernen: `mount /dev/mmcblk0p1 /mnt/boot/`

Linux-bygg

For å bygge kjernen (og deretter oppstartslasteren) på Debian Testing, må du installere et standard sett med GCC, GNU Make og GNU C Library header-filer for målarkitekturen (for meg armhf), samt OpenSSL-overskrifter, konsollkalkulator bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Siden standardlasteren ser etter filen zImage på filsystemet til oppstartspartisjonen, er det på tide å dele flash-stasjonen.

  1. Det tar for lang tid å klone kjernen, så jeg laster bare ned: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. La oss pakke ut og gå til kildekatalogen: 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. Konfigurasjonen ligger i katalogen arch/arm/configs/. Hvis det ikke er noen, kan du prøve å finne og laste ned en ferdig og sende navnet på filen i denne katalogen som en parameter KBUILD_DEFCONFIG. Som en siste utvei, gå umiddelbart videre til neste punkt.
  3. Du kan eventuelt justere innstillingene: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Og krysskompiler bildet: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Nå kan du kopiere kjernefilen: cp arch/arm/boot/zImage /mnt/boot/
  6. Og filer fra DeviceTree (beskrivelse av maskinvaren på tavlen): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Og installer modulene samlet i form av separate filer: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Kjernen er klar. Du kan demontere alt: umount /mnt/boot/ /mnt/

Dens U-Boot

Siden oppstartslasteren er interaktiv, er alt du trenger for å teste funksjonen selve brettet, en lagringsenhet og eventuelt en USB-til-UART-enhet. Det vil si at du kan utsette kjernen og OS til senere.

De aller fleste produsenter tilbyr å bruke Das U-Boot til den første oppstarten. Full støtte er vanligvis gitt i deres egen gaffel, men de glemmer ikke å bidra til oppstrøms. I mitt tilfelle er styret støttet inn hovedlinjegaffel Jeg ignorerte det.

La oss sette sammen selve bootloaderen:

  1. Vi kloner den stabile grenen til depotet: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. La oss gå til selve katalogen: cd u-boot
  3. Forbereder byggekonfigurasjonen: make mx6ull_14x14_evk_defconfig. Dette fungerer bare hvis konfigurasjonen er i selve Das U-Boot, ellers må du finne produsentens konfigurasjon og legge den i roten til depotet i en fil .config, eller montere på annen måte anbefalt av produsenten.
  4. Vi setter sammen selve bootloader-bildet ved hjelp av en krysskompilator armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Som et resultat får vi filen u-boot.imx, dette er et ferdiglagd bilde som kan skrives til en flash-stasjon. Vi skriver til SD-kortet og hopper over de første 1024 bytene. Hvorfor valgte jeg Target u-boot.imx? Hvorfor gikk jeg glipp av nøyaktig 1024 byte? Dette er hva de foreslår å gjøre i dokumentasjon. For andre tavler kan bildebyggings- og opptaksprosessen være litt annerledes.

Ferdig, du kan starte opp. Oppstartslasteren må rapportere sin egen versjon, litt informasjon om brettet, og prøve å finne kjernebildet på partisjonen. Hvis det ikke lykkes, vil det prøve å starte opp over nettverket. Generelt er utgangen ganske detaljert, du kan finne feilen hvis det er et problem.

I stedet for en konklusjon

Visste du at en delfins panne ikke er bein? Det er bokstavelig talt et tredje øye, en fet linse for ekkolokalisering!

Starte GNU/Linux på et ARM-kort fra bunnen av (bruker Kali og iMX.6 som eksempel)

Starte GNU/Linux på et ARM-kort fra bunnen av (bruker Kali og iMX.6 som eksempel)

Kilde: www.habr.com