Archive:RT Kernel Instructions

Перейти к: навигация, поиск
Icon-obsolete.png Эта статья актуальна для версии '10.0', которая теперь является устаревшей!
Пожалуйста, обратитесь к странице обсуждения этой статьи для получения подробной информации.

RT Kernel Instructions Ver.2 для SuSE 10.0


This page in:
More languages
in the left sidebar

Небольшая инструкция по модификации вашей Linux-системы для работы со звуком.

Этот материал создал MetaSymbol на основе руководства, написанного gimpel (gimpel.funpic.de) и переведённого oc2pus.

  • Страница проекта: JackLab

Главным параметром для операционной системы при работе со звуком является аудио задержка. Задержка - это отрезок времени между приёмом системой сигнала о начале проигрывания до окончания обработки системой этого сообщения (другими словами, это время между нажатием клавиши на клавиатуре и моментом, когда Вы слышите созданный системой звук).

Стандартные ядра Linux не совсем подходят для обработки звука, так как имеют слишком большую задержку (около 11мс), что сравнимо с Windows или MAC. Чем мощнее система, тем меньше задержка, тем больше возможностей система может реализовать в один момент времени (использовать большее количество синтезаторов и т.д.).

Инго Молнар (Ingo Molnar), разработчик системы RedHat, и другие основали проект, призванный уменьшить задержку в ядрах Linux: Realtime Preemption. При использовании хорошего звукового оборудования сервер JACK (Jack Audio Connection Kit) может достичь очень малой задержки - менее 1мс, что возможно, например, при использовании системы Coreaudio в MacOS X. Для создания мультимедийного ядра с малой задержкой было создано следующее руководство, которое поможет преобразовать обычное ядро (т.н. vanilla kernel) с помошью Realtime Preemption в ядро для работы со звуком.

Примечание:

Это ядро имеет статус эксперементального. По мнению многих разработчиков, модуль rt-lsm, служащий для запуска в realtime-режиме приложений непривилегированного пользователя, является устаревшим. "Официальное" realtime-ядро для openSUSE будет использовать PAM для приоритета SCHED_FIFO, что позволит решить проблему с запуском в RT-режиме процессов пользователя.

По сравнению с обычным ядром SuSE Вы теряете некоторые возможности:

- поддержку ide-диска sis5513 и processor thermal fan control
UPDATE Это может быть исправлено: редактируйте /[путь к директории с исходными кодами текущего ядра]/arch/i386/kernel/tsc.c, найдите следующие строки:

void tsc_c3_compensate(unsigned long usecs)
{
       u64 cycles = (usecs * tsc_khz)/1000;
       tsc_c3_offset += cycles;
}

Сразу после них добавьте:

EXPORT_SYMBOL_GPL(tsc_c3_compensate)

- поддержку файловой системы ReiserFS4 (которая, по нашему мнению, не приспособлена для работы с аудио программами) (?)

- lirc (удалённое управление по ИК-порту) (?)

- submount (не используется, так как, начиная с SuSE 9.2, используется система udev, hal/dbus/ivman для автомонтирования. Вы сможете получить опции автомаунтера несколько позже, при выходе нового ядра) (?)

- некоторые возможности ipv6 и некоторые другие незначительные возможности (?)


Руководство создано на примере ядра 2.6.13.4.

UPDATE: Некоторые пользователи сообщали, что смогли успешно собрать и запустить текущее ядро с 2.6.14.3 с RT-патчем 20/21.


1: Получение пакета исходных кодов ядра и необходимых пачтей


  • получение текущего стабильного vanilla-kernel:
# wget http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.13.4.tar.bz2
  • получение патча Realtime Preemption:
# wget http://people.redhat.com/mingo/realtime-preempt/older/patch-2.6.13-rt14
  • получение патча realtime-lsm:

Установка этого патча позволяет непривилегированным пользователям запускать приложения в RT-режиме, что необходимо для получения малой задержки. Разработка этого патча прекращена в связи с появившимися rt-ограничениями. Мы используем последнюю версию, созданную для 2.6.11.7, прекрасно работующую с 2.6.13.4.

# wget http://kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.11/2.6.11-mm4/broken-out/rt-lsm.patch
  • если Вы хотите установить бутсплеш:
# wget http://www.bootsplash.de/files/bootsplash-3.1.6-2.6.13.diff



2: Распаковка и наложение патчей на ядро


