Аудиофильное ядро

Я знаю, вам интересны пушки, пистолеты, пардон, усилители, цапы, акустика и все такое, но придется потерпеть и вникнуть в одну из тем актуального настоящего.

У многих аудиофилов уже не составляет труда застать сетап трудящийся на базе ОС Linux с использованием одного из лучших в мире программных аудипроигрывателей mpd и замечательной звуковой системы Alsa (которой не нужны никакие ASIO). Кто-то настраивает свой Linux для воспроизведения музыки самостоятельно, кто-то использует аудиофильные, уже преднастроенные, дистрибутивы, подобные Daphile.

Одной из особенностей таких дистрибутивов является специально скомпилированное под аудио ядро реального времени. Я сразу скажу, очень маловероятно, что вы способны будете прослушивая музыка заметить разницу между стандартным ядром Linux и оптимизированным realtime. Сам я изначально заморачивался с релтаймом, но сейчас вполне доволен штатным ядром из Kubuntu Linux.

Я не стану для вас строить розовых иллюзий — собрать правильное ядро не так уж и просто, но ранее я уже проделал эту работу подготавливая материал для известного в своей сфере печатного журнала. В номере, где была опубликована моя статья произошео забавный казус — перед моим учебником расположили схожий учебник по сборке ядра от английского автора. Ирония в том, что по  рекомендациям англичанина (журнал издается и в России и в Европе) ядро собрать невозможно, по крайней мере не в нашем 21 веке. К счастью далее шла статья написанная, логично, мной, где проливался свет, как же это сделать.  Любопытствующих прочитать все это в оригинале отсылаю к данному номеру Linux Format 215, его все еще можно купить в электронном и бумажном варианте. Вообще, в Linux Format очень много интересных материалов помимо моих, и если вам интересен Linux, то советую обратить внимание на этот русско-британский журнал и купить понравившиеся номера. У меня есть целая стопка, и не только авторских, экземпляров . Тем не менее в соответствии с договором с издательством, и прошествием полугода, я могу распоряжаться материалами на свое усмотрение и, соответственно, наконец  разместить здесь актуальное решение самостоятельной сборки релтайм ядра для современного Linux, где конечная цель безусловно — бескомпромиссное звучание.

ФАБУЛА

О нет, еще одно руководство по компиляции ядра Linux, вы серьезно?
Я солидарен с вашими чувствами, но смотрите как хитро застыла моя бровь в экстремуме и позвольте спросить, когда вы последний раз собирали ядро?
Можно предположить, что это было время царствования динозавров, хотя конечно я утрирую, не позднее господства мамонтов.
Сегодня сложилась забавная ситуация, если вы попытаетесь из исходников собрать ядро, то потерпите фиаско.
Разумеется, вы много раз собирали рабочие ядра и досконально знаете весь процесс, но…
В тот момент когда вы начнете компиляцию, процесс прервется, сообщая об ошибках в скриптах и сертификатах.
Да, мир укатил довольно далеко за последнее время (UEFI и так далее) и теперь исходники ядра при сборке требуют  сертификаты, без которых никуда.
Но давайте откроем руководство по сборке идущее к свежему ядру.
О, это все тот же старый текст времен миграций мамонтов по зеленым лугам и по нему ядро точно не собрать.
Заинтригованы?
Но прежде чем попытаться открутить рог носорогу, разумно задать вопрос, а зачем вообще собирать ядро?
Одна из таких причин — желание  получить real-time ядро (rt-кернел, ядро реального времени) для приложений работающих с аудио. Ранее многие дистрибутивы имели в составе своих репозитариев уже скомпилированные rt-ядра, но позднее, нежелание мантейнеров их поддерживать вылилось в то, что такие ядра, например из самого массового семейства дистрибутивов Ubuntu, безвозвратно исчезли, будучи заменены на псевдобыстрые по отклику ядра lowlatency. Нужно ли говорить, что реальный релтайм и ядро с малым откликом — вещи разные, как выделанная кожа и дешевый дерматин.
На сегодня есть лишь несколько узкоспециализированных дистрибутивов имеющих в своем составе старое реалтайм ядро версии 3 (Ubuntu Studio, Audiophile Linux), а установленных по умолчанию свежих версий в актуальных дистрибутивах и не найти. Поэтому единственный вариант получить свежее rt-ядро в своей системе — собрать самостоятельно (чем мы и займемся), так как новые ядра и реалтайм-патчи под них выходить не переставали. Попутно решим и новые вызовы, что появились за последние годы — сертификаты, ключи. Другими словами вы наконец сможете получить актуальный гайд по сборке ядра 2016 для дистрибутивов на базе Ubuntu/Debian.

