Pagsisimula ng GNU/Linux sa isang ARM board mula sa simula (gamit ang Kali at iMX.6 bilang isang halimbawa)

tl; dr: Bumubuo ako ng imahe ng Kali Linux para sa isang ARM computer, sa programa debootstrap, linux ΠΈ u-boot.

Pagsisimula ng GNU/Linux sa isang ARM board mula sa simula (gamit ang Kali at iMX.6 bilang isang halimbawa)

Kung bumili ka ng hindi masyadong sikat na single-payer, maaaring makatagpo ka ng kakulangan ng larawan ng iyong paboritong distribution kit para dito. Halos pareho ang nangyari nakaplanong Flipper One. Walang Kali Linux para sa IMX6 (nagluluto ako), kaya kailangan ko itong i-assemble mismo.

Ang proseso ng pag-download ay medyo simple:

  1. Pinasimulan ang hardware.
  2. Mula sa ilang lugar sa storage device (SD card/eMMC/etc) ang bootloader ay binabasa at isinasagawa.
  3. Hinahanap ng loader ang kernel ng operating system at nilo-load ito sa ilang lugar ng memorya at ipapatupad ito.
  4. Nilo-load ng kernel ang natitirang bahagi ng OS.

Para sa aking gawain, ang antas ng detalyeng ito ay sapat na, maaari mong basahin ang mga detalye sa ibang artikulo. Ang "ilang" mga lugar na binanggit sa itaas ay naiiba sa bawat board, na lumilikha ng ilang mga paghihirap sa pag-install. Naglo-load ng mga platform ng ARM ng server sinusubukang i-standardize gamit ang UEFI, ngunit hangga't hindi ito magagamit para sa lahat, kakailanganin mong kolektahin ang lahat nang hiwalay.

Pagbuo ng root filesystem

Una kailangan mong maghanda ng mga seksyon. Sinusuportahan ng Das U-Boot ang iba't ibang mga file system, pinili ko ang FAT32 para sa /boot at ext3 para sa ugat, ito ang karaniwang markup ng imahe para sa Kali sa ilalim ng ARM. Gagamitin ko ang GNU Parted, ngunit maaari mong gawing mas pamilyar ang parehong fdisk. Kakailanganin mo rin dosfstools ΠΈ e2fsprogs upang lumikha ng isang filesystem: apt install parted dosfstools e2fsprogs.

Paghati sa SD card:

  1. Markahan ang SD card bilang gumagamit ng MBR partitioning: parted -s /dev/mmcblk0 mklabel msdos
  2. Gumawa ng seksyon para sa /boot para sa 128 megabytes: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Ang unang napalampas na megabyte ay dapat na iwan para sa markup mismo at para sa bootloader.
  3. Gumawa ng root FS para sa natitirang kapasidad: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Kung biglang hindi ka nakagawa o nagbago ng mga partition file, kailangan mong i-execute ang `partprobe`, pagkatapos ay muling babasahin ang partition table.
  5. Gumawa ng boot partition filesystem na may label BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Gumawa ng root filesystem na may label ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Mahusay, maaari mo na itong punan. Ito ay karagdagang mangangailangan debootstrap, isang utility para sa paglikha ng root FS sa mga operating system na katulad ng Debian: apt install debootstrap.

Kinokolekta namin ang FS:

  1. I-mount ang partition sa /mnt/ (gumamit ng mas maginhawang mount point para sa iyong sarili): mount /dev/mmcblk0p2 /mnt
  2. Sa totoo lang pinupuno namin ang file system: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Parameter --include tumutukoy sa karagdagang pag-install ng ilang mga pakete, tinukoy ko ang isang statically built QEMU emulator. Pinapayagan ka nitong gumanap chroot sa kapaligiran ng ARM. Ang kahulugan ng iba pang mga pagpipilian ay matatagpuan sa man debootstrap. Huwag kalimutan na hindi lahat ng ARM board ay sumusuporta sa arkitektura armhf.
  3. Dahil sa pagkakaiba ng mga arkitektura debootstrap ay ginaganap sa dalawang yugto, ang pangalawa ay ginaganap tulad ng sumusunod: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Ngayon ay kailangan mong iikot: chroot /mnt /bin/bash
  5. Pinuno namin /etc/hosts ΠΈ /etc/hostname target na FS. Punan ang parehong bilang ng nilalaman sa iyong lokal na computer, tandaan na palitan lamang ang hostname.
  6. Maaari mong i-customize ang lahat ng iba pa. Sa partikular, nag-install ako locales (mga repository key), muling pagsasaayos ng mga lokal at time zone (dpkg-reconfigure locales tzdata). Huwag kalimutang itakda ang password gamit ang command passwd.
  7. Magtakda ng password para sa root koponan passwd.
  8. Ang paghahanda ng imahe para sa akin ay nakumpleto sa pamamagitan ng pagpuno /etc/fstab sa loob /mnt/.

