Компиляция ядра для Raspberry Pi и Raspberry Pi2

  • Автор
Приветствую уважаемое русскоязычное сообщество Raspberry Pi
Сегодня я расскажу вам про технику компиляции ядра для Raspberry Pi и Raspberry Pi2
Зачем нам может потребоваться компиляция собственного ядра? Ну например, чтобы добавить устройства, которые не поддерживаются в дефолтной сборке.


Итак, приступим. Собирать будем методом кросс-компиляции на мощной x86 машине. Можно конечно компилировать ядро прямо на Raspberry - но это безумие, т.к процесс займёт несколько дней. Я пользуюсь кросс-компилятором, который предоставляет BSQuask (о том что это такое написано в этой статье http://raspberrypi.ru/blog/readblog/149.html)

1. Вытягиваем свежую версию с ядра с репозитория
git clone https://github.com/raspberrypi/linux.git

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

2. Вытягиваем инструментарий, который подготовит скомпилированное ядро для Raspberry Pi git
clone https://github.com/raspberrypi/tools.git
Если компилируете ядро для Raspberry Pi2, то этот инструментарий не нужен.

Заходим в папку со скаченными исходниками ядра
cd linux
и приступаем к кросс-компиляции ядра:
В первую очередь нам нужно создать файл .config, в котором содержатся параметры, с которыми будет скомпилировано ядро.
Мы будем строить нашу новую конфигурацию на основе стандартного для Raspberry Pi конфига bcmrpi_defconfig (bcm2709_defconfig для Raspberry Pi 2):
для Raspberry Pi:
make ARCH=arm CROSS_COMPILE=/opt/bsquask/host/usr/bin/arm-raspberrypi-linux-gnueabi- bcmrpi_defconfig


для Raspberry Pi 2:
make ARCH=arm CROSS_COMPILE=/opt/bsquask/host/usr/bin/arm-raspberrypi-linux-gnueabi- bcm2709_defconfig


Теперь когда конфиг создан, нам нужно внести в него требуемые нам изменения (например включить в ядро поддержку новых устройств)
Для этого выполняем команду
make ARCH=arm CROSS_COMPILE=/opt/bsquask/host/usr/bin/arm-raspberrypi-linux-gnueabi- menuconfig

Появляется диалоговое окно, в котором отмечаем требуемые опции и нажимаем кнопку Save, после чего приступаем непосредственно к компиляции:
make ARCH=arm CROSS_COMPILE=/opt/bsquask/host/usr/bin/arm-raspberrypi-linux-gnueabi- -k -j3

Опция -j позволяет распараллелить сборку ядра. Её значение рекомендуется устанавливать по формуле j=число ядер процессора+1

После этой команды начинается сборка ядра, у меня этот процесс занимает около 15 минут

После сборки ядра необходимо установить модули в отдельную папку:
mkdir ../modules

make modules_install ARCH=arm CROSS_COMPILE=/opt/bsquask/host/usr/bin/arm-raspberrypi-linux-gnueabi- INSTALL_MOD_PATH=../modules/

Меняем папку /lib/modules/ на SD карте на только что сгенерированную /modules/lib/modules

Теперь нужно подготовить ядро для Raspberry Pi при помощи скрипта imagetool-uncompressed.py из инструментария, который скачивался в начале этой статьи:
cd ../tools/mkimage/

python ./imagetool-uncompressed.py ../../linux/arch/arm/boot/Image

После этого в текущей директории появится файл kernel.img, который нужно скопировать на карту памяти в /boot/

ВНИМАНИЕ! Это важно и об этом мало где пишут. Для Raspberry Pi2 данная процедура не требуется. /linux/arch/arm/boot/Image - уже пригодное к использованию на Raspberry Pi 2 ядро, просто скопируйте его на карту памяти в /boot/kernel7.img

P.S небольшой хинт - чтобы получить конфиг, с которым было собрано ядро, в загруженной операционной системе выполняем команду
cat /proc/config.gz | gunzip

Надеюсь, статья окажется полезной. Если есть вопросы, то можете задавать в комментариях к статье

Комментарии:

Для написания комментариев необходимо зарегистрироваться