Заводзім GNU/Linux на ARM-плаце з нуля (на прыкладзе Kali і iMX.6)

ТЛ; інш: збіраю выяву Kali Linux для ARM-кампутара, у праграме debootstrap, linux и u-boot.

Заводзім GNU/Linux на ARM-плаце з нуля (на прыкладзе Kali і iMX.6)

Калі вы куплялі які-небудзь не вельмі папулярны аднаплатнік, то маглі сутыкнуцца з адсутнасцю для яго выявы каханага дыстрыбутыва. Прыблізна тое ж самае здарылася з планаваным Flipper One. Kali Linux пад IMX6 проста няма (я рыхтую), таму збіраць даводзіцца самастойна.

Працэс загрузкі дастаткова просты:

  1. Ініцыялізуецца жалеза.
  2. З некаторай вобласці на запамінальнай прылады (SD-карта/eMMC/etc) счытваецца і выконваецца загрузнік.
  3. Загрузнік шукае ядро ​​аперацыйнай сістэмы і загружае яго ў некаторую вобласць памяці і выконвае.
  4. Ядро загружае ўсю астатнюю АС.

Для маёй задачы хапае такога ўзроўню дэталізацыі, падрабязнасці можаце прачытаць у іншым артыкуле. Згаданыя вышэй «некаторыя» вобласці адрозніваюцца ад платы да платы, што і стварае некаторыя складанасці з усталёўкай. Загрузку серверных ARM-платформ спрабуюць стандартызаваць з дапамогай UEFI, але пакуль гэта даступна не для ўсіх, давядзецца збіраць усё па асобнасці.

Зборка каранёвай файлавай сістэмы

Для пачатку трэба падрыхтаваць раздзелы. Das U-Boot падтрымлівае розныя ФС, я абраў FAT32 для /boot і ext3 для кораня, гэта стандартная разметка выяў для Kali пад ARM. Я скарыстаюся GNU Parted, але вы можаце зрабіць тое ж самае больш звыклым fdisk. Таксама спатрэбяцца dosfstools и e2fsprogs для стварэння ФС: apt install parted dosfstools e2fsprogs.

Раззначаем SD-карту:

  1. Адзначаем SD-карту як якая выкарыстоўвае MBR-разметку: parted -s /dev/mmcblk0 mklabel msdos
  2. Ствараем раздзел пад /boot на 128 мегабайт: parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Першы прапушчаны мегабайт неабходна пакінуць пад саму разметку і пад загрузнік.
  3. Ствараем каранёвую ФС на ўсю астатнюю ёмістасць: parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
  4. Калі раптам у вас не стварыліся ці не змяніліся файлы частак, трэба выканаць `partprobe`, тады табліца частак будзе перачытаная.
  5. Ствараем файлавую сістэму загрузнай часткі з пазнакай BOOT: mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
  6. Ствараем каранёвую ФС з пазнакай ROOTFS: mkfs.ext3 -L ROOTFS /dev/mmcblk0p2

Выдатна, зараз можна яе запаўняць. Для гэтага дадаткова спатрэбіцца debootstrap, утыліта для стварэння каранёвых ФС Debian-падобных аперацыйных сістэм: apt install debootstrap.

Збіраны ФС:

  1. Мантуем раздзел у /mnt/ (выкарыстоўвайце зручнейшую для сябе кропку мантавання): mount /dev/mmcblk0p2 /mnt
  2. Уласна запаўняем файлавую сістэму: debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali. Параметр --include паказвае дадаткова ўсталяваць некаторыя пакеты, я паказаў статычна сабраны эмулятар QEMU. Ён дазваляе выконваць chroot у ARM-асяроддзе. Сэнс астатніх опцый можна паглядзець у man debootstrap. Не забудзьцеся, што не любая ARM-плата падтрымлівае архітэктуру armhf.
  3. З-за розніцы архітэктур debootstrap выконваецца ў два этапы, другі выконваецца так: chroot /mnt/ /debootstrap/debootstrap --second-stage
  4. Цяпер трэба зачарціцца: chroot /mnt /bin/bash
  5. Запаўняем /etc/hosts и /etc/hostname мэтавай ФС. Запоўніце па аналогіі са змесцівам на вашым лакальным кампутары, не забудзьцеся толькі замяніць імя хаста.
  6. Можна даналадзіць усё астатняе. У прыватнасці я даўсталёўваю locales (ключы рэпазітара), пераналаджваю лакалі і гадзінны пояс (dpkg-reconfigure locales tzdata). Не забудзьцеся задаць пароль камандай passwd.
  7. Задаем пароль для root камандай passwd.
  8. Падрыхтоўка выявы для мяне завяршаецца запаўненнем /etc/fstab ўнутры /mnt/.