ГДЕ НАЙТИ НОВОЕ ЯДРО И RT-ПАТЧ

Цитадель ядер Linux — сайт www.kernel.org.
Наберите в браузере
https://www.kernel.org/
и вы попадете на главную страницу сайта.

Цитадель ядер — сайт kernel.org

Здесь предлагаются, как стабильные ядра, так и готовящиеся к скорому выходу с припиской rc (release candidate).
Выбирать не полностью отлаженное ядро смысла практически нет, если только оно не содержит новые жизненноважные функции без которых жизнь не всласть. Поэтому вопроса, какое ядро выбрать, не стоит — однозначно стабильное. Но в случае, когда вы хотите пропатчить выбранное ядро превратив его в ядро реального времени, для начала нужно посмотреть для каких именно новейших ядер существуют rt-патчи.
Для этого нужно перейти по ссылке:
https://www.kernel.org/pub/linux/kernel/projects/rt/
Вы увидите директории с номерами ядер.
На момент написания статьи самое свежее стабильное ядро 4.6.4, зайдя в папку 4.6 посмотрим есть ли для этого ядра патч.
Видим следующее:

patch-4.6.4-rt8.patch.gz       15-Jul-2016 11:39  202K

patch-4.6.4-rt8.patch.sign     15-Jul-2016 11:39  543

patch-4.6.4-rt8.patch.xz       15-Jul-2016 11:39  166K

patches-4.6.4-rt8.tar.gz       15-Jul-2016 11:39  329K

patches-4.6.4-rt8.tar.sign     15-Jul-2016 11:39  543

patches-4.6.4-rt8.tar.xz       15-Jul-2016 11:39  247K

sha256sums.asc                 15-Jul-2016 11:57  1.2K

Да, для ядра 4.6.4 есть реалтайм патч. Иначе пришлось бы выбирать ядро для которого есть реалтайм патч.
Скачиваем патч patch-4.6.4-rt8.patch.xz на компьютер.
Теперь скачиваем само ядро 4.64 из директории с ядрами 4-ой версии на сайте:
https://www.kernel.org/pub/linux/kernel/v4.x/
Потребуются два файла — само ядро:
https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.6.4.tar.xz
И ключ (файл с расширением sign):
https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.6.4.tar.sign

Итак, мы скачали 3 фала — rt-патч версии 4.6.4, само ядро этой же версии 4.6.4 и gpg-ключ (Gnu Privacy Guard) этого ядра и готовы к дальнейшим действиям, а именно к манипуляциям над ядром.

МЕХАНИК, КЛЮЧ НА 6092693 ПОЖАЛУЙСТА

