Archive:RT Kernel Instructions
Эта статья актуальна для версии '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/