GNU/Linux paleidimas ARM plokštėje nuo nulio (kaip pavyzdžiu naudojant Kali ir iMX.6)

tl; dr: Programoje kuriu Kali Linux vaizdą ARM kompiuteriui debootstrap, linux и u-boot.

GNU/Linux paleidimas ARM plokštėje nuo nulio (kaip pavyzdžiu naudojant Kali ir iMX.6)

Jei įsigijote ne itin populiarią vienos plokštės programinę įrangą, galite susidurti su mėgstamiausio jos platinimo vaizdo trūkumu. Maždaug tas pats nutiko ir su planuojamas „Flipper One“.. IMX6 tiesiog nėra Kali Linux (ruošiuosi), todėl turiu jį surinkti pats.

Atsisiuntimo procesas yra gana paprastas:

  1. Aparatinė įranga inicijuojama.
  2. Iš tam tikros vietos saugojimo įrenginyje (SD kortelės/eMMC/tt) nuskaitoma ir vykdoma įkrovos programa.
  3. Įkrovos įkroviklis ieško operacinės sistemos branduolio ir įkelia jį į tam tikrą atminties sritį ir jį vykdo.
  4. Branduolys įkelia likusią OS dalį.

Tokio detalumo pakanka mano užduočiai, galite perskaityti detales kitame straipsnyje. Aukščiau paminėtos „kai kurios“ sritys įvairiose plokštėse skiriasi, todėl kyla tam tikrų įrengimo sunkumų. Įkeliamos ARM serverio platformos bando standartizuoti naudojant UEFI, tačiau nors tai nėra prieinama visiems, turėsite viską surinkti atskirai.

Kurti šakninę failų sistemą

Pirmiausia turite paruošti skyrius. Das U-Boot palaiko skirtingas failų sistemas, aš pasirinkau FAT32 /boot ir ext3 šakniniam, tai yra standartinis Kali vaizdo išdėstymas ARM. Aš naudosiu GNU Parted, bet jūs galite padaryti tą patį labiau pažįstamu būdu fdisk. Jums taip pat reikės dosfstools и e2fsprogs Norėdami sukurti failų sistemą: apt install parted dosfstools e2fsprogs.

Pažymime SD kortelę:

  1. Pažymėkite SD kortelę kaip naudojančią MBR skaidymą: parted -s /dev/mmcblk0 mklabel msdos
  2. Sukurkite skyrių žemiau /boot 128 megabaitams: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Pirmasis praleistas megabaitas turi būti paliktas pačiam žymėjimui ir įkrovos įkrovikliui.
  3. Sukuriame šakninę failų sistemą visai likusiai talpai: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Jei staiga jūsų skaidinio failai nebuvo sukurti arba nepasikeitė, turite paleisti „partprobe“, tada skaidinių lentelė bus perskaityta iš naujo.
  5. Sukurkite įkrovos skaidinio failų sistemą su etikete BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Sukurkite šakninę failų sistemą su etikete ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Puiku, dabar galite jį užpildyti. Tam papildomai reikės debootstrap, įrankis, skirtas kurti pagrindines failų sistemas į Debianą panašioms operacinėms sistemoms: apt install debootstrap.

Mes renkame FS:

  1. Sumontuokite pertvarą /mnt/ (naudokite patogesnį tvirtinimo tašką): mount /dev/mmcblk0p2 /mnt
  2. Iš tikrųjų užpildome failų sistemą: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parametras --include nurodo papildomai įdiegti kai kuriuos paketus, nurodžiau statiškai pastatytą QEMU emuliatorių. Tai leidžia atlikti chroot ARM aplinkoje. Likusių parinkčių reikšmę galite rasti man debootstrap. Nepamirškite, kad ne kiekviena ARM plokštė palaiko architektūrą armhf.
  3. Dėl architektūros skirtumo debootstrap atliekamas dviem etapais, antrasis atliekamas taip: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Dabar reikia susukti: chroot /mnt /bin/bash
  5. Mes užpildome /etc/hosts и /etc/hostname taikinys FS. Užpildykite taip pat, kaip ir vietinio kompiuterio turinį, tik nepamirškite pakeisti pagrindinio kompiuterio pavadinimo.
  6. Visa kita galite pritaikyti. Visų pirma, aš montuoju locales (saugyklos raktai), iš naujo sukonfigūruokite lokales ir laiko juostą (dpkg-reconfigure locales tzdata). Nepamirškite su komanda nustatyti slaptažodį passwd.
  7. Nustatykite slaptažodį root komanda passwd.
  8. Vaizdo paruošimas man baigiasi užpildymu /etc/fstab per /mnt/.

