linux

Ядро операционной системы.

  • Версия: 6.9
  • Домашняя страница: https://www.kernel.org
  • Время сборки: 23 ОВС

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

Подготовка

Убедитесь в том, что дерево исходного кода ядра не содержит лишних файлов:

make mrproper

Разработчики ядра рекомендуют выполнять эту команду каждый раз, когда вы собираете Linux.

Настройка

Поскольку вы создаёте встраиваемую систему, убедитесь, что все ключевые компоненты встроены в ядро, а не являются модулями (в меню, которое откроется по команде далеее опция отмечена как <*>, а не как <M>). Ключевыми обычно являются опции для поддержки консоли, видео, дисков и файловых систем, а также сети. Без них система не будет функционировать должным образом. Рекомендуется конфигурировать ядро без модулей, чтобы сэкономить место на диске и упростить процесс загрузки системы.

Откройте псевдографическое меню, в котором вам нужно выбрать все опции, которые нужны вам для корректной работы ядра на компьютере, для которого вы собираете систему:

make ARCH=arm64 CROSS_COMPILE=$LFA_TGT- menuconfig

Выбор платформы

Обязательно зайдите в раздел Platform selection ---> и отметьте там поддержку необходимых для вас SoC. Например, если я собираю систему для компьютера Orange Pi 3 LTS с Allwinner SoC, то в этом списке мне нужно отметить только

Platform selection  --->
  [*] Allwinner sunxi 64-bit SoC Family

FUSE

FUSE (англ. filesystem in userspace — «файловая система в пользовательском пространстве») — свободный модуль для ядер Unix-подобных операционных систем, позволяющий разработчикам создавать новые типы файловых систем, доступные для монтирования пользователями без привилегий (прежде всего — виртуальных файловых систем); это достигается за счёт запуска кода файловой системы в пользовательском пространстве, в то время как модуль FUSE предоставляет связующее звено для актуальных интерфейсов ядра. C использованием средств FUSE разработаны, в частности, SSHFS, NTFS-3G, GlusterFS, ZFS.

File systems  --->
  <*/M> FUSE (Filesystem in Userspace) support [CONFIG_FUSE_FS]

Сборка

Скомпилируйте ядро, используя только что созданный .config:

make ARCH=arm64 CROSS_COMPILE=$LFA_TGT-

Теперь вам необходимо скомпилировать файлы devicetree:

make ARCH=arm64 CROSS_COMPILE=$LFA_TGT- dtbs

Установка

Следующие действия нужно выполнить, если вы собирали ядро с модулями:

При использовании модулей ядра может потребоваться файл /etc/modprobe.conf. Информация, касающаяся модулей и конфигурации ядра, находится в документации в директории Documentation/. Также будет не лишним прочитать документацию (man) modprobe.conf(5).

make ARCH=arm64 CROSS_COMPILE=$LFA_TGT- \
  INSTALL_MOD_PATH=$LFA_SYS modules_install

Установка ядра и ряда дополнительных файлов

Конфигурационный файл .config содержит все настройки конфигурации только что собранного ядра. Было бы неплохим сохранить этот файл для дальнейшего пользования:

cp -v .config $LFA_SYS/boot/config-6.6.6

Скопируйте файл System.map в /boot:

cp -v System.map $LFA_SYS/boot/System.map-6.6.6

Полученное ядро будет находиться в директории arch/arm64/boot. Возможно, что там будет находиться несколько вариантов одного и того же ядра, просто с разным сжатием или добавлением помощников загрузчика. Следуйте инструкциям вашего загрузчика по копированию ядра в конечную систему. Например:

cp -iv arch/arm64/boot/Image $LFA_SYS/boot/vmlinuz-6.6.6

Для того, чтобы не указывать в опциях ядра полное имя vmlinuz-6.6.6 создайте символическую ссылку:

ln -svf vmlinuz-6.6.6 $LFA_SYS/boot/vmlinuz

Установка файлов Devicetree

Создайте в $LFA_SYS/boot директорию dtb-6.6.6:

mkdir -pv $LFA_SYS/boot/dtb-6.6.6

И установите файлы Devicetree:

make ARCH=arm64 CROSS_COMPILE=$LFA_TGT- \
  INSTALL_DTBS_PATH=$LFA_SYS/boot/dtb-6.6.6 dtbs_install

Для того, чтобы не указывать в boot.cmd, который мы скоро напишем, версию ядра, сделайте символическую ссылку:

ln -svf dtb-6.6.6 $LFA_SYS/boot/dtb

Создание ссылок на ряд периодически изменяющихся файлов сделает проще их обновление до новой версии: нужно просто установить новую версию файла ядра и директории с devicetree в $LFA_SYS/boot/ и обновить символические ссылки. Этим мы можем оставить предыдущие версии ядра и devicetree, которые могут понадобиться, если окажется, что их новые версии работают некорректно или не работают вовсе.

Внимание

В $LFA_SYS/boot/dtb-6.6.6 будут установлены скомпилированные файлы devicetree только для тех плат, поддержку которых вы указали при конфигурировании ядра. В этой директории будут созданы поддиректории с именами используемых в этих платах SoC, например:

  • $LFA_SYS/boot/dtb-6.6.6/allwinner/
  • $LFA_SYS/boot/dtb-6.6.6/broadcom/
  • $LFA_SYS/boot/dtb-6.6.6/rockchip/

В этих поддиректориях будут содержаться файлы *.dtb для поддерживаемых плат. Если вам что-либо отсюда не нужно, то ради экономии места и уменьшения размера собранного дистрибутива вы можете удалить лишние файлы. Однако будьте готовы, что на каких-то компьютерах ваша система может не заработать.

Содержимое пакета

  • Установленные файлы: .config-6.6.6, vmlinuz-6.6.6, vmlinuz, System.map-6.6.6, dtb-6.6.6/*, dtb/

Описание компонентов

  • .config-6.6.6 — содержит параметры сборки ядра.
  • vmlinuz-6.6.6, vmlinuz — скомпилированное ядро Linux.
  • System.map-6.6.6 — список адресов и символов; в нём указаны точки входа и адреса всех функций и структур данных в ядре. Иногда полезен при отладке.
  • dtb-6.6.6/, dtb/ — директория с файлами devicetree.