tl;dr: Събирам образ на Kali Linux за ARM компютър, в програмата debootstrap, linux и u-boot.
Ако сте закупили някакво не много популярно едноплатно устройство, може да сте се сблъскали с липсата на образ на предпочитания дистрибутив. Приблизително същото стана и с . Kali Linux за IMX6 просто няма (аз го подготвям), затова трябва да се събира самостоятелно.
Процесът на зареждане е достатъчно прост:
- Инициализира се хардуерът.
- От някаква област на запомнящото устройство (SD карта/eMMC/и т.н.) се прочита и изпълнява зареждач.
- Зареждачът търси ядрото на операционната система и го зарежда в някаква област от паметта и го изпълнява.
- Ядрото зарежда всичките останали компоненти на ОС.
За моята задача този ниво на детайлност е достатъчно, подробности можете да прочетете . Посочените по-горе "някои" области се различават от платка на платка, което създава определени усложнения с инсталацията. Опитват се да стандартизират зареждането на ARM сървърни платформи Сглобяване на кореновата файлова система
Първо, трябва да подготвите разделите. U-Boot поддържа различни файлови системи, избрах FAT32 за
и ext3 за корен, това е стандартната схема за образите на Kali под ARM. Ще използвам GNU Parted, но можете да направите същото по-удобно /boot fdisk . Също така ще са необходимиdosfstools за създаване на файлови системи: и e2fsprogs apt install parted dosfstools e2fsprogs Размечаваме SD картата:.
Отбелязваме SD картата като използваща MBR схема:
- parted -s /dev/mmcblk0 mklabel msdos
Създаваме раздел за - 128 мегабайта:
/bootparted -s /dev/mmcblk0 mkpart primary fat32 1MiB 128MiB. Първият пропуснат мегабайт трябва да бъде оставен за самата схема и зареждача.Създаваме коренова файлова система за цялата останала памет: - parted -s /dev/mmcblk0 mkpart primary ext4 128MiB 100%
Ако случайно не сте създали или не сте променили файловете на разделите, трябва да изпълните `partprobe`, тогава таблицата на разделите ще бъде прочетена отново. - Създаваме файлова система на зареждащия раздел с етикет
- mkfs.vfat -n BOOT -F 32 -v /dev/mmcblk0p1
BOOT:Създаваме коренова файлова система с етикет - ROOTFS
mkfs.ext3 -L ROOTFS /dev/mmcblk0p2:Отлично, сега можем да я запълним. За това допълнително ще е необходима
, утилита за създаване на коренови файлови системи за Debian-подобни операционни системи: debootstrapapt install debootstrap Сглобяваме файловата система:.
Монтираме раздела в
- (използвайте по-удобна за вас точка на монтиране):
/mnt/mount /dev/mmcblk0p2 /mntмонтиране на /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:
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 за първично зареждане. Пълна поддръжка обикновено се осигурява в собствен fork, но и в upstream не забравят да контрибуират. В моя случай платката се поддържа в , следователно го игнорирах.
Събираме самия зареждач:
- Клонираме стабилната версия на репозитория:
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
