Spúšťame GNU/Linux na ARM doske od nuly (na príklade Kali a iMX.6)

tl;dr: vytváram obraz Kali Linux pre ARM počítač, v programe debootstrap, linux a u-boot.

Spúšťame GNU/Linux na ARM doske od nuly (na príklade Kali a iMX.6)

Ak ste kupovali nejaký menej populárny jednoplatový počítač, mohli ste sa stretnúť s absenciou obrazu vášho obľúbeného distribučného systému. Približne to isté sa stalo aj s plánovaným Flipper One. Kali Linux pre IMX6 jednoducho neexistuje (pripravujem), takže musím zbierať sám.

Proces bootovania je dosť jednoduchý:

  1. Hardvér sa inicializuje.
  2. Z určitej oblasti na pamäťovom médiu (SD-karta/eMMC/etc) sa načíta a vykoná bootloader.
  3. Bootloader hľadá jadro operačného systému a načíta ho do určitej oblasti pamäte a vykonáva ho.
  4. Jadro načíta celý zvyšok operačného systému.

Pre moju úlohu stačí takáto úroveň detailov, podrobnosti si môžete prečítať v inom článku. Uvedené vyššie "určité" oblasti sa líšia od dosky k doske, čo spôsobuje niektoré ťažkosti s inštaláciou. Načítanie serverových ARM platforiem sa snaží štandardizovať pomocou UEFI, ale kým to nie je dostupné pre všetkých, bude potrebné všetko zostaviť osobitne.

Zostavenie koreňového súborového systému

Najprv je potrebné pripraviť oddiely. Das U-Boot podporuje rôzne súborové systémy, zvolil som FAT32 pre /boot a ext3 pre koreň, je to štandardné rozdelenie obrazov pre Kali na ARM. Použijem GNU Parted, ale môžete urobiť to isté viac známy fdisk. Tiež budete potrebovať dosfstools a e2fsprogs na vytvorenie súborového systému: apt install parted dosfstools e2fsprogs.

Rozdeľujeme SD kartu:

  1. Označujeme SD kartu ako používajúcu MBR rozdelenie: parted -s /dev/mmcblk0 mklabel msdos
  2. Vytvárame oddiel pre /boot na 128 megabajtov: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Prvý preskočený megabajt je potrebné nechať pod samotným rozdelením a pod bootloaderom.
  3. Vytvárame koreňový FS na celú zostávajúcu kapacitu: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Ak sa náhodou nevytvorili alebo nezmenili súbory oddielov, musíte vykonať `partprobe`, potom sa tabuľka oddielov prečíta znova.
  5. Vytvárame súborový systém bootovacieho oddielu s označením BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Vytvárame koreňový FS s označením ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Skvele, teraz ju môžeme naplniť. Na to budeme potrebovať navyše debootstrap, nástroj na vytváranie koreňových FS Debian podobných operačných systémov: apt install debootstrap.

Zbierame FS:

  1. Pripojujeme oddiel do /mnt/ (použite pre seba pohodlnejšiu montážnu bod): mount /dev/mmcblk0p2 /mnt
  2. Vlastne vyplňujeme súborový systém: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parameter --include označuje dodatočne nainštalovať niektoré balíky, uviedol som staticky zostavený emulátor QEMU. Umožňuje vykonávať chroot v ARM prostredí. Zmysel ostatných možností si môžete pozrieť v man debootstrap. Nezabudnite, že nie každý ARM board podporuje architektúru armhf.
  3. Vzhľadom na rozdiely v architektúrach debootstrap sa vykonáva v dvoch stupňoch, druhý sa vykonáva takto: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Teraz sa potrebujeme chrootovať: chroot /mnt /bin/bash
  5. Vyplňujeme /etc/hosts a /etc/hostname cieľový FS. Vyplňte podľa obsahu na vašom lokálnom počítači, nezabudnite iba vymeniť názov hostiteľa.
  6. Môžete doladiť všetko ostatné. V prípade potreby doinštalujem locales (klúče repozitára), nastavím lokality a časové pásmo (dpkg-reconfigure locales tzdata). Nezabudnite nastaviť heslo príkazom passwd.
  7. Nastavujeme heslo pre root príkazom passwd.
  8. Prípravy obrazu pre mňa končia naplnením /etc/fstab vnútri /mnt/.

