tl; dr: Construiesc o imagine Kali Linux pentru un computer ARM, în program debootstrap
, linux
и u-boot
.
Dacă ați cumpărat un software cu o singură placă nu foarte popular, s-ar putea să vă confruntați cu lipsa unei imagini a distribuției dvs. preferate pentru acesta. Aproximativ același lucru s-a întâmplat cu
Procesul de descărcare este destul de simplu:
- Hardware-ul este inițializat.
- Dintr-o zonă a dispozitivului de stocare (card SD/eMMC/etc) bootloader-ul este citit și executat.
- Bootloader-ul caută nucleul sistemului de operare și îl încarcă într-o zonă de memorie și îl execută.
- Nucleul încarcă restul sistemului de operare.
Acest nivel de detaliu este suficient pentru sarcina mea, puteți citi detaliile
Construirea sistemului de fișiere rădăcină
Mai întâi trebuie să pregătiți secțiunile. Das U-Boot acceptă diferite sisteme de fișiere, eu am ales FAT32 pentru /boot
și ext3 pentru root, acesta este aspectul standard al imaginii pentru Kali pe ARM. Voi folosi GNU Parted, dar puteți face același lucru într-un mod mai familiar fdisk
. Veți avea nevoie și de dosfstools
и e2fsprogs
pentru a crea un sistem de fișiere: apt install parted dosfstools e2fsprogs
.
Marcam cardul SD:
- Marcați cardul SD ca utilizând partiționarea MBR:
parted -s /dev/mmcblk0 mklabel msdos
- Creați o secțiune sub
/boot
pentru 128 megaocteți:parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB
. Primul megaoctet ratat trebuie lăsat pentru marcajul în sine și pentru încărcătorul de pornire. - Creăm un sistem de fișiere rădăcină pentru întreaga capacitate rămasă:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
- Dacă dintr-o dată fișierele de partiție nu au fost create sau nu s-au schimbat, trebuie să rulați `partprobe`, atunci tabelul de partiții va fi recitit.
- Creați un sistem de fișiere pentru partiția de boot cu eticheta
BOOT
:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
- Creați un sistem de fișiere rădăcină cu o etichetă
ROOTFS
:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2
Grozav, acum îl poți completa. Pentru aceasta veți avea nevoie în plus debootstrap
, un utilitar pentru crearea sistemelor de fișiere rădăcină pentru sisteme de operare asemănătoare Debian: apt install debootstrap
.
Colectăm FS:
- Montați partiția în interior
/mnt/
(utilizați un punct de montare mai convenabil):mount /dev/mmcblk0p2 /mnt
- De fapt umplem sistemul de fișiere:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali
. Parametru--include
indică instalarea suplimentară a unor pachete, am specificat un emulator QEMU construit static. Îți permite să faci performanțăchroot
în mediul ARM. Semnificația opțiunilor rămase poate fi găsită înman debootstrap
. Nu uitați că nu toate plăcile ARM acceptă arhitecturaarmhf
. - Datorită diferenței de arhitectură
debootstrap
se realizează în două etape, a doua se realizează astfel:chroot /mnt/ /debootstrap/debootstrap --second-stage
- Acum trebuie să o dai peste cap:
chroot /mnt /bin/bash
- umple
/etc/hosts
и/etc/hostname
tinta FS. Completați la fel ca și conținutul de pe computerul local, nu uitați să înlocuiți numele de gazdă. - Puteți personaliza orice altceva. In special, instalez
locales
(chei de depozit), reconfigurați localitățile și fusul orar (dpkg-reconfigure locales tzdata
). Nu uitați să setați parola cu comandapasswd
. - Setați o parolă pentru
root
echipăpasswd
. - Pregătirea imaginii pentru mine se termină cu umplere
/etc/fstab
în/mnt/
.
Voi încărca în conformitate cu etichetele create anterior, deci conținutul va fi astfel:
LABEL=ROOTFS / auto errors=remount-ro 0 1
LABEL=BOOT /boot automat valorile implicite 0 0
În cele din urmă, puteți monta partiția de boot, vom avea nevoie de ea pentru kernel: `mount /dev/mmcblk0p1 /mnt/boot/`
Linux build
Pentru a construi nucleul (și apoi bootloader-ul) pe Debian Testing, trebuie să instalați un set standard de fișiere de antet GCC, GNU Make și GNU C Library pentru arhitectura țintă (pentru mine armhf
), precum și anteturi OpenSSL, calculator console bc
, bison
и flex
: apt install crossbuild-essential-armhf bison flex libssl-dev bc
. Deoarece încărcătorul implicit caută fișierul zImage
pe sistemul de fișiere al partiției de boot, este timpul să împărțiți unitatea flash.
- Durează prea mult pentru a clona nucleul, așa că voi descărca doar:
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
. Să despachetăm și să mergem la directorul sursă:tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
- Configurați înainte de compilare:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig
. Configurația se află în directorarch/arm/configs/
. Dacă nu există, puteți încerca să găsiți și să descărcați unul gata făcut și să treceți numele fișierului din acest director ca parametruKBUILD_DEFCONFIG
. Ca ultimă soluție, treceți imediat la următorul punct. - Opțional, puteți modifica setările:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- Și compilați imaginea:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
- Acum puteți copia fișierul kernel:
cp arch/arm/boot/zImage /mnt/boot/
- Și fișiere din DeviceTree (descrierea hardware-ului de pe placă):
cp arch/arm/boot/dts/*.dtb /mnt/boot/
- Și instalați modulele colectate sub formă de fișiere separate:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install
Nuezul este gata. Puteți demonta totul: umount /mnt/boot/ /mnt/
Das U-Boot
Deoarece bootloader-ul este interactiv, tot ce aveți nevoie pentru a-și testa funcționarea este placa în sine, un dispozitiv de stocare și, opțional, un dispozitiv USB-to-UART. Adică, puteți amâna nucleul și sistemul de operare pentru mai târziu.
Marea majoritate a producătorilor oferă să folosească Das U-Boot pentru boot-ul inițial. Suportul complet este de obicei oferit în propria lor furcă, dar nu uită să contribuie la amonte. În cazul meu, placa este suportată în
Să asamblam bootloader-ul în sine:
- Clonăm ramura stabilă a depozitului:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
- Să mergem la directorul în sine:
cd u-boot
- Pregătirea configurației de construcție:
make mx6ull_14x14_evk_defconfig
. Acest lucru funcționează numai dacă configurația este în Das U-Boot în sine, altfel va trebui să găsiți configurația producătorului și să o puneți în rădăcina depozitului într-un fișier.config
, sau asamblați în orice alt mod recomandat de producător. - Asamblam imaginea bootloader-ului în sine folosind un compilator încrucișat
armhf
:make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx
Drept urmare, obținem fișierul u-boot.imx
, aceasta este o imagine gata făcută care poate fi scrisă pe o unitate flash. Scriem pe cardul SD, sărim peste primii 1024 de octeți. De ce am ales Target u-boot.imx
? De ce am ratat exact 1024 de octeți? Acesta este ceea ce își propun să facă
Gata, poți porni. Bootloader-ul trebuie să raporteze propria versiune, câteva informații despre placă și să încerce să găsească imaginea kernel-ului pe partiție. Dacă nu reușește, va încerca să pornească prin rețea. În general, rezultatul este destul de detaliat, puteți găsi eroarea dacă există o problemă.
În loc de concluzie
Știați că fruntea unui delfin nu este osoasă? Este literalmente un al treilea ochi, o lentilă grasă pentru ecolocație!
Sursa: www.habr.com