Zagon GNU/Linuxa na plošči ARM iz nič (z uporabo Kali in iMX.6 kot primera)

tl;: Gradim sliko Kali Linux za računalnik ARM v programu debootstrap, linux и u-boot.

Zagon GNU/Linuxa na plošči ARM iz nič (z uporabo Kali in iMX.6 kot primera)

Če ste kupili kakšno manj priljubljeno programsko opremo za eno ploščo, se lahko soočite s pomanjkanjem podobe vaše najljubše distribucije zanjo. Približno enako se je zgodilo z načrtovani Flipper One. Enostavno ni Kali Linuxa za IMX6 (pripravljam), zato ga moram sestaviti sam.

Postopek prenosa je precej preprost:

  1. Strojna oprema je inicializirana.
  2. Z nekega področja na pomnilniški napravi (kartica SD/eMMC/itd.) se zagonski nalagalnik prebere in izvede.
  3. Zagonski nalagalnik poišče jedro operacijskega sistema in ga naloži v neko pomnilniško območje ter ga izvede.
  4. Jedro naloži preostali OS.

Ta stopnja podrobnosti je dovolj za mojo nalogo, lahko preberete podrobnosti v drugem članku. Zgoraj omenjena »nekatera« področja se razlikujejo od plošče do plošče, kar povzroča nekatere težave pri namestitvi. Nalaganje strežniških platform ARM poskuša standardizirati z uporabo UEFI, a čeprav to ni na voljo vsem, boste morali vse sestaviti posebej.

Gradnja korenskega datotečnega sistema

Najprej morate pripraviti odseke. Das U-Boot podpira različne datotečne sisteme, jaz sem izbral FAT32 /boot in ext3 za root, to je standardna postavitev slike za Kali na ARM. Uporabil bom GNU Parted, vendar lahko storite enako na bolj znan način fdisk. Potrebovali boste tudi dosfstools и e2fsprogs ustvariti datotečni sistem: apt install parted dosfstools e2fsprogs.

Kartico SD označimo:

  1. Označite kartico SD kot uporabo particioniranja MBR: parted -s /dev/mmcblk0 mklabel msdos
  2. Ustvari razdelek pod /boot za 128 megabajtov: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Prvi zgrešeni megabajt je treba pustiti za samo oznako in za zagonski nalagalnik.
  3. Ustvarimo korenski datotečni sistem za celotno preostalo kapaciteto: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Če nenadoma vaše particijske datoteke niso bile ustvarjene ali se niso spremenile, morate zagnati `partprobe`, nato pa bo particijska tabela ponovno prebrana.
  5. Ustvarite datotečni sistem za zagonsko particijo z oznako BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Ustvarite korenski datotečni sistem z oznako ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Super, zdaj ga lahko izpolnite. Za to boste dodatno potrebovali debootstrap, pripomoček za ustvarjanje korenskih datotečnih sistemov za operacijske sisteme, podobne Debianu: apt install debootstrap.

Zbiramo FS:

  1. Namestite particijo /mnt/ (uporabite bolj priročno točko pritrditve): mount /dev/mmcblk0p2 /mnt
  2. Pravzaprav zapolnimo datotečni sistem: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali... Parameter --include označuje dodatno namestitev nekaterih paketov, določil sem statično zgrajen emulator QEMU. Omogoča vam izvedbo chroot v okolju ARM. Pomen preostalih možnosti najdete v man debootstrap. Ne pozabite, da vsaka plošča ARM ne podpira arhitekture armhf.
  3. Zaradi razlike v arhitekturi debootstrap se izvaja v dveh fazah, druga se izvaja takole: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Zdaj ga morate zajebati: chroot /mnt /bin/bash
  5. Izpolnimo /etc/hosts и /etc/hostname ciljni FS. Izpolnite enako kot vsebino v vašem lokalnem računalniku, le ne pozabite zamenjati imena gostitelja.
  6. Vse ostalo lahko prilagodite. Posebej nameščam locales (ključi repozitorija), znova konfigurirajte lokalne nastavitve in časovni pas (dpkg-reconfigure locales tzdata). Ne pozabite nastaviti gesla z ukazom passwd.
  7. Nastavite geslo za root ekipa passwd.
  8. Priprava slike se zame konča s polnjenjem /etc/fstab znotraj /mnt/.