Sťahovať budem v súlade s predtým vytvorenými etiketami, preto bude obsah takýto:

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

Nakoniec môžeme namontovať zavádzací oddiel, ten budeme potrebovať pre jadro: `mount /dev/mmcblk0p1 /mnt/boot/`

Zostavenie Linuxu

Na zostavenie jadra (a neskôr zavádzača) na Debian Testing je potrebné nainštalovať štandardnú sadu z GCC, GNU Make a hlavičkových súborov GNU C Library pre cieľovú architektúru (mám armhf), ako aj hlavičky OpenSSL, konzolový kalkulátor bc, bison a flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Keďže zavádzač predvolene hľadá súbor zImage na súborovom systéme zavádzacieho oddielu, je čas rozdeliť flash disk.

  1. Klónovať jadro je príliš zdĺhavé, preto jednoducho sťahujem: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Rozbalíme a prejdeme do adresára so zdrojovými kódmi: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Konfigurujeme pred kompiláciou: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Konfigurácia sa nachádza v adresári arch/arm/configs/. Ak takýto nie je, môžete sa pokúsiť nájsť a stiahnuť hotový a zadať názov súboru v tejto adresári v parametre KBUILD_DEFCONFIG. V najhoršom prípade ihneď prejdite k ďalšiemu bodu.
  3. Voliteľne môžete doladiť nastavenia: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. A crosskompilujeme obraz: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Teraz môžeme skopírovať súbor s jadrom: cp arch/arm/boot/zImage /mnt/boot/
  6. A súbory s DeviceTree (popis existujúceho hardvéru na doske): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. A doinštalujte zostavené ako samostatné súbory moduly: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Jadro je pripravené. Môžete všetko odmontovať: umount /mnt/boot/ /mnt/

Das U-Boot

Keďže je bootloader interaktívny, na overenie jeho funkčnosti stačí samotná doska, pamäťové zariadenie a voliteľne zariadenie USB-to-UART. To znamená, že môžeme odložiť jadro a OS na neskôr.

Absolútna väčšina výrobcov ponúka použiť Das U-Boot na primárne načítanie. Kompletná podpora sa zvyčajne zabezpečuje vo vlastnom forku, no ani v upstream nezabúdajú prispievať. V mojom prípade je doska podporovaná v hlavnom repo, takže fork som ignoroval.

Zostavujeme samotný bootloader:

  1. Klóňte stabilnú vetvu repozitára: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Prejdite do samotného adresára: cd u-boot
  3. Pripravujeme konfiguráciu zostavenia: make mx6ull_14x14_evk_defconfig. Toto funguje len ak je konfigurácia v samotnom Das U-Boot, inak bude potrebné nájsť konfiguračný súbor výrobcu a umiestniť ho do koreňa repozitára do súboru .config, alebo zostaviť iným odporúčaným spôsobom výrobcu.
  4. Zostavujeme samotný obraz bootloadera krížovým kompilátorom armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Ako výsledok dostaneme súbor u-boot.imx, je to hotový obraz, ktorý môžeme zapísať na USB kľúč. Zapíšeme na SD kartu, vynechajúc prvých 1024 bajtov. Prečo som si vybral cieľ u-boot.imx? Почему пропустил именно 1024 байта? Так предлагают сделать в dokumenácie. Pre iné dosky sa proces zostavenia obrazu a zápisu môže mierne líšiť.

Hotovo, môžeme sa naštartovať. Bootloader by mal oznámiť vlastnú verziu, niektoré informácie o doske a pokúsiť sa nájsť obraz jadra na oddiele. V prípade neúspechu sa pokúsi načítať zo siete. Celkovo je výstup dosť podrobný, môžete nájsť chybu v prípade problému.

Na záver

Vedeli ste, že čelo delfína nie je kostnaté? Je to doslovne tretie oko, tuková šošovka pre echolokáciu!

Spúšťame GNU/Linux na ARM doske od nuly (na príklade Kali a iMX.6)

Spúšťame GNU/Linux na ARM doske od nuly (na príklade Kali a iMX.6)

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster