Git Product home page Git Product logo

linux-for-arm / handbook Goto Github PK

View Code? Open in Web Editor NEW
4.0 0.0 0.0 2.66 MB

Linux for ARM (LFA) - руководство по сборке из исходного кода системы, использующей ядро Linux, для компьютеров на архитектуре ARM. Данное руководство использует наработки проекта CLFS, а также ряд других источников, полный список которых приведён в списке литературы в самом руководстве.

Home Page: https://linux-for-arm.github.io

License: MIT License

CSS 78.55% Python 21.45%
allwinner arm arm64 broadcom lfa lfs linux rockchip soc embedded embedded-linux embedded-sys

handbook's Introduction

Linux for ARM

Linux for ARM (LFA) - руководство по сборке из исходного кода системы, использующей ядро Linux, для компьютеров на архитектуре ARM. Данное руководство использует наработки проекта CLFS, а также ряд других источников, полный список которых приведён в списке литературы в самом руководстве.

Мотивация

  • Есть руководство CLFS Embedded, но оно устарело.
  • Для ARM-девайсов существуют дистрибутивы GNU/Linux, но далеко не все из них могут считаться пригодными к использованию.
  • Отсутствие подобных русскоязычных руководств. Существуют разве что русские переводы LFS и LX4U, но они не описывают процесс сборки системы для ARM-процессоров.
  • Желание систематизировать сведения об ARM-девайсах в одном руководстве.
  • Желание спровоцировать развитие дистрибутивов для ARM-девайсов. Для тех же Repka Pi, которые появились пару лет назад.

Локальная сборка

Требования

  • rustc для сборки и установки программы mdbook;

Установка зависимостей

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
export PATH=$PATH:$HOME/.cargo/bin

cargo install mdbook mdbook-pdf mdbook-admonish

Сборка руководства

mdbook build # генерирует также PDF-версию руководства
mdbook serve --open
Донат

Вы можете отблагодарить автора за проделанную работу:

https://boosty.to/linux-for-arm

handbook's People

Contributors

mskrasnov avatar

Stargazers

 avatar  avatar  avatar  avatar

handbook's Issues

Ошибка сборки U-Boot

Проблема

Отсутствует SCP:

  BINMAN  .binman_stamp
Image 'u-boot-sunxi-with-spl' is missing external blobs and is non-functional: scp

/binman/u-boot-sunxi-with-spl/fit/images/scp/scp (scp.bin):
   SCP firmware is required for system suspend, but is otherwise optional.
   Please read the section on SCP firmware in board/sunxi/README.sunxi64

Some images are invalid
make: *** [Makefile:1115: .binman_stamp] Error 103

Решение

Требуется сборка двух кросс-компиляторов: для aarch64-linux-musleabifh и для or1k-linux-musl.

Формат ссылок

Пусть ссылки на страницы внутри руководства будут обычными, а ссылки на внешние источники выделены жирным шрифтом. Чтобы понимать, что относится к LFA, а что нет.

Кросс-компилятор `or1k-linux-musl`

Требуется собрать свой кросс-компилятор для or2k-linux-musl, чтобы пользователи, кому он нужен для сборки SCP (crust) для загрузчика U-Boot, не тратили своё время на сборку этого кросс-компилятора и не забивали голову ненужной информацией по его сборке.

Автоматизированная система сборки

В этом репозитории содержится исходный код будущей системы разработки. В её возможности должно входить:

  1. Выбор версии LFA, из которой будут использованы сборочные инструкции.
  2. Выбор материнской платы, для которой будет выполнена сборка.
  3. Выбор версии ядра, совместимого с этой платой (если для этой платы существует несколько версий ядра)
  4. Выбор метода конфигурации ядра (использование готового конфига, использование menuconfig, oldconfig или defconfig)
  5. Последовательная сборка пакетов ПО с фиксацией прогресса сборки и возможностью продолжения сборки с места остановки

`cross-compiler/gcc-p1`: инструкции по сборке и установке

make all-gcc all-target-libgcc
make install-gcc install-target-libgcc

