tl;dr: adun imaginea Kali Linux pentru un calculator ARM, în programul debootstrap, linux și u-boot.
Dacă ați cumpărat vreo placă de bază mai puțin populară, s-ar putea să vă fiți confruntat cu lipsa unei imagini pentru distribuția preferată. Aproape aceleași probleme s-au întâmplat cu . Kali Linux pentru IMX6 pur și simplu nu există (o pregătesc), așa că trebuie să o construiesc singur.
Procesul de bootare este destul de simplu:
- Hardware-ul este inițializat.
- Un bootloader este citit și executat dintr-o anumită zonă a mediului de stocare (cartela SD/eMMC/etc).
- Bootloader-ul caută nucleul sistemului de operare și îl încarcă într-o anumită zonă de memorie și îl execută.
- Nucleul încarcă restul sistemului de operare.
Pentru sarcina mea, această detaliere este suficientă, detalii suplimentare puteți citi . Zonele „câteva” menționate mai sus diferă de la placă la placă, ceea ce creează unele dificultăți în instalare. Bootarea platformelor ARM server prin UEFI, dar până acum, aceasta nu este disponibilă pentru toți, așa că va trebui să strângeți totul separat.
Construirea sistemului de fișiere rădăcină
Pentru început, trebuie să pregătiți partițiile. Das U-Boot suportă diferite FS-uri, am ales FAT32 pentru /boot și ext3 pentru rădăcină, aceasta este o structura standard a imaginilor pentru Kali pe ARM. Voi folosi GNU Parted, dar puteți să faceți același lucru cu un fdisk. De asemenea, sunt necesare dosfstools și e2fsprogs pentru crearea FS-urilor: apt install parted dosfstools e2fsprogs.
Partiționăm cartela SD:
- Marcăm cartela SD ca folosind partajarea MBR:
parted -s /dev/mmcblk0 mklabel msdos - Creăm o partiție pentru
/bootde 128 megabytes:parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Primul megabyte omis trebuie lăsat pentru structura de partajare și pentru bootloader. - Creăm sistemul de fișiere rădăcină pe toată capacitatea rămasă:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100% - Dacă dintr-o dată nu s-au creat sau nu s-au modificat fișierele partițiilor, trebuie să rulați `partprobe`, atunci tabela partițiilor va fi reread.
- Creăm sistemul de fișiere pentru partiția de boot cu eticheta
BOOT:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1 - Creăm sistemul de fișiere rădăcină cu eticheta
ROOTFS:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2
Excelent, acum o putem umple. Pentru aceasta, va fi necesar suplimentar debootstrap, un utilitar pentru crearea sistemelor de fișiere rădăcină pentru sistemele de operare de tip Debian: apt install debootstrap.
Construim FS:
- Montăm partiția în
/mnt/(folosiți un punct de montare mai confortabil pentru dvs.):mount /dev/mmcblk0p2 /mnt - Așadar, completăm sistemul de fișiere:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parametrul--includeindică instalarea suplimentară a unor pachete, am specificat emulatorul QEMU compilat static. Acesta permite rulareachrootîn mediu ARM. Sensul celorlalte opțiuni poate fi consultat înman debootstrap. Nu uitați că nu orice placă ARM acceptă arhitecturaarmhf. - Din cauza diferențelor de arhitectură
debootstrapse execută în două etape, cea de-a doua se realizează astfel:chroot /mnt/ /debootstrap/debootstrap --second-stage - Acum trebuie să facem chroot:
chroot /mnt /bin/bash - Umplem
/etc/hostsși/etc/hostnameFS-ul țintă. Completați, prin analogie, cu conținutul de pe computerul local, nu uitați doar să înlocuiți numele gazdei. - Se poate face o configurare suplimentară. În special, instalez
locales(cheile de depozit), reconfigurez localele și fusul orar (dpkg-reconfigure locales tzdata). Nu uitați să setați parola cu comandapasswd. - Setăm parola pentru
rootcomandapasswd. - Pregătirea imaginii pentru mine se finalizează prin completarea
/etc/fstabinside/mnt/.
Voi încărca conform etichetelor create anterior, așa că conținutul va fi astfel:
LABEL=ROOTFS / auto errors=remount-ro 0 1
LABEL=BOOT /boot auto defaults 0 0
În cele din urmă, putem monta partiția de boot, ne va fi necesară pentru kernel: `mount /dev/mmcblk0p1 /mnt/boot/`
Compilarea Linux
Pentru a compila kernelul (și ulterior bootloader-ul) pe Debian Testing trebuie să instalez setul standard de GCC, GNU Make și fișierele de antet GNU C Library pentru arhitectura țintă (la mine armhf), precum și antetele OpenSSL, calculatorul de consolă bc, bison și flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Deoarece bootloader-ul caută în mod implicit fișierul zImage pe sistemul de fișiere al partiției de boot, este timpul să împart unitatea flash.
- Clonarea kernelului durează prea mult, așa că pur și simplu voi descărca:
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Vom dezarhiva și vom trece în directorul surselor:tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1 - Configurăm înainte de compilare:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Configurația se află în directorularch/arm/configs/. Dacă nu există, puteți încerca să găsiți și să descărcați un fișier pregătit și să specificați numele fișierului în acest director ca parametruKBUILD_DEFCONFIG. În ultimă instanță, treceți direct la pasul următor. - Opțional, puteți ajusta setările:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig - Și compilăm imaginea într-o cross-compilare:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- - Acum putem copia fișierul kernelului:
cp arch/arm/boot/zImage /mnt/boot/ - Și fișierele cu DeviceTree (descrierea hardware-ului disponibil pe placă):
cp arch/arm/boot/dts/*.dtb /mnt/boot/ - Și instalează modulele compilate sub formă de fișiere separate:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install
Nucleul este gata. Se pot demonta toate: umount /mnt/boot/ /mnt/
Das U-Boot
Dat fiind că bootloader-ul este interactiv, pentru a verifica funcționarea acestuia este suficient să ai placa, dispozitivul de stocare și, opțional, un dispozitiv USB-to-UART. Cu alte cuvinte, se poate amâna utilizarea nucleului și a sistemului de operare.
Cea mai mare parte a producătorilor recomandă utilizarea Das U-Boot pentru bootarea inițială. Suportul complet este de obicei asigurat în fork-urile proprii, dar contribuțiile în upstream nu sunt neglijate. În cazul meu, placa este susținută în , așadar am ignorat.
Compilăm bootloader-ul:
- Clonăm ramura stabilă a repository-ului:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10 - Trecem la directorul propriu-zis:
cd u-boot - Pregătim configurația de compilare:
make mx6ull_14x14_evk_defconfig. Acest lucru funcționează doar dacă configurația există în Das U-Boot, în caz contrar va trebui să găsiți configurația producătorului și să o plasați în rădăcina repository-ului în fișierul.config, sau să compilezi într-un mod recomandat de producător. - Compilăm imaginea bootloader-ului cu cross-compiler-ul
armhf:make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx
Ca rezultat, obținem fișierul u-boot.imx, aceasta este imaginea gata, care poate fi scrisă pe un stick USB. Îl scriem pe un SD card, sărind peste primele 1024 de octeți. De ce am ales ținta u-boot.imx? Почему пропустил именно 1024 байта? Так предлагают сделать в . Pentru alte plăci, procesul de compilare a imaginii și scriere poate varia puțin.
Gata, putem să ne bootăm. Bootloader-ul ar trebui să-și raporteze propria versiune, unele informații despre placă și să încerce să găsească imaginea nucleului pe partiție. În caz de eșec, va încerca să se booteze prin rețea. În general, ieșirea este destul de detaliată, poți găsi erori în caz de probleme.
În concluzie
Știați că fruntea delfinului nu este osoasă? Este literalmente al treilea ochi, o lentilă de grăsime pentru ecoul sonar!
Sursa: habr.com