Mag-a-upload ako alinsunod sa mga tag na ginawa kanina, kaya ang nilalaman ay magiging ganito:

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

Sa wakas, maaari mong i-mount ang boot partition, kakailanganin namin ito para sa kernel: `mount /dev/mmcblk0p1 /mnt/boot/`

Pagbuo ng Linux

Upang buuin ang kernel (at ang bootloader sa ibang pagkakataon) sa Debian Testing, kailangan mong i-install ang karaniwang set ng GCC, GNU Make at ang GNU C Library header file para sa target na arkitektura (mayroon akong armhf), pati na rin ang mga header ng OpenSSL, console calculator bc, bison ΠΈ flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Dahil ang default loader ay naghahanap ng isang file zImage sa file system ng boot partition, oras na upang sirain ang flash drive.

  1. Ang pag-clone ng kernel ay masyadong mahaba, kaya ida-download ko na lang: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. I-unpack at pumunta sa source directory: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. I-configure bago i-compile: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Ang config ay nasa direktoryo arch/arm/configs/. Kung wala, maaari mong subukang maghanap at mag-download ng isang handa na at ipasa ang pangalan ng file sa direktoryo na ito sa parameter KBUILD_DEFCONFIG. Sa matinding mga kaso, pumunta kaagad sa susunod na talata.
  3. Maaari mong opsyonal na i-tweak ang mga setting: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. At i-cross-compile ang larawan: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Ngayon ay maaari mong kopyahin ang kernel file: cp arch/arm/boot/zImage /mnt/boot/
  6. At mga file mula sa DeviceTree (paglalarawan ng hardware na available sa board): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. At i-install ang mga module na binuo bilang hiwalay na mga file: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Ang kernel ay handa na. Maaari mong i-unmount ang lahat: umount /mnt/boot/ /mnt/

Das U Boot

Dahil ang bootloader ay interactive, ang board mismo, isang storage device, at isang opsyonal na USB-to-UART device ay sapat na upang subukan ang operasyon nito. Iyon ay, maaari mong ipagpaliban ang kernel at OS para sa ibang pagkakataon.

Iminumungkahi ng karamihan ng mga tagagawa ang paggamit ng Das U-Boot para sa pangunahing boot. Ang buong suporta ay karaniwang ibinibigay sa sarili nitong tinidor, ngunit huwag kalimutang mag-ambag sa upstream. Sa aking kaso, ang board ay suportado sa pangunahing linyaKaya tinidor hindi ko pinansin.

Kinokolekta namin ang bootloader mismo:

  1. I-clone ang matatag na sangay ng repositoryo: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Pumunta tayo sa mismong direktoryo: cd u-boot
  3. Inihahanda ang configuration ng build: make mx6ull_14x14_evk_defconfig. Gumagana lang ito kung ang configuration ay nasa Das U-Boot mismo, kung hindi, kakailanganin mong hanapin ang config ng manufacturer at ilagay ito sa root ng repository sa file .config, o binuo sa ibang paraan na inirerekomenda ng tagagawa.
  4. Kinokolekta namin ang imahe ng bootloader mismo gamit ang isang cross-compiler armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

Bilang resulta, nakukuha namin ang file u-boot.imx, ito ay isang yari na imahe na maaaring isulat sa isang USB flash drive. Sumulat kami sa SD card, nilaktawan ang unang 1024 byte. Bakit pinili ko ang target u-boot.imx? Bakit napalampas ang eksaktong 1024 bytes? Ito ang iminungkahi nilang gawin dokumentasyon. Para sa iba pang mga board, ang pagbuo ng imahe at proseso ng pagsunog ay maaaring bahagyang naiiba.

Tapos na, maaari mong i-download. Dapat iulat ng bootloader ang sarili nitong bersyon, ilang impormasyon tungkol sa board, at subukang hanapin ang kernel image sa partition. Kung nabigo ito, susubukan nitong mag-boot sa network. Sa pangkalahatan, ang output ay medyo detalyado, maaari kang makahanap ng isang error sa kaso ng isang problema.

Sa halip ng isang konklusyon

Alam mo ba na ang noo ng isang dolphin ay hindi bony? Ito ay literal na ikatlong mata, isang mataba na lente para sa echolocation!

Pagsisimula ng GNU/Linux sa isang ARM board mula sa simula (gamit ang Kali at iMX.6 bilang isang halimbawa)

Pagsisimula ng GNU/Linux sa isang ARM board mula sa simula (gamit ang Kali at iMX.6 bilang isang halimbawa)

Pinagmulan: www.habr.com