Įkelsiu pagal anksčiau sukurtas žymas, todėl turinys bus toks:

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

Galiausiai galite prijungti įkrovos skaidinį, jo mums reikės branduoliui: `mount /dev/mmcblk0p1 /mnt/boot/

Linux kūrimas

Norėdami sukurti branduolį (o tada įkrovos įkroviklį) naudodami Debian Testing, turite įdiegti standartinį GCC, GNU Make ir GNU C Library antraštės failų rinkinį tikslinei architektūrai (man armhf), taip pat OpenSSL antraštes, konsolės skaičiuotuvą bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Kadangi numatytasis įkroviklis ieško failo zImage įkrovos skaidinio failų sistemoje laikas padalinti „flash drive“.

  1. Branduolio klonavimas užtrunka per ilgai, todėl tiesiog atsisiųsiu: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Išpakuosime ir eikime į šaltinio katalogą: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Prieš kompiliavimą sukonfigūruokite: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Konfigūracija yra kataloge arch/arm/configs/. Jei jo nėra, galite pabandyti rasti ir atsisiųsti paruoštą failą ir kaip parametrą perduoti failo pavadinimą šiame kataloge KBUILD_DEFCONFIG. Kraštutiniu atveju nedelsdami pereikite prie kito punkto.
  3. Pasirinktinai galite koreguoti nustatymus: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. Ir sukompiliuokite vaizdą: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Dabar galite nukopijuoti branduolio failą: cp arch/arm/boot/zImage /mnt/boot/
  6. Ir failai iš „DeviceTree“ (aparatinės įrangos aprašymas lentoje): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. Ir įdiekite modulius, surinktus atskirų failų pavidalu: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Branduolys yra paruoštas. Galite atjungti viską: umount /mnt/boot/ /mnt/

Das U-Boot

Kadangi įkrovos įkroviklis yra interaktyvus, norint patikrinti jo veikimą tereikia pačios plokštės, saugojimo įrenginio ir pasirinktinai USB į UART įrenginį. Tai reiškia, kad branduolį ir OS galite atidėti vėlesniam laikui.

Didžioji dauguma gamintojų siūlo naudoti Das U-Boot pradiniam įkrovimui. Visa parama paprastai teikiama jų pačių šakėje, tačiau jie nepamiršta prisidėti prie prieš srovę. Mano atveju lenta palaikoma pagrindinė linijaTaip šakutė Aš tai ignoravau.

Surinkime patį įkrovos įkroviklį:

  1. Klonuojame stabilią saugyklos šaką: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Eikime į patį katalogą: cd u-boot
  3. Konfigūracijos paruošimas: make mx6ull_14x14_evk_defconfig. Tai veikia tik jei konfigūracija yra pačiame Das U-Boot, kitaip turėsite rasti gamintojo konfigūraciją ir įdėti ją į saugyklos šaknį faile .config, arba surinkti kitu gamintojo rekomenduojamu būdu.
  4. Mes surenkame patį įkrovos įkrovos vaizdą naudodami kryžminį kompiliatorių armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Kaip rezultatas, mes gauname failą u-boot.imx, tai yra paruoštas vaizdas, kurį galima įrašyti į „flash drive“. Rašome į SD kortelę, praleidžiame pirmuosius 1024 baitus. Kodėl pasirinkau Target u-boot.imx? Kodėl praleidau būtent 1024 baitus? Būtent tai jie siūlo padaryti dokumentacija. Kitų plokščių vaizdo kūrimo ir įrašymo procesas gali šiek tiek skirtis.

Atlikta, galite paleisti. Įkrovos įkroviklis turi pranešti apie savo versiją, šiek tiek informacijos apie plokštę ir bandyti rasti branduolio vaizdą skaidinyje. Jei nepavyks, jis bandys paleisti per tinklą. Apskritai išvestis yra gana išsami, galite rasti klaidą, jei yra problema.

Vietoj išvados

Ar žinojote, kad delfino kakta nėra kaulėta? Tai tiesiogine prasme trečioji akis, riebalinis lęšis echolokacijai!

GNU/Linux paleidimas ARM plokštėje nuo nulio (kaip pavyzdžiu naudojant Kali ir iMX.6)

GNU/Linux paleidimas ARM plokštėje nuo nulio (kaip pavyzdžiu naudojant Kali ir iMX.6)

Šaltinis: www.habr.com