# cd /usr/src/linux
# su
password:
# tar xvjf /path/to/linux-2.6.13.4.tar.bz2
# mv linux-2.6.13.4 linux-2.6.13.4-realtime
# cd linux-2.6.13.4-realtime
# patch -p1 < /path/to/patch-2.6.13-rt14
# patch -p1 < /path/to/rt-lsm.patch
# patch -p1 < /path/to/bootsplash-3.1.6-2.6.13.diff
  • смена информации о релизе для Вашего ядра:
# vi Makefile

..измените EXTRAVERSION=.4-jad3 и сохраните файл.



4: Конфигурирование ядра


  • начинаем с клонирования текущего ядра:

используем конфигурацию текущего ядра, для избежания повторной конфигурации:

# zcat /proc/config.gz > .config
  • сделаем некоторые изменения в опциях нового ядра:
# make menuconfig
  • активизируем опцию Complete Preemption:
Processor type and features --->
Preemption Mode (Complete Preemption (Real-Time)) --->
( ) No Forced Preemption (Server)
( ) Voluntary Kernel Preemption (Desktop)
( ) Preemptible Kernel (Low-Latency Desktop)
(X) Complete Preemption (Real-Time)
  • активизируем realtime-lsm:
Security options  --->
     <M>   Realtime Capabilities

Покиньте меню с помошью "Exit" и сохраните новую конфигурацию ядра.



5: Компиляция и установка нового ядра


  • компиляция нового ядра::
# make rpm

..это может занять много времени..

  • установка нового ядра:

Проверяем, какое ядро установлено в системе:

# rpm -qa | egrep kernel kernel-2.6.13-14-default

Стираем запись о ядре из базы данных:

# rpm -e --justdb kernel-2.6.13-14-default

Устанавливаем только что собранное ядро JAD:

# rpm -ivh 2.6.13.4-jad3-default.i386.rpm

Создаём initrd:

# cd /boot
# mkinitrd -k vmlinuz-2.6.13.4-jad3-default -i initrd-2.6.13.4-jad3-default

Создаём символические ссылки:

# ln -s initrd-2.6.11.7-jad.1 initrd-jad
# ln -s vmlinuz-2.6.11.7-jad1 vmlinuz-jad

Конфигурируем загрузчик:

# vi /boot/grub/menu.lst

Скопируйте запись о Вашем текущем ядре и подредактируйте информацию о образе ядра и initrd. Их имена должны совпадать с только что созданными имиджами (символические ссылки initrd-jad и vmlinuz-jad)

  • перезагружайтесь



6: Активизация и тестирование RT-режима


  • после перезагрузки:

Теперь необходимо активизировать модуль realtime-lsm:

узнаём GID (Group ID - идентификатор группы) группы audio, в которую должен быть включён пользователь:

# su
password:
# grep audio /etc/group
  audio:x:17:metasymbol - видим, что gid группы audio - 17
# modprobe commoncap
# modprobe real-time gid=17 - эта опция указывает, что пользователям группы с ID=17 (у нас это группа audio) будет доступна работа в RT-режиме

Далее, загружаем модуль realtime-lsm:

# lsmod|grep real-time
  real-time 5512 0
  commoncap 7040 1 real-time

Если модуль realtime-lsm загрузился без проблем, то добавляем его в автозагрузку:

# echo "modprobe real-time gid=17" >> /etc/init.d/boot.local

Теперь он будет загружаться в ядро автоматически при каждом запуске системы.

  • тестируем RT-режим:

Если Вы выполнили все указанные Выше инструкции, то теперь Вы сможете запустить сервер JACK в realtime-режиме от имени непривилегированного пользователя:

# jackd -R -v -d alsa

Если сервер запускается без сообщений об ошибках, то Вы выполнили всё правильно и теперь JACK работает в RT-режиме.

Все сообщения об ошибках в данном руководстве можно послать на адрес core at jacklab dot net или переводчику - andronrus at gmail dot com



Известные ошибки


При инициализации mkinitrd -k:

/Driver modules: ide-disk sis5513 processor thermal fan/
/Filesystem modules:/
/WARNING:
/var/tmp/mkinitramfs.a11783/mnt/lib/modules/2.6.13.4-jad3--default/kernel/drivers/acpi/processor.ko
needs unknown symbol tsc_c3_compensate/
/Including: klibc initramfs udev/
/Bootsplash: SuSE (1024x768)/
/6568 blocks/