tl; dr: Jeg bygger et Kali Linux-bilde for en ARM-datamaskin, i programmet debootstrap
, linux
и u-boot
.
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
Nedlastingsprosessen er ganske enkel:
- Maskinvaren er initialisert.
- Fra et område på lagringsenheten (SD-kort/eMMC/etc) leses og kjøres oppstartslasteren.
- Oppstartslasteren ser etter operativsystemkjernen og laster den inn i et minneområde og kjører den.
- Kjernen laster resten av operativsystemet.
Dette detaljnivået er nok for oppgaven min, du kan lese detaljene
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:
- Merk SD-kortet som bruker MBR-partisjonering:
parted -s /dev/mmcblk0 mklabel msdos
- 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. - Vi lager et rotfilsystem for hele gjenværende kapasitet:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
- Hvis partisjonsfilene dine plutselig ikke er opprettet eller ikke har endret seg, må du kjøre `partprobe`, så vil partisjonstabellen bli lest på nytt.
- Opprett et filsystem for oppstartspartisjonen med etiketten
BOOT
:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
- 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:
- Monter skilleveggen i
/mnt/
(bruk et mer praktisk monteringspunkt):mount /dev/mmcblk0p2 /mnt
- 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 presterechroot
i ARM-miljøet. Betydningen av de resterende alternativene kan finnes iman debootstrap
. Ikke glem at ikke alle ARM-kort støtter arkitekturenarmhf
. - På grunn av forskjellen i arkitektur
debootstrap
utføres i to trinn, den andre utføres slik:chroot /mnt/ /debootstrap/debootstrap --second-stage
- Nå må du skru det opp:
chroot /mnt /bin/bash
- fylle
/etc/hosts
и/etc/hostname
mål FS. Fyll inn det samme som innholdet på din lokale datamaskin, bare husk å erstatte vertsnavnet. - Du kan tilpasse alt annet. Spesielt installerer jeg
locales
(lagernøkler), rekonfigurer lokaliteter og tidssone (dpkg-reconfigure locales tzdata
). Ikke glem å angi passordet med kommandoenpasswd
. - Angi et passord for
root
teampasswd
. - 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.
- 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
- Konfigurer før kompilering:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig
. Konfigurasjonen ligger i katalogenarch/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 parameterKBUILD_DEFCONFIG
. Som en siste utvei, gå umiddelbart videre til neste punkt. - Du kan eventuelt justere innstillingene:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- Og krysskompiler bildet:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
- Nå kan du kopiere kjernefilen:
cp arch/arm/boot/zImage /mnt/boot/
- Og filer fra DeviceTree (beskrivelse av maskinvaren på tavlen):
cp arch/arm/boot/dts/*.dtb /mnt/boot/
- 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
La oss sette sammen selve bootloaderen:
- Vi kloner den stabile grenen til depotet:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
- La oss gå til selve katalogen:
cd u-boot
- 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. - 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
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!
Kilde: www.habr.com