среда, 10 июля 2013 г.

Собираем ядро и настраиваем звук в Gentoo на Raspberry Pi

В этой заметке я обобщу свой длительный опыт "борьбы" с пересборкой ядра Gentoo Linux на Raspberry Pi.

Итак, вы хотите пересобрать ядро, например для того, чтобы заработал звук. Приступим!

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), и вписать в него те команды, которые должны быть выполнены при запуске системы.