A GNU/Linux indítása ARM kártyán a nulláról (példaként a Kali és az iMX.6 használatával)

tl; dr: Kali Linux image-et készítek ARM számítógéphez, a programban debootstrap, linux и u-boot.

A GNU/Linux indítása ARM kártyán a nulláról (példaként a Kali és az iMX.6 használatával)

Ha vásárolt néhány nem túl népszerű, egykártyás szoftvert, akkor előfordulhat, hogy nincs kép a kedvenc disztribúciójáról. Körülbelül ugyanez történt vele tervezett Flipper One. Egyszerűen nincs Kali Linux az IMX6-hoz (készülök), ezért magamnak kell összeszerelnem.

A letöltési folyamat meglehetősen egyszerű:

  1. A hardver inicializálva van.
  2. A tárolóeszköz bizonyos területeiről (SD-kártya/eMMC/stb) a rendszer beolvassa és végrehajtja a rendszerbetöltőt.
  3. A rendszerbetöltő megkeresi az operációs rendszer kernelt, betölti valamilyen memóriaterületre, és végrehajtja.
  4. A kernel betölti az operációs rendszer többi részét.

Ez a részletezettség elég a feladatomhoz, a részleteket olvashatjátok egy másik cikkben. A fent említett „néhány” terület táblánként különbözik, ami bizonyos telepítési nehézségeket okoz. ARM szerverplatformok betöltése szabványosítani próbál UEFI használatával, de bár ez nem mindenki számára elérhető, mindent külön kell összeállítani.

A root fájlrendszer felépítése

Először elő kell készítenie a szakaszokat. A Das U-Boot különböző fájlrendszereket támogat, én a FAT32-t választottam /boot és az ext3 a root számára, ez a Kali szabványos képelrendezése az ARM-en. Én a GNU Partedet fogom használni, de ugyanezt megteheted ismerősebb módon is fdisk. Önnek is szüksége lesz dosfstools и e2fsprogs fájlrendszer létrehozásához: apt install parted dosfstools e2fsprogs.

Megjelöljük az SD-kártyát:

  1. Jelölje meg az SD-kártyát MBR-particionálást használóként: parted -s /dev/mmcblk0 mklabel msdos
  2. Hozzon létre egy szakaszt az alatt /boot 128 megabájt esetén: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Az első kihagyott megabájtot magának a jelölésnek és a rendszerbetöltőnek kell hagyni.
  3. Létrehozunk egy gyökér fájlrendszert a teljes fennmaradó kapacitásra: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Ha hirtelen a partíciós fájlok nem jöttek létre, vagy nem változtak, akkor futtassa a `partprobe' parancsot, ekkor a partíciós tábla újra beolvasásra kerül.
  5. Hozzon létre egy fájlrendszert a címkével ellátott rendszerindító partícióhoz BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Hozzon létre egy gyökér fájlrendszert címkével ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Remek, most már kitöltheti. Ehhez még szüksége lesz debootstrap, egy segédprogram gyökérfájlrendszerek létrehozására Debian-szerű operációs rendszerekhez: apt install debootstrap.

FS-t gyűjtünk:

  1. Szerelje be a partíciót /mnt/ (használjon kényelmesebb rögzítési pontot): mount /dev/mmcblk0p2 /mnt
  2. Valójában kitöltjük a fájlrendszert: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali... Paraméter --include azt jelzi, hogy további csomagokat kell telepíteni, megadtam egy statikusan felépített QEMU emulátort. Lehetővé teszi a teljesítményt chroot ARM környezetben. A fennmaradó opciók jelentése a következő helyen található: man debootstrap. Ne felejtse el, hogy nem minden ARM kártya támogatja az architektúrát armhf.
  3. Az építészeti különbségek miatt debootstrap két szakaszban hajtják végre, a másodikat a következőképpen hajtják végre: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Most el kell csavarni: chroot /mnt /bin/bash
  5. tölt /etc/hosts и /etc/hostname cél FS. Töltse ki ugyanazt a tartalmat, mint a helyi számítógépén, csak ne felejtse el lecserélni a gazdagép nevét.
  6. Minden mást személyre szabhat. Konkrétan telepítem locales (lerakatkulcsok), konfigurálja újra a területi beállításokat és az időzónát (dpkg-reconfigure locales tzdata). Ne felejtse el beállítani a jelszót a paranccsal passwd.
  7. Állítson be jelszót root csapat passwd.
  8. A kép elkészítése számomra töltéssel zárul /etc/fstab belső /mnt/.

A korábban elkészített címkéknek megfelelően fogom feltölteni, így a tartalom a következő lesz:

LABEL=ROOTFS/auto errors=remount-ro 0 1
LABEL=BOOT /boot auto alapértékek 0 0

Végül felcsatolhatja a rendszerindító partíciót, szükségünk lesz rá a kernelhez: `mount /dev/mmcblk0p1 /mnt/boot/`

Linux build

A kernel (majd a rendszerbetöltő) Debian Testingen való felépítéséhez telepítenie kell a GCC, a GNU Make és a GNU C Library fejlécfájljainak szabványos készletét a cél architektúrához (számomra armhf), valamint OpenSSL-fejlécek, konzolszámítógép bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Mivel az alapértelmezett betöltő keresi a fájlt zImage a rendszerindító partíció fájlrendszerén itt az ideje felosztani a flash meghajtót.

  1. Túl sokáig tart a kernel klónozása, ezért csak letöltöm: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Csomagoljuk ki, és menjünk a forráskönyvtárba: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Konfigurálás a fordítás előtt: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. A konfiguráció a könyvtárban található arch/arm/configs/. Ha nincs ilyen, megpróbálhat egy kész fájlt keresni és letölteni, és paraméterként megadni a fájl nevét ebben a könyvtárban KBUILD_DEFCONFIG. Utolsó lehetőségként azonnal lépjen tovább a következő pontra.
  3. Opcionálisan módosíthatja a beállításokat: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. És fordítsd össze a képet: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Most átmásolhatja a kernelfájlt: cp arch/arm/boot/zImage /mnt/boot/
  6. És a DeviceTree fájlok (a hardver leírása a táblán): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. És telepítse a külön fájlok formájában összegyűjtött modulokat: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

A kernel készen áll. Mindent le lehet szerelni: umount /mnt/boot/ /mnt/

Das U-Boot

Mivel a rendszerbetöltő interaktív, működésének teszteléséhez csak magára a kártyára, egy tárolóeszközre és opcionálisan egy USB-UART eszközre van szükség. Vagyis későbbre halaszthatja a kernelt és az operációs rendszert.

A gyártók túlnyomó többsége a Das U-Boot használatát ajánlja az első rendszerindításhoz. A teljes támogatást általában a saját villájukban biztosítják, de nem felejtenek el hozzájárulni az upstreamhez. Az én esetemben a tábla be van támasztva fő vonal, így Villa figyelmen kívül hagytam.

Állítsuk össze magát a rendszerbetöltőt:

  1. A tároló stabil ágát klónozzuk: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Menjünk magához a könyvtárhoz: cd u-boot
  3. A build konfigurációjának előkészítése: make mx6ull_14x14_evk_defconfig. Ez csak akkor működik, ha a konfiguráció magában a Das U-Bootban van, ellenkező esetben meg kell találnia a gyártó konfigurációját, és el kell helyeznie a tároló gyökérébe egy fájlban .configvagy a gyártó által javasolt egyéb módon szerelje össze.
  4. Magát a rendszerbetöltő képfájlt állítjuk össze egy keresztfordító segítségével armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Ennek eredményeként megkapjuk a fájlt u-boot.imx, ez egy kész kép, ami pendrive-ra írható. Az első 1024 bájtot kihagyva írunk az SD kártyára. Miért választottam a Targetet? u-boot.imx? Miért hiányzott pontosan 1024 bájt? Ezt javasolják benn dokumentáció. Más táblák esetében a képalkotás és a rögzítési folyamat kissé eltérhet.

Kész, indulhat. A rendszerbetöltőnek jelentenie kell a saját verzióját, néhány információt a kártyáról, és meg kell próbálnia megtalálni a rendszermag képét a partíción. Ha nem sikerül, akkor megpróbálja elindítani a hálózaton keresztül. Általánosságban elmondható, hogy a kimenet elég részletes, megtalálja a hibát, ha probléma van.

Ahelyett, hogy egy következtetés

Tudtad, hogy a delfin homloka nem csontos? Szó szerint egy harmadik szem, egy zsíros lencse az echolokációhoz!

A GNU/Linux indítása ARM kártyán a nulláról (példaként a Kali és az iMX.6 használatával)

A GNU/Linux indítása ARM kártyán a nulláról (példaként a Kali és az iMX.6 használatával)

Forrás: will.com