Возможно, будет достаточно ввода следующих команд:

make
make install

Потому что базовая система требует наличия в свом составе библиотеки libgcc, которая почему-то в кросс-компиляторе отсутствует.

Ошибка сборки Wireless Tools

Проблема

На этапе установки:

install -m 755 -d /home/lfa/lfa/baseOS/usr/man//man7/
*** Don't forget to add /home/lfa/lfa/baseOS/usr/lib/ to /etc/ld.so.conf, and run ldconfig as root. ***
install -m 644 wireless.7 /home/lfa/lfa/baseOS/usr/man//man7/
install -m 755 -d /home/lfa/lfa/baseOS/usr/man//man5/
install -m 644 iftab.5 /home/lfa/lfa/baseOS/usr/man//man5/
ldconfig: File /usr/lib/libgnome-bluetooth.so.13.1.0 is empty, not checked.
ldconfig: File /usr/lib/libgnome-bluetooth.so.13 is empty, not checked.
ldconfig: File /usr/lib/libgnome-bluetooth.so is empty, not checked.
ldconfig: Can't create temporary cache file /etc/ld.so.cache~: Permission denied
*** Could not run ldconfig ! ***

Кроме того, в wget-list и md5sums отсутствуют архив с исходниками WT и нужный ему патч

Отключить поддержку PAM при сборке BusyBox

Убрать галочку с пункта

Settings --->
  < > Support PAM (Pluggable Authentication Modules)

Иначе при сборке пакета может возникнуть следующая проблема:

#      CC      networking/ifenslave.o
#    networking/httpd.c:300:11: fatal error: security/pam_appl.h: No such file or directory
#      300 | # include <security/pam_appl.h>
#          |           ^~~~~~~~~~~~~~~~~~~~~
#    compilation terminated.

LFA Community

LFA и LFAC

Предлагаю разделить руководство LFA на две части: в первой (этой) части будет всё то же самое, что и сейчас (сборка базовой системы), а в LFA Community будет дополнительное ПО и ряд советов по доп настройке системы (наподобие BLFS).

Разработка

LFAC должна иметь более "открытый" процесс разработки: сообщество должно самостоятельно добавлять нужное ПО в состав этого руководства, а от меня зависит только проверка корректности сборочных инструкций и их (не)одобрение в состав LFAC.

Процесс разработки LFA так и оставить в моих руках, новые программы и сведения добавлять только по мере необходимости, тк требуется сохранить минималистичность и простоту оригинальной LFA.

Заметки о строении Linux

Часть 1.

Общие сведения о системах Linux, что такое открытый исходный код и свободное ПО, а также из каких компонентов состоит каждый дистрибутив (GNU/)Linux.

  • Что такое операционная система
  • Встраиваемые системы
  • Информация о семействе UNIX
  • Что такое ОС, использующие ядро Linux
    • Ядро Linux
      • Свободное ПО (Linux и основные его компоненты являются свободным ПО)
      • Разработка ОС с ядром Linux
    • Основные компоненты ОС с ядром Linux
      • Загрузчик (GRUB, systemd-boot, syslinux, u-boot)
      • Набор стандартных утилит (GNU coreutils, uutils coreutils, BusyBox, ToyBox)
      • Система инициализации (SysVInit, OpenRC, Runit, upstart, systemd)
      • Командная оболочка (sh, bash, zsh, csh, tcsh, fish, nushell)
      • Графический интерфейс (X-сервер, протокол Wayland, рабочие окружения GNOME и KDE)

Часть 2.

Процесс загрузки ОС Linux на ARM-компьютерах. Можно также сравнить процесс загрузки на ARM с процессом загрузки на x86(_64).

Часть 3.

Информация о системах инициализации, доступных для Linux:

  • SysVInit
  • OpenRC
  • Runit
  • systemd

Будет неплохим привести сравнительную таблицу разных систем инициализации друг с другом.

Часть 4.

Данные о стандартных утилитах UNIX, их предназначение, виды (GNU Coreutils, uutils coreutils, busybox, toybox, etc.) и примеры использования.

Создание директории `$LFA_SYS/lib64`

В кросс-компиляторе эта директория создаётся автоматически при необходимости. А в $LFA_SYS её нужно создавать самостоятельно, если система собирается для 64-битной архитектуры.

Ошибка сборки TF-A

Проблема

При клонировании репозитория из инструкции по сборке загрузчика для Allwinner клонируется либо что-то не то, либо что-то не так, но при исполнении команды make CROSS_COMPILE=... PLAT=... DEBUG=1 не происходит ровным счётом ничего.

Однако если скачать какой-либо релизный архив из их git-репозитория (например https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/snapshot/trusted-firmware-a-lts-v2.10.2.tar.gz), то сборка идёт отлично.

Решение

Добавить ссылку на TF-A в wget-list и md5sums, пусть это будет самостоятельный пакет в рамках руководства LFA.

Больше сведений о файле uImage

Проблема

На данный момент в руководстве представлены только инструкции о том, как создать этот uImage, на этом всё. Других сведений нет. Нужно описать предназначение образа uImage и то, как ещё его можно использовать.

Неправильная команда сборки U-Boot (`bootloader/allwinner.md`)

[Сборка](http://localhost:3000/bootloader/allwinner.html#%D0%A1%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-1)

make

Файл, содержащий всё необходимое, называется u-boot-sunxi-with-spl.bin и находится в корневой папке дерева исходного кода U-Boot. За исключением необработанных NAND-устройств его можно использовать для любого источника загрузки. Devicetree платы также включено.

Нужно заменить make на make CROSS_COMPILE=$LFA_TGT-

Переход на ToyBox

Рассмотреть возможность перехода с BusyBox на ToyBox для уменьшения размера дистрибутива. Из серьёзных для LFA проблем в ToyBox можно отметить разве что неготовность их системы инициализации, значит придётся использовать или простой BASH-скрипт вместо инита, либо писать свой (макет своей системы инициализации лежит в репозитории init).

Информация о сборке ПО из исходного кода (`additional/compile.md`)

Написать страницу о сборке ПО из исходников. Нужно описать следующие этапы сборки:

  1. Получение архива с исходниками
  2. Распаковка архива
  3. Переход в директорию с исходниками
  4. Определение используемой системы сборки
    • Что делать, если у меня нет файла Makefile? [make]
    • Что делать, если у меня нет файла configure.sh? [make]
  5. Конфигурирование системы сборки
  6. Компиляция программы
  7. Тестирование программы
  8. Установка программы
    • Установка программы в альтернативный префикс
  9. Исправление ошибок сборки

Информация о Devicetree (`additional/dtb.md`)

Здесь не нужно сильно вдаваться в подробности о строении этих файлов. Нужно описать их предназначение и области применения, а также софт для работы с такими файлами (*.dtb, *.dts)

Команды для установки ядра Linux (`kernel/linux`)

Собранное ядро находится по адресу arch/arm{,64}/boot/Image{,.gz}. Там же, по всей видимости, содержатся и скомпилированные Devicetree. Исходя из этого нужно предоставить более конкретные команды для установки скомпилированного ядра Linux в систему

Исправление команд сборки GCC

Проблема

Команды для распаковки архивов вызывают ошибку:

tar -xf ../mpfr-*.tar.xz
tar -xf ../mpc-*.tar.gz
tar -xf ../gmp-*.tar.xz

Решение

Установить вместо * версию нужных пакетов.

ЛОГОТИП

Нужно нарисовать логотип руководства.

`base/libgcc` - некорректные инструкции по сборке

В инструкциях указано скопировать библиотеку libgcc из кросс-компилятора в базовую систему, но в кросс-компиляторе этой библиотеки нет. Возможно, это связано с несовсем корректными инструкциями по сборке GCC в кросс-компиляторе, а точнее с несовсем правильной командой по установке GCC.

Загрузочные скрипты

Пока в первой версии LFA используется BusyBox с готовым init, для него требуются загрузочные скрипты. Нужно написать страницу о создании этих скриптов.

Отказ от 32-битных ARM-архитектур

Проблема

Некоторые расхождения в процессе сборки для AArch64 и для 32-битных архитектур ARM. Наличие в руководстве нескольких страниц для выполнения одного и того же действия: установки переменных сборки. Наличие примечаний по указанию необходимых зависимых от целевой архитектуры параметров для сборки Linux, GCC, U-Boot (для QEMU).

Решение

Я не думаю, что это руководство будут читать обладатели не-AArch64 процессоров, поэтому наиболее предпочтительным в данном случае решением будет предоставление в LFA инструкций только для AArch64.

Однако если среди читателей LFA будут пользователи других архитектур, то сведения о них нужно будет оставить и в будущей 2.0 версии LFA.

Отключить `tc` при сборке BusyBox

Сборка компонента tc на ядрах Linux >= 6.8 вызывает ошибку:

#      CC      sysklogd/klogd.o
#    networking/tc.c: In function 'cbq_print_opt':
#    networking/tc.c:236:27: error: 'TCA_CBQ_MAX' undeclared (first use in this function); did you mean 'TCA_CBS_MAX'?
#      236 |         struct rtattr *tb[TCA_CBQ_MAX+1];
#          |                           ^~~~~~~~~~~
#          |                           TCA_CBS_MAX
#    make[1]: *** [scripts/Makefile.build:197: networking/tc.o] Error 1

Можно применить патчи:

А можно вообще отключить его сборку:

sed -i 's/\(CONFIG_TC\)=y/# \1 is not set/' .config

Изменить формат конфигов со списком пакетов

На данный момент для хранения информации о пакетах используется два конфига: packages.toml со списком всех пакетов (генерирует страницу pkgs.md с описанием всех используемых в руководстве пакетов) и pkg_info.toml, содержащий информацию о всех пакетах и обо всех частях пакетов (например, здесь несколько раз упоминается пакет musl или содержится пакет libgcc как часть пакета GCC).

Если с packages.toml всё впорядке, то с pkg_info.toml есть ряд проблем. Во-первых, проблемы с дублированием пакетов. Во-вторых, дублирование ряда параметров типа описания пакета. В идеале, хороший pkg_info.toml должен иметь следующую структуру:

[[package]]
id = "binutils" # имя созданного md-файла в директории с описанием этого пакета
package = "binutils" # имя пакета из файла `packages.toml` (отсюда берутся параметры с описанием пакета, контрольной суммой и ссылками для скачивания)
sbu = 1 # ОВС
dir_pth = "cross-compiler" # В какой директории сохранить файл описания пакета

[[package]]
# ...

Однако иногда в файле описания пакета требуется изменить описание и использовать описание не из packages.toml, а своё (например, для cross-compiler/linux-headers или base/libgcc). Поэтому требуется иметь ещё и параметр description, который может присутствовать в конфиге, а может и отсутствовать (в случае отсутствия использовать описание из packages.toml).

Какие файлы затрагиваются

  • pkg_info.toml
  • src/gen_pkginfo.py

Нахождение `$LFA_SYS/lib` и `$LFS_SYS/lib64`

Возможно, стоит сделать ссылку $LFA_SYS/lib64 -> $LFA_SYS/lib (для 64-битный систем). Поддержка multilib в LFA не планируется, ровно как и поддержка сборки библиотек для других архитектур.

Нужно посмотреть на то, является ли lib64 ссылкой на lib в других системах.

Переработать страницу о сборке U-Boot

Требуется добавить краткую инструкцию по сборке загрузчика U-Boot без воды и прочих сведений, нужных только разработчикам U-Boot, но не пользователям.

Вынести загрузочные скрипты в отдельный пакет

Проблема

Сейчас пользователь самостоятельно создаёт нужные директории и сам туда записывает файлы со скриптами. Нужно автоматизировать этот процесс, создав отдельный пакет lfa-bootscripts, в котором будут находиться основные загрузочные скрипты

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.