Загружаць буду ў адпаведнасці са створанымі раней пазнакамі, таму змесціва будзе такім:

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

Нарэшце, можна прымантаваць загрузную частку, ён нам спатрэбіцца для ядра: `mount /dev/mmcblk0p1 /mnt/boot/`

Зборка Linux

Для зборкі ядра (і загрузніка потым) на Debian Testing трэба ўсталяваць стандартны набор з GCC, GNU Make і загалоўкавых файлаў GNU C Library для мэтавай архітэктуры (у мяне armhf), а таксама загалоўкі OpenSSL, кансольны калькулятар bc, bison и flex: apt install crossbuild-essential-armhf bison flex libssl-dev bc. Так як загрузнік па змаўчанні шукае файл zImage на файлавай сістэме загрузнай часткі, сітавіна разбіваць флешку.

  1. Кланаваць ядро ​​занадта доўга, таму проста спампоўваю: wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz. Распакуем і пяройдзем у дырэкторыю з зыходнікамі: tar -xf linux-5.9.1.tar.xz && cd linux-5.9.1
  2. Канфігуруем перад кампіляцыяй: make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig. Канфіг знаходзіцца ў дырэкторыі arch/arm/configs/. Калі такога няма, вы можаце паспрабаваць знайсці і спампаваць гатовы і перадаць назву файла ў гэтай дырэкторыі ў параметр KBUILD_DEFCONFIG. У крайнім выпадку адразу пераходзіце да наступнага пункта.
  3. Апцыянальна можна дакруціць налады: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
  4. І краскампілюем вобраз: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  5. Цяпер можна скапіяваць файлік з ядром: cp arch/arm/boot/zImage /mnt/boot/
  6. І файлы з DeviceTree (апісанне наяўнага на плаце жалеза): cp arch/arm/boot/dts/*.dtb /mnt/boot/
  7. І даўсталяваць сабраныя ў выглядзе асобных файлаў модулі: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- INSTALL_MOD_PATH=/mnt/ modules_install

Ядро гатова. Можна ўсё адмантаваць: umount /mnt/boot/ /mnt/

Das U-Boot

Бо загрузнік інтэрактыўны, для праверкі яго працы досыць самай платы, запамінальнай прылады і апцыянальна прылады USB-to-UART. Гэта значыць, можна ядро ​​і АС адкласці на потым.

Абсалютная большасць вытворцаў прапануюць выкарыстоўваць Das U-Boot для першаснай загрузкі. Паўнавартасная падтрымка звычайна забяспечваецца ва ўласным форцы, але і ў апстрым контрибьютить не забываюць. У маім выпадку плата падтрымліваецца ў мэйнлайне, таму відэлец я праігнараваў.

Збіраны сам загрузнік:

  1. Клануем стабільную галіну рэпазітара: git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
  2. Пераходзім у саму дырэкторыю: cd u-boot
  3. Рыхтуем канфігурацыю зборкі: make mx6ull_14x14_evk_defconfig. Гэта працуе толькі калі канфігурацыя ёсць у самім Das U-Boot, у іншым выпадку вам запатрабуецца знайсці канфіг вытворцы і пакласці яго ў корань рэпазітара ў файл .config, або сабраць іншым рэкамендаваным вытворцам чынам.
  4. Збіраны сам вобраз загрузніка крос-кампілятарам armhf: make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx

У выніку мы атрымліваем файл u-boot.imx, гэта гатовы вобраз, які можна запісваць на флешку. Запісваем на SD-карту, прапусціўшы першыя 1024 байта. Чаму я абраў таргет u-boot.imx? Чаму прапусціў менавіта 1024 байты? Так прапануюць зрабіць у дакументацыі. Для іншых поплаткаў працэс зборкі выявы і запісы можа трохі адрознівацца.

Гатова, можна загрузіцца. Загрузнік павінен паведаміць уласную версію, некаторую інфармацыю аб плаце і паспрабаваць знайсці выяву ядра на раздзеле. У выпадку няўдачы будзе спрабаваць загрузіцца па сетцы. У цэлым выснова даволі падрабязная, можна знайсці памылку ў выпадку праблемы.

замест заключэння

А вы ведалі, што лоб у дэльфіна не касцісты? Гэта літаральна трэцяе вока, тлушчавая лінза для рэхалакацыі!

Заводзім GNU/Linux на ARM-плаце з нуля (на прыкладзе Kali і iMX.6)

Заводзім GNU/Linux на ARM-плаце з нуля (на прыкладзе Kali і iMX.6)

Крыніца: habr.com