Raspberry Pi:Основы 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
Примечание

Чтобы ускорить компиляцию на многопроцессорных системах (и на однопроцессорных тоже, но в меньшей степени), используйте -j n, где n — это количество процессоров, умноженное на 1,5. Впрочем, не бойтесь экспериментировать — возможно, лучше всего будет работать какая-то другая цифра.

Установка напрямую на 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 и загружаемся!

См.также

Внешние ссылки