Raspberry Pi:Основы Linux/Ядро/Сборка ядра: различия между версиями
Myagkij (обсуждение | вклад) |
Myagkij (обсуждение | вклад) |
||
Строка 180: | Строка 180: | ||
=См.также= | =См.также= | ||
{{ads}} | |||
=Внешние ссылки= | =Внешние ссылки= | ||
<references /> | <references /> |
Текущая версия от 19:23, 5 мая 2022
Содержание | Введение | Продукты | Операционная система | Настройка | Основы Linux | Аппаратные средства | Неисправности | Типовые проблемы | Часто возникающие вопросы | Библиотеки | Примеры |
Сборка ядра[1]
Есть два основных способа для сборки ядра — локально (прямо на Raspberry Pi), но это отнимает очень много времени, или посредством кросс-компиляции, что быстрее, но потребует дополнительной возни.
Локальная сборка
Сначала нужно установить на Raspberry Pi последнюю версию Raspbian (ее можно скачать со страницы загрузок на официальном сайте Raspberry Pi). После этого загружаем Pi, подключаем ее к Ethernet (чтобы получить доступ к исходникам) и залогиниваемся.
Сначала скачиваем исходники (это займет какое-то время):
git clone --depth=1 https://github.com/raspberrypi/linux
Добавляем пропущенные зависимости:
sudo apt-get install bc
Теперь нужно настроить ядро. Конечно, можно пользоваться и дефолтными настройками, но если вы хотите добавить или, наоборот, удалить определенный функционал, то более подробно об этом можно прочесть на страницах о настройке ядра и установке патчей.
Дальнейший шаг зависит от того, какой версии ваша Raspberry Pi.
Чтобы установить дефолтный билд для Raspberry Pi 1 (или вычислительного модуля), впишите следующее:
cd linux
KERNEL=kernel
make bcmrpi_defconfig
Чтобы установить дефолтный билд для Raspberry Pi 2, впишите следующее:
cd linux
KERNEL=kernel7
make bcm2709_defconfig
Теперь собираем и устанавливаем ядро, модули и DTB-файлы. Этот шаг займет очень много времени...
make zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img
Примечание. В случае с Raspberry Pi 2 воспользуйтесь приставкой -j4 (это может выглядеть, к примеру, так — make -j4 zImage modules dtbs). Это разобьет работу между четырьмя ядрами и значительно повысит скорость компиляции.
Кросс-компиляция
Для начала вам потребуется подходящая Linux-система, и лично мы склоняемся к Ubuntu. Поскольку Raspbian является дистрибутивом Debian, это значит, что в них используются похожие команды и т.д.
Впрочем, это можно делать и на Windows — при помощи VirtualBox или VMWare. Более подробно об этом читайте тут.
Установка тулчейна
Для загрузки «тулчейна» (от англ. toolchain, что можно перевести как «инструментарий для работы с ПО») нужно воспользоваться следующей командой:
git clone https://github.com/raspberrypi/tools
После этого тулчейн необходимо скопировать в какую-нибудь общую для всех пользователей директорию (вроде /tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian), а затем добавить путь /tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin к $PATH в файле .bashrc, находящемся в вашей домашней директории. Для 64-битных систем путь нужно немного видоизменить — /tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin. К слову, данный шаг не строго обязателен, но если его выполнить, вам будет проще позднее — при работе с командами.
Получение исходников
Чтобы получить исходники, делаем отсылку к оригинальному GitHub-репозиторию:
git clone --depth=1 https://github.com/raspberrypi/linux
Сборка исходников
Чтобы собрать исходники (и тем самым подготовить их к кросс-компиляции), вам могут потребоваться дополнительные зависимости помимо тех, что уже установлены на Ubuntu по умолчанию. В таком случае сделайте, пожалуйста, запрос на изменение документации.
Далее выполняем сборку исходников и DTB-файлов.
Для Pi и вычислительного модуля делаем следующее:
cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
Для Pi 2 делаем следующее:
cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
Эта команда нужна в обоих случаях:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
Установка напрямую на SD-карту
После сборки ядра вам нужно скопировать его на Raspberry Pi, а затем установить модули. Это лучше делать напрямую — при помощи SD-картридера.
Теперь воспользуемся командой lsblk, и это нужно сделать два раза — перед подсоединением SD-карты и после. Тем самым мы определим, какой из дисков — именно SD-карта. Выдача lsblk должна быть примерно такой:
sdb
sdb1
sdb2
Если это NOOBS-карта, то вы должны увидеть примерно следующее:
sdb
sdb1
sdb2
sdb3
sdb5
sdb6
Здесь sdb1 (в первом примере) и sdb5 (во втором примере) — это FAT, а sdb2 (в первом примере) и sdb6 (во втором примере) — это образ файловой системы ext4 (NOOBS).
Теперь монтируем разделы:
mkdir mnt/fat32
mkdir mnt/ext4
Затем подгоняем номера разделов к образам NOOBS:
sudo mount /dev/sdb1 mnt/fat32
sudo mount /dev/sdb2 mnt/ext4
Далее устанавливаем модули:
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
Наконец, копируем ядро и DTB-файлы на SD-карту (и вместе с тем делаем бэкап старого ядра):
sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo scripts/mkknlimg arch/arm/boot/zImage mnt/fat32/$KERNEL.img
sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4
Есть и другой вариант: скопировать ядро в то же место, но с другим названием (например, kernel-myconfig.img) — чтобы не перезаписать файл kernel.img. Затем редактируем файл config.txt, чтобы выбрать ядро, с которого будет загружаться Pi:
kernel=kernel-myconfig.img
Смысл этого действия в том, чтобы у вас было «запасное» ядро, никак не связанное с ядром, на которое приходятся все «шишки» — различные манипуляции со стороны управляющей системы и инструментов для автоматического обновления.
В случае, если это ядро не загрузится, у вас всегда будет возможность вернуться к «запасному» официальному ядру.
Наконец, вставляем карту в Pi и загружаемся!