Pornirea GNU/Linux pe o placă ARM de la zero (folosind Kali și iMX.6 ca exemplu)

tl; dr: Construiesc o imagine Kali Linux pentru un computer ARM, în program debootstrap, linux и u-boot.

Pornirea GNU/Linux pe o placă ARM de la zero (folosind Kali și iMX.6 ca exemplu)

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 a planificat Flipper One. Pur și simplu nu există Kali Linux pentru IMX6 (mă pregătesc), așa că trebuie să-l asamblez eu.

Procesul de descărcare este destul de simplu:

  1. Hardware-ul este inițializat.
  2. Dintr-o zonă a dispozitivului de stocare (card SD/eMMC/etc) bootloader-ul este citit și executat.
  3. Bootloader-ul caută nucleul sistemului de operare și îl încarcă într-o zonă de memorie și îl execută.
  4. Nucleul încarcă restul sistemului de operare.

Acest nivel de detaliu este suficient pentru sarcina mea, puteți citi detaliile într-un alt articol. „Unele” zone menționate mai sus diferă de la placă la placă, ceea ce creează unele dificultăți de instalare. Se încarcă platformele de server ARM încercând să standardizeze folosind UEFI, dar deși acest lucru nu este disponibil pentru toată lumea, va trebui să asamblați totul separat.

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:

  1. Marcați cardul SD ca utilizând partiționarea MBR: parted -s /dev/mmcblk0 mklabel msdos
  2. 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.
  3. Creăm un sistem de fișiere rădăcină pentru întreaga capacitate rămasă: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. 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.
  5. Creați un sistem de fișiere pentru partiția de boot cu eticheta BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. 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:

  1. Montați partiția în interior /mnt/ (utilizați un punct de montare mai convenabil): mount /dev/mmcblk0p2 /mnt
  2. 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ă în man debootstrap. Nu uitați că nu toate plăcile ARM acceptă arhitectura armhf.
  3. Datorită diferenței de arhitectură debootstrap se realizează în două etape, a doua se realizează astfel: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Acum trebuie să o dai peste cap: chroot /mnt /bin/bash
  5. 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ă.
  6. 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 comanda passwd.
  7. Setați o parolă pentru root echipă passwd.
  8. 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.

  1. 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
  2. Configurați înainte de compilare: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Configurația se află în director arch/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 parametru KBUILD_DEFCONFIG. Ca ultimă soluție, treceți imediat la următorul punct.
  3. Opțional, puteți modifica setările: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Și compilați imaginea: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Acum puteți copia fișierul kernel: cp arch/arm/boot/zImage /mnt/boot/
  6. Și fișiere din DeviceTree (descrierea hardware-ului de pe placă): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Ș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 linia principalăAstfel furculiţă Am ignorat-o.

Să asamblam bootloader-ul în sine:

  1. Clonăm ramura stabilă a depozitului: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Să mergem la directorul în sine: cd u-boot
  3. 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.
  4. 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ă documentație. Pentru alte plăci, procesul de construire și înregistrare a imaginii poate fi ușor diferit.

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!

Pornirea GNU/Linux pe o placă ARM de la zero (folosind Kali și iMX.6 ca exemplu)

Pornirea GNU/Linux pe o placă ARM de la zero (folosind Kali și iMX.6 ca exemplu)

Sursa: www.habr.com