Naložil bom v skladu s prej ustvarjenimi oznakami, zato bo vsebina takšna:

LABEL=ROOTFS / samodejne napake=remount-ro 0 1
LABEL=BOOT /boot auto privzete vrednosti 0 0

Končno lahko namestite zagonsko particijo, potrebovali jo bomo za jedro: `mount /dev/mmcblk0p1 /mnt/boot/`

Zgradba Linuxa

Če želite zgraditi jedro (in nato zagonski nalagalnik) na Debian Testing, morate namestiti standardni nabor datotek glave GCC, GNU Make in GNU C Library za ciljno arhitekturo (zame armhf), kot tudi glave OpenSSL, konzolni kalkulator bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Ker privzeti nalagalnik išče datoteko zImage na datotečnem sistemu zagonske particije je čas, da razdelite bliskovni pogon.

  1. Kloniranje jedra traja predolgo, zato bom samo prenesel: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Razpakirajmo in pojdimo v izvorni imenik: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Konfigurirajte pred kompilacijo: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Konfiguracija se nahaja v imeniku arch/arm/configs/. Če je ni, lahko poskusite poiskati in prenesti že pripravljeno ter posredovati ime datoteke v tem imeniku kot parameter KBUILD_DEFCONFIG. V skrajnem primeru takoj preidite na naslednjo točko.
  3. Po želji lahko prilagodite nastavitve: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. In navzkrižno prevedite sliko: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Zdaj lahko kopirate datoteko jedra: cp arch/arm/boot/zImage /mnt/boot/
  6. In datoteke iz DeviceTree (opis strojne opreme na plošči): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. In namestite module, zbrane v obliki ločenih datotek: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Jedro je pripravljeno. Odmontirate lahko vse: umount /mnt/boot/ /mnt/

Das U-Boot

Ker je zagonski nalagalnik interaktiven, je vse, kar potrebujete za preizkus njegovega delovanja, sama plošča, naprava za shranjevanje in opcijsko naprava USB-to-UART. To pomeni, da lahko jedro in OS odložite za pozneje.

Velika večina proizvajalcev ponuja uporabo Das U-Boot za začetni zagon. Popolna podpora je običajno zagotovljena v njihovih lastnih vilicah, vendar ne pozabijo prispevati v zgornjem toku. V mojem primeru je plošča podprta v glavna linijaTako vilice Ignoriral sem ga.

Sestavimo sam zagonski nalagalnik:

  1. Kloniramo stabilno vejo repozitorija: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Pojdimo do samega imenika: cd u-boot
  3. Priprava konfiguracije gradnje: make mx6ull_14x14_evk_defconfig. To deluje samo, če je konfiguracija v samem Das U-Boot, sicer boste morali poiskati konfiguracijo proizvajalca in jo dati v koren repozitorija v datoteki .config, ali sestavite na drug način, ki ga priporoča proizvajalec.
  4. Samo sliko zagonskega nalagalnika sestavimo s pomočjo navzkrižnega prevajalnika armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Kot rezultat dobimo datoteko u-boot.imx, to je že pripravljena slika, ki jo je mogoče zapisati na bliskovni pogon. Zapisujemo na kartico SD, pri čemer preskočimo prvih 1024 bajtov. Zakaj sem izbral Target u-boot.imx? Zakaj sem zgrešil točno 1024 bajtov? To predlagajo v dokumentacijo. Pri drugih ploščah je lahko postopek gradnje in snemanja slike nekoliko drugačen.

Končano, lahko zaženete. Zagonski nalagalnik mora sporočiti svojo različico, nekaj informacij o plošči in poskusiti najti sliko jedra na particiji. Če ne uspe, se bo poskusil zagnati prek omrežja. Na splošno je izpis precej podroben, če je težava, lahko najdete napako.

Namesto zaključka

Ste vedeli, da delfinovo čelo ni koščeno? To je dobesedno tretje oko, mastna leča za eholokacijo!

Zagon GNU/Linuxa na plošči ARM iz nič (z uporabo Kali in iMX.6 kot primera)

Zagon GNU/Linuxa na plošči ARM iz nič (z uporabo Kali in iMX.6 kot primera)

Vir: www.habr.com