- PVSM.RU - https://www.pvsm.ru -
tl;dr: собираю образ Kali Linux для ARM-компьютера, в программе debootstrap
, linux
и u-boot
.
Если вы покупали какой-нибудь не очень популярный одноплатник, то могли столкнуться с отсутствием для него образа любимого дистрибутива. Приблизительно то же самое случилось с планируемым Flipper One [2]. Kali Linux под IMX6 просто нету (я готовлю), поэтому собирать приходится самостоятельно.
Процесс загрузки достаточно простой:
Для моей задачи хватает такого уровня детализации, подробности можете прочесть в другой статье [3]. Упомянутые выше «некоторые» области отличаются от платы к плате, что и создаёт некоторые сложности с установкой. Загрузку серверных ARM-платформ пытаются стандартизовать [4] с помощью UEFI, но покуда это доступно не для всех, придётся собирать всё по отдельности.
Для начала нужно подготовить разделы. Das U-Boot поддерживает разные ФС, я выбрал FAT32 для /boot
и ext3 для корня, это стандартная разметка образов для Kali под ARM. Я воспользуюсь GNU Parted, но вы можете сделать то же самое более привычным fdisk
. Также понадобятся dosfstools
и e2fsprogs
для создания ФС: apt install parted dosfstools e2fsprogs
.
Размечаем SD-карту:
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%
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/`
Для сборки ядра (и загрузчика потом) на 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/
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/
Так как загрузчик интерактивный, для проверки его работы достаточно самой платы, запоминающего устройства и опционально устройства USB-to-UART. То есть, можно ядро и ОС отложить на потом.
Абсолютное большинство производителей предлагают использовать Das U-Boot для первичной загрузки. Полноценная поддержка обычно обеспечивается в собственном форке, но и в апстрим контрибьютить не забывают. В моём случае плата поддерживается в мейнлайне [5], поэтому форк [6] я проигнорировал.
Cобираем сам загрузчик:
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 байта? Так предлагают сделать в документации [7]. Для других плат процесс сборки образа и записи может немного отличаться.
Готово, можно загрузиться. Загрузчик должен сообщить собственную версию, некоторую информацию о плате и попытаться найти образ ядра на разделе. В случае неудачи будет пытаться загрузиться по сети. В целом вывод довольно подробный, можно найти ошибку в случае проблемы.
А вы знали, что лоб у дельфина не костистый? Это буквально третий глаз, жировая линза для эхолокации!
Автор: morq
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/358144
Ссылки в тексте:
[1] Image: https://habr.com/ru/company/ruvds/blog/524532/
[2] планируемым Flipper One: https://habr.com/post/490196/
[3] в другой статье: https://habr.com/post/338806/
[4] пытаются стандартизовать: https://developer.arm.com/documentation/den0044/12/
[5] мейнлайне: https://gitlab.denx.de/u-boot/u-boot
[6] форк: https://github.com/Freescale/u-boot-fslc
[7] документации: https://gitlab.denx.de/u-boot/u-boot/-/blob/master/doc/imx/mkimage/imximage.txt
[8] Источник: https://habr.com/ru/post/524532/?utm_source=habrahabr&utm_medium=rss&utm_campaign=524532
Нажмите здесь для печати.