Создадим в домашней директории папку src и скопируем в нее ранее скачанные три файла — linux-4.6.4.tar.xz, linux-4.6.4.tar.sign и patch-4.6.4-rt8.patch.xz.
Обратите внимание, что у скачанного архива с ядром linux-4.6.4.tar.xz на конце расширение xz.
Это означает, что архив в контейнере xz сжат методом LZMA2.
Для извлечения архива потребуется распаковщик  unxz.
Запустим терминальную программу и напечатаем в ней:
cd src
для перехода в папку с тремя файлами.
Распакуем ядро дав команду:
unxz linux-4.6.4.tar.xz
Команда отработает и в результате появится файл
linux-4.6.4.tar
Это так же по прежнему архив, но дальше его распаковывать пока не требуется. Именно такое полураспакованное состояние и нужно, чтобы подтвердить легитимность исходников ядра.
Чтобы проверить ядро на соответствие ключу, сначала нужно проверить сам ключ linux-4.6.4.tar.sign
Дадим в консоли команду:
$ gpg —verify linux-4.6.4.tar.sign
Результат вы можете видеть ниже:
gpg: предполагается, что подписанные данные находятся в `linux-4.6.4.tar’
gpg: Подпись создана Пн 11 июл 2016 19:30:27 MSK ключом RSA с ID 6092693E
gpg: Не могу проверить подпись: открытый ключ не найден

Программа предположила, что подписанные этим ключом данные находятся в архиве ядра linux-4.6.4.tar (так оно и есть), но она не может проверить подпись, так как не нашла открытый ключ.
Казалось бы наши действия не принесли результата, но это не так, мы получили ID без которого дальше бы действительно не продвинулись в деле сборки ядра.
Обратите внимание на строку “ключом RSA с ID 6092693E”, где 6092693E и есть искомый ID.
Напишем в терминале строку:
gpg —keyserver hkp://keys.gnupg.net —recv-keys
Добавив через пробел в самый ее конец ID, вот так
gpg —keyserver hkp://keys.gnupg.net —recv-keys 6092693E

В результате из сети интернет будет скачан недостающий для сборки открытый ключ:
gpg: создана таблица ключей `/home/pk/.gnupg/secring.gpg’
gpg: запрашиваю ключ 6092693E с сервера hkp keys.gnupg.net
gpg: /home/pk/.gnupg/trustdb.gpg: создана таблица доверия
gpg: ключ 6092693E: импортирован открытый ключ «Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>»
gpg: не найдено абсолютно доверенных ключей
gpg: Всего обработано: 1
gpg:               импортировано: 1  (RSA: 1)

Ну что же, теперь нам есть чем достойно ответить на предыдущее сообщение:
“gpg: Не могу проверить подпись: открытый ключ не найден”.
Поэтому снова вводим команду:
gpg —verify linux-4.6.4.tar.sign

