ТЛ; інш: збіраю выяву Kali Linux для ARM-кампутара, у праграме debootstrap
, linux
и u-boot
.
Калі вы куплялі які-небудзь не вельмі папулярны аднаплатнік, то маглі сутыкнуцца з адсутнасцю для яго выявы каханага дыстрыбутыва. Прыблізна тое ж самае здарылася з
Працэс загрузкі дастаткова просты:
- Ініцыялізуецца жалеза.
- З некаторай вобласці на запамінальнай прылады (SD-карта/eMMC/etc) счытваецца і выконваецца загрузнік.
- Загрузнік шукае ядро аперацыйнай сістэмы і загружае яго ў некаторую вобласць памяці і выконвае.
- Ядро загружае ўсю астатнюю АС.
Для маёй задачы хапае такога ўзроўню дэталізацыі, падрабязнасці можаце прачытаць
Зборка каранёвай файлавай сістэмы
Для пачатку трэба падрыхтаваць раздзелы. Das U-Boot падтрымлівае розныя ФС, я абраў FAT32 для /boot
і ext3 для кораня, гэта стандартная разметка выяў для Kali пад ARM. Я скарыстаюся GNU Parted, але вы можаце зрабіць тое ж самае больш звыклым fdisk
. Таксама спатрэбяцца dosfstools
и e2fsprogs
для стварэння ФС: apt install parted dosfstools e2fsprogs
.
Раззначаем SD-карту:
- Адзначаем SD-карту як якая выкарыстоўвае MBR-разметку:
parted -s /dev/mmcblk0 mklabel msdos
- Ствараем раздзел пад
/boot
на 128 мегабайт:parted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB
. Першы прапушчаны мегабайт неабходна пакінуць пад саму разметку і пад загрузнік. - Ствараем каранёвую ФС на ўсю астатнюю ёмістасць:
parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
- Калі раптам у вас не стварыліся ці не змяніліся файлы частак, трэба выканаць `partprobe`, тады табліца частак будзе перачытаная.
- Ствараем файлавую сістэму загрузнай часткі з пазнакай
BOOT
:mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
- Ствараем каранёвую ФС з пазнакай
ROOTFS
:mkfs.ext3 -L ROOTFS /dev/mmcblk0p2
Выдатна, зараз можна яе запаўняць. Для гэтага дадаткова спатрэбіцца debootstrap
, утыліта для стварэння каранёвых ФС Debian-падобных аперацыйных сістэм: apt install debootstrap
.
Збіраны ФС:
- Мантуем раздзел у
/mnt/
(выкарыстоўвайце зручнейшую для сябе кропку мантавання):mount /dev/mmcblk0p2 /mnt
- Уласна запаўняем файлавую сістэму:
debootstrap --foreign --include=qemu-user-static --arch armhf kali-rolling /mnt/ http://http.kali.org/kali
. Параметр--include
паказвае дадаткова ўсталяваць некаторыя пакеты, я паказаў статычна сабраны эмулятар QEMU. Ён дазваляе выконвацьchroot
у ARM-асяроддзе. Сэнс астатніх опцый можна паглядзець уman debootstrap
. Не забудзьцеся, што не любая ARM-плата падтрымлівае архітэктуруarmhf
. - З-за розніцы архітэктур
debootstrap
выконваецца ў два этапы, другі выконваецца так:chroot /mnt/ /debootstrap/debootstrap --second-stage
- Цяпер трэба зачарціцца:
chroot /mnt /bin/bash
- Запаўняем
/etc/hosts
и/etc/hostname
мэтавай ФС. Запоўніце па аналогіі са змесцівам на вашым лакальным кампутары, не забудзьцеся толькі замяніць імя хаста. - Можна даналадзіць усё астатняе. У прыватнасці я даўсталёўваю
locales
(ключы рэпазітара), пераналаджваю лакалі і гадзінны пояс (dpkg-reconfigure locales tzdata
). Не забудзьцеся задаць пароль камандайpasswd
. - Задаем пароль для
root
камандайpasswd
. - Падрыхтоўка выявы для мяне завяршаецца запаўненнем
/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
на файлавай сістэме загрузнай часткі, сітавіна разбіваць флешку.
- Кланаваць ядро занадта доўга, таму проста спампоўваю:
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
- Канфігуруем перад кампіляцыяй:
make ARCH=arm KBUILD_DEFCONFIG=imx_v6_v7_defconfig defconfig
. Канфіг знаходзіцца ў дырэкторыіarch/arm/configs/
. Калі такога няма, вы можаце паспрабаваць знайсці і спампаваць гатовы і перадаць назву файла ў гэтай дырэкторыі ў параметрKBUILD_DEFCONFIG
. У крайнім выпадку адразу пераходзіце да наступнага пункта. - Апцыянальна можна дакруціць налады:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
- І краскампілюем вобраз:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
- Цяпер можна скапіяваць файлік з ядром:
cp arch/arm/boot/zImage /mnt/boot/
- І файлы з DeviceTree (апісанне наяўнага на плаце жалеза):
cp arch/arm/boot/dts/*.dtb /mnt/boot/
- І даўсталяваць сабраныя ў выглядзе асобных файлаў модулі:
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 для першаснай загрузкі. Паўнавартасная падтрымка звычайна забяспечваецца ва ўласным форцы, але і ў апстрым контрибьютить не забываюць. У маім выпадку плата падтрымліваецца ў
Збіраны сам загрузнік:
- Клануем стабільную галіну рэпазітара:
git clone https://gitlab.denx.de/u-boot/u-boot.git -b v2020.10
- Пераходзім у саму дырэкторыю:
cd u-boot
- Рыхтуем канфігурацыю зборкі:
make mx6ull_14x14_evk_defconfig
. Гэта працуе толькі калі канфігурацыя ёсць у самім Das U-Boot, у іншым выпадку вам запатрабуецца знайсці канфіг вытворцы і пакласці яго ў корань рэпазітара ў файл.config
, або сабраць іншым рэкамендаваным вытворцам чынам. - Збіраны сам вобраз загрузніка крос-кампілятарам
armhf
:make CROSS_COMPILE=arm-linux-gnueabihf- u-boot.imx
У выніку мы атрымліваем файл u-boot.imx
, гэта гатовы вобраз, які можна запісваць на флешку. Запісваем на SD-карту, прапусціўшы першыя 1024 байта. Чаму я абраў таргет u-boot.imx
? Чаму прапусціў менавіта 1024 байты? Так прапануюць зрабіць у
Гатова, можна загрузіцца. Загрузнік павінен паведаміць уласную версію, некаторую інфармацыю аб плаце і паспрабаваць знайсці выяву ядра на раздзеле. У выпадку няўдачы будзе спрабаваць загрузіцца па сетцы. У цэлым выснова даволі падрабязная, можна знайсці памылку ў выпадку праблемы.
замест заключэння
А вы ведалі, што лоб у дэльфіна не касцісты? Гэта літаральна трэцяе вока, тлушчавая лінза для рэхалакацыі!
Крыніца: habr.com