В этой заметке я обобщу свой длительный опыт "борьбы" с пересборкой ядра Gentoo Linux на Raspberry Pi.
Итак, вы хотите пересобрать ядро, например для того, чтобы заработал звук. Приступим!
1) Вместе с образом Gentoo на Pi идут тексты старого (3.2.*) ядра, они лежат в /opt/raspberrypi/, и имеют размер порядка 1Гб. Для экономии места на SD-карте, целесообразно удалить их.
2) Собирать ядро будем через genkernel, вытягивать тексты - через git (обычное, vanilla-ядро работать НЕ будет, нам нужно ядро, содержащее в себе патчи для raspberry pi). Устанавливаем необходимые инструменты:
kernel=kernel-genkernel-arm-3.6.11+
После выхода из menuconfig начнётся сборка и установка ядра, ничего нигде прописывать больше не нужно.
Вот пара моментов, на которые стоит обратить внимание при настройке ядра:
1) Нужно включить поддержку сжатой initram fs, иначе при сборке появится ошибка. Для включения идём в General Setup, и включем поддержку, как на картинке:
Должна быть примерно такая картинка:
Итак, вы хотите пересобрать ядро, например для того, чтобы заработал звук. Приступим!
1) Вместе с образом Gentoo на Pi идут тексты старого (3.2.*) ядра, они лежат в /opt/raspberrypi/, и имеют размер порядка 1Гб. Для экономии места на SD-карте, целесообразно удалить их.
2) Собирать ядро будем через genkernel, вытягивать тексты - через git (обычное, vanilla-ядро работать НЕ будет, нам нужно ядро, содержащее в себе патчи для raspberry pi). Устанавливаем необходимые инструменты:
root #
emerge --ask git genkernel
3)После того, как git и genkernel установились, скачиваем тексты ядра, я предлагаю скачать прямо в /usr/src:root #
cd /usr/src
root #
git clone --depth 1 git://github.com/raspberrypi/linux.git
После успешного выполнения этих команд, получаем в /usr/src/linux исходные тексты ядра, которые подойдут для нашего Pi. Осталось собрать!
4)Собираем ядро. Как показывает практика, если сразу вызвать меню настроек ядра (menuconfig), и повключать множество всяких опций, есть хорошие шансы того, что ядро не скомпилируется, вылетит с какой-либо ошибкой. По этому, сначала просто обновим ядро до актуальной версии:
root #
genkernel --kernel-config=/proc/config.gz kernel
Эта команда будет выполняться порядка нескольких часов, было бы разумно оставить её работать на ночь. В результате её работы мы получаем в /boot следующее:
Как можно видеть, появились файлы kernel-genkernel-arm-3.6.11+, initramfs-genkernel-arm-3.6.11+ и System.map-genkernel-arm-3.6.11+ (версия может отличаться, зависит от того, что было скачано из git) - это и есть новое ядро. Осталось добавить его в настройки загрузки.
Настройки загрузки лежат в /boot/config.txt, нам нужно в конец файла дописать следующую строку:
kernel=kernel-genkernel-arm-3.6.11+
(там может вообще не быть строки kernel=..., это нормально, просто дописываем строку с указанием на новое ядро в конец файла)
Сделать это можно или текстовым редактором (nano -w), или командой:
root #
echo "kernel=kernel-genkernel-arm-3.6.11+" >> /boot/config.txt
Первый шаг сделан, после этого мы уже имеем обновлённое ядро. Перезагружаемся:
root # reboot
После перезагрузки факт обновления ядра можно увидеть через команду uname -a
5)Конфигурируем новое ядро под себя.
Конфигурирование ядра уже проходит несколько проще, чем обновление. Нужна всего одна команда:
root #
genkernel --kernel-config=/proc/config.gz kernel --menuconfig all
После выхода из menuconfig начнётся сборка и установка ядра, ничего нигде прописывать больше не нужно.
Вот пара моментов, на которые стоит обратить внимание при настройке ядра:
1) Нужно включить поддержку сжатой initram fs, иначе при сборке появится ошибка. Для включения идём в General Setup, и включем поддержку, как на картинке:
2) Как показывает практика, лучше вносить изменения в конфигурацию по небольшому числу пунктов, чем сразу включить все требуемые опции. У меня при этом вываливалась ошибка компиляции, и приходилось вспоминать по новой, что же хотелось включить. Если же добавлять опции по одной - это займёт больше времени, но это как-то удобнее.
После настройки ядра можно попробовать включить звук. Для этого нам нужно установить alsa-utils:
root #
emerge alsa-utils
После установки, пробуем подключить модуль, отвечающий за звук:
root #
modprobe snd_bcm2835
Для проверки работы alsa запустим alsa-mixer:
root #
alsamixer
Если оно так - УРА, звук заработал! Если вылезло сообщение об ошибке - скорее всего, не собран модуль ядра, запускаем конфигурацию, и внимательно исследуем секцию device drivers->sound devices
Звуковая система у Pi имеет несколько выходов (HDMI, джек 3.5мм), и возможна ситуация, когда плеер музыку играет, но звука нет - это может быть из-за того, что выбран не тот выход, который есть по факту. Выбор выхода производится так:
Автоматический выбор выхода:
root #
amixer cset numid=3 0
Ручной выбор - выход 3.5мм:
root #
amixer cset numid=3 1
Ручной выбор - выход HDMI:
root #
amixer cset numid=3 2
Для того, чтобы каждый раз не набирать команды руками - стоит создать в /etc/local.d файлик с именем типа 02_local.start, сменить ему права на 755 (командой chmod 755 /etc/local.d/02_local.start), и вписать в него те команды, которые должны быть выполнены при запуске системы.