На этот раз увидим другое сообщение:
gpg: предполагается, что подписанные данные находятся в `linux-4.6.4.tar’
gpg: Подпись создана Пн 11 июл 2016 19:30:27 MSK ключом RSA с ID 6092693E
gpg: Действительная подпись от «Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.com>»
gpg: ВНИМАНИЕ: Данный ключ не заверен доверенной подписью!
Gpg: Нет указаний на то, что подпись принадлежит владельцу.
Отпечаток главного ключа: 647F 2865 4894 E3BD 4571  99BE 38DB BDC8 6092 693E
Наконец то мы обезопасили себя от проблем со сборкой ядра, которые возникли бы в ином случае  требуя сертификаты и тд, в таком роде:

make[4]: *** No rule to make target ‘debian/certs/benh@debian.org.cert.pem’, needed by ‘certs/x509_certificate_list’.  Stop.

Makefile:985: recipe for target ‘certs’ failed
Или таком:
CC      certs/system_keyring.o

make[2]: *** Нет правила для сборки цели «debian/certs/benh@debian.org.cert.pem», требуемой для «certs/x509_certificate_list».  Останов.

Makefile:954: ошибка выполнения рецепта для цели «certs»

make[1]: *** [certs] Ошибка 2
Ключи получены, поэтому окончательно  распаковываем ядро:
tar xvf linux-4.6.4.tar
В папке src появится директория с исходными кодами ядра Linux-4.6.4.
Распакует релтайм патч patch-4.6.4-rt8.patch.xz командой
unxz patch-4.6.4-rt8.patch.xz и скопируем его в папку с исходниками ядра:
cp patch-4.6.4-rt8.patch linux-4.6.4/

Дальнейшие действия в терминале будем производить находясь в папке с исходными кодами ядра, для это войдем в нее:
сd linux-4.6.4

RT-KERNEL НА СТАРТ И ДРУГИЕ МЕЛОЧИ

Настало время применить патч превращающий обычное ванильное ядро в ядро реального времени.
Для этого выполним команду:
patch -p1 -i patch-4.6.4-rt8.patch
По выводу в терминале вы увидите, что исходные коды ядра получили изменения:

patching file net/core/sock.c
patching file net/ipv4/icmp.c
patching file net/ipv4/inet_connection_sock.c
patching file net/ipv4/inet_timewait_sock.c
patching file net/ipv4/sysctl_net_ipv4.c
patching file net/mac80211/rx.c
patching file net/netfilter/core.c
patching file net/packet/af_packet.c
patching file net/rds/ib_rdma.c
patching file net/sched/sch_generic.c
patching file net/sunrpc/svc_xprt.c
patching file scripts/mkcompile_h
patching file sound/core/pcm_native.c

С этого момента мы имеем исходники ядра реального времени.
Остается его сконфигурировать.
Конфигурировать можно в тестовом или графическом режимах. Для графического режима можно использовать команду
make xconfig
Но пока вы ее не применили и не получили кучу ошибок в окне терминала, я их заочно предупрежу.
Для работы xconfig требуется библиотека qt, а для применения ключей — библиотека ssl, которые и нужно сперва установить из репозитариев.
Устанавливаем qt:
sudo apt-get install libqt4-dev
Устанавливаем ssl:
sudo apt-get install libssl-dev

Не забудьте установить и сам gcc-g++.
Кроме того, если сейчас дать команду make xconfig, то вам придется настраивать много параметров вручную, логичнее получить их значения из настроек текущего ядра. Для этого скопируем файл конфигурации текущего ядра в папку с исходными кодами нового ядра 4.6.4:
cp /boot/config-$(uname -r) .config
И вот только теперь даем команду make xconfig и наблюдаем красивое графическое окно, в котором и будем изменять лишь некоторые параметры ядра.
Во первых в ядре нужно включить само свойство реалтаймовости (т.е. работы в реальном времени, что требуется программам работающим с прецизионной точностью).
Для этого в левом окне программы щелкните на раздел “Processor type and features”, а в правом найдите пункт Preemption Model и отметьте пункт
Fully Preemptible Kernel (RT)

Включение режима реального времени.

Далее нужно задать частоту обновления в  1000 Hz (этот параметр скорее всего уже будет установлен на таком значении).
Этот пункт находится чуть ниже в разделе Timer frequency.

Бескомпромисcные 1000 Hz.

Стоит проверить включен ли HPET (High Precision Event Timer) —  таймер событий высокой точности. Этот таймер работает очень быстро, по сравнению со старым RTC-таймером, не менее 10 Мгц (10 миллионов раз) в секунду, поэтому имеет смысл в современных операционных системах  использовать именно его.
Для поиска этого пункта проще нажать горячие клавиши Ctrl+F и ввести в появившуюся форму аббревиатуру HPET. Должна стоять галочка напротив пункта HPET — High Precision Event Timer.
Для режима реального времени необходима указать наиболее подходящий планировщик задач deadline.
Этот параметр можно найти во вкладке Enable the block layer – IO schedulers.

Планировщик Deadline.

Удачная мысль указать ядру, какой именно процессор установлен в компьютере — AMD, Core Duo, Atom и так далее, это поможет создать более быстрое ядро.
Выбор типа процессора в уже знакомой вкладке Processor type and features.

Выбор процессора.

Остается только убедится, что сама звуковая архитектура alsa включена, так как моя цель в сборке релтайм-ядра — создание музыкального сервера Hi-Fi/Hi-End уровня.
Эту опцию вы найдете в пункте Sound card support (должна быть активирована в виде галочки) под названием Advanced Linux Sound Architecture.
Обратите внимание, когда вы щелкаете по чекбоксу в нем отображается точка, галочка или он может быть не пуст. Точка указывает, что опция собирается в виде  отдельно загружаемого модуля, а галочка требует встроить функцию непосредственно в монолит ядра.
Внеся изменения выбираем пункт меню Save As (Сохранить как) и сохраняем файл под названием .xconfig.

Cохраняем .xconfig.

Теперь у нас есть сконфигурированное ядро. Подчищаем перед установкой командой:
make-kpkg clean
и даем следующую длинную команду, но не торопитесь пока я не объясню ее:
fakeroot make-kpkg —initrd —revision=4.6.4.RT kernel_image kernel_headers
Этой длинной командой мы соберем два установочных deb-пакета с ядром, которые позже сможем штатно установить в систему Ubuntu. Программа fakeroot обеспечивает сборку пакета в “обманной среде”, когда make-kpg считает, что он работает от имени пользователя с неограниченным доступом (root), а на самом деле исполняет все действия от текущего пользователя.
Ключ —initrd позволяет автоматически создать загрузочный образ требуемый при загрузке нового ядра.
Ключ “—revision=” может содержать любой текст, с помощью которого вы для себя идентифицируете собранные deb-пакеты. Этот текст будет добавлен к надписи  kernel_image и kernel_headers.
В принципе уже можно запускать эту составную команду на запуск, но компиляция ядра тогда будет идти очень долго, как будто вы едите на автомобиле только на первой передаче. Если в компьютере установлен многоядерный процессор, то этот процесс можно сильно ускорить добавив ключ -j с числом ядер вашего процессора +1. Если в моем компьютере установлен 8 ядерный процессор AMD FX8320, следовательно, я поставлю ключ -j9.
Тогда компилятор сможет нагружать все 8 ядер процессора и значительно сократит время сборки ядра.

Тихо, идет компиляция…

В моем случае сборка велась в пределах 40 минут, после чего в каталоге src появились два пакета с расширением deb, готовых к установке linux-image-4.6.4-rt8_4.6.4.RT_amd64.deb и linux-headers-4.6.4-rt8_4.6.4.RT_amd64.deb.

Свежее rt-ядро 4.6.4 готово к установке.

ФИНАЛЬНЫЙ АККОРД ИЛИ БЕЗ ЗАПРЕТОВ

Установка ядра — самое простое мероприятие. Находясь в папке src  дайте команду
sudo dpkg -i *.deb
И новенькое реалтаймовое ядро установится в вашу систему.

Установка ядра.

Но раз уж мы получили ядро реального времени, то нужно внести небольшие изменения, чтобы реалтаймовость была задействована на полную катушку.
Главным образом нужно снять некоторые ограничения, за это отвечает файл limits.conf. Об этом трюке можно прочитать по ссылке на сайте разработчиков alsa.
Откроем файл для редактирования:
sudo nano /etc/security/limits.conf

Вы видите некоторое количество записей, но они все закоментированы. Просто внесите несколько новых:

@audio — rtprio 95

@audio — memlock 1000000

@audio — nice -19

Этими значениями мы задали аудиозадачам запущенным от обычного пользователя приоритет реального времени, а так же выделили участок памяти размером в 1 Гб, который будет использоваться единолично для аудио. Размер этой памяти вы можете выбрать самостоятельно, в старых руководствах рекомендуется ставить половину объема от имеющегося, но сегодня в персоналках такие объемы памяти, что и не снились пользователям прошлых лет, так что 1 Гб я думаю будет достаточно для большинства случаев.
Сохраняем файл (Ctrl+O), выходим (Ctrl+X) и перегружаемся.

Магия RT.

О ДИВНЫЙ НОВЫЙ МИР

У вас получилась фантастически быстрая система Linux с ядром работающим в режиме реального времени. Фантастически малые задержки (latency), сверхвысокоточный таймер отмеряющий время с безумной точностью, звуковая система alsa передающая аудиопоток в режиме bitperfect, и это не сон. О чем еще можно мечтать (кроме, разумеется, мира во всем мире)?
Улыбнитесь, добро пожаловать в Linux!

Дополнение:

Если компиляция прекращается с ошибкой, возможно вы не установили все требуемые для этого компоненты, например kernel-package или fakeroot.

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

  1. все очень закрученно..мне вырасшему на аналоге…этого не догнать никогда…

  2. Спасибо Вам огромное за статью.
    Собрать по данной инструкции получилось с версией ядра 4.9
    В версиях ядер 5.4; 5.16 отсутствует во вкладке Processor type and features меню Preemption Model, и IO schedulers -deadline. Патчи rt на данные ядра есть. Подскажите как собрать в таких случаях, или статья требует обновления?

  3. Andy
    поставь арч, там есть в ауре rt ядро 5.16. Так же есть пользовательский репозиторий с уже скомпилированным.

Отправить ответ