Есть много причин, по которым хорошую перспективную технологию могут не принимать в официальную ветку Linux — Линус славится своими жесткими требованиями к новому коду. Но от этого факта менее интересными такие технологии не становятся. И иногда ради них стоит пересобрать ядро с наложением стороннего патча.

 

Какими бывают линуксы

Ванильным (официальным) принято считать ядро, которое можно найти на kernel.org, и главным покровителем которого является сам Линус. На сайте можно скачать старое ядро ветки 2.4.x (которое уже практически не поддерживается) или несколько стабильных (или не очень 🙂 ) ядер ветки 2.6.x. Нестабильные ядра имеют суффикс «-rc», а ежедневные снапшоты из git’а – «rc-git». Обычно выходит 7-9 rc-релизов, прежде чем ядро обретает статус стабильного. В среднем, стабильные релизы выходят 4-5 раз в год, а последний на момент написания статьи релиз — 2.6.35.

 

linux-rt

Пожалуй, самый известный сторонний патч. Позволяет превратить обычный Linux в ОС реального времени. И хотя главное применение такой операционки – промышленные и встроенные системы, на обычном десктопе она тоже может быть интересна. Например, тем, кто часто занимается обработкой звука или видео или постоянно грузит систему какими-нибудь ресурсоемкими вычислениями. Встречаются также свидетельства о положительном эффекте от применения этого ядра на highload-серверах. Я же ничего, кроме слегка упавшей общей производительности системы, не заметил.

Скачать патч можно по адресу www.kernel.org/pub/linux/kernel/projects/rt/. Последняя стабильная версия – 2.6.33.6-rt27.
В некоторых дистрибутивах realtime-ядро уже присутствует в репозитории. Например, в Ubuntu для установки rt-ядра достаточно выполнить

$ sudo apt-get install linux-rt

В других же дистрибутивах ядро с этим патчем можно легко собрать. Для этого надо наложить патч на ванильное ядро и при конфигурировании указать опцию Processor type and features –> Preemption Mode (Complete Preemption (Real-Time)). И еще рекомендуется отключить опцию Kernel hacking –> Check for stack overflows, так как она повышает латентность. Чтобы можно было собирать некоторую статистику по времени отклика, при конфигурировании нужно также включить: Kernel hacking –> Tracers –> Kernel Function Tracer, Interrupts-off Latency Tracer, Interrupts-off Latency Histogram, Preemption-off Latency Traver, Preemption-off Latency Histogram, Scheduling Latency Tracer, Scheduling Latency Histogram, Missed timer offsets histogram.
После сборки ядро должно содержать в имени PREEMPT и RT, например:

$ uname -v

#1 SMP PREEMPT RT Wed Aug 4 00:40:34 YEKST 2010

Чтобы потешить собственное самолюбие, можно включить сбор статистики:

# echo 1 >/sys/kernel/debug/tracing/latency_hist/enable/wakeup

Саму статистику смотрим тут:

$ grep -v " 0$" /sys/kernel/debug/tracing/latency_hist/wakeup/CPU0

Самое интересное там: значения минимального, среднего и максимального времени отклика.

 

BFS

Широко известный в узких кругах анестезиолог-линуксоид Кон Коливас с переменным успехом поддерживает собственную ветку (точнее, набор патчей) Linux. Главным нововведением в его патчсете является новый планировщик BFS (Brain Fuck Scheduler), являющийся альтернативой стандартному CFS и показывающий, по результатам тестов, улучшенную отзывчивость ядра на десктопе (другими словами, при использовании BFS жадные до графических ресурсов приложения получают ощутимый прирост производительности, а раздражающие паузы, возникающие, например, при переключении между ресурсоемкими программами, которые требуют доступ к диску, становятся менее заметными, либо исчезают совсем).

Скачать исходники можно отсюда: www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/. После наложения патча (текущая версия – 2.6.34-ck1) станет доступна опция General Setup –> BFS cpu scheduler.

 

ReiserFS

Исходя из тестов и многочисленных отзывов, это очень быстрая файловая система. В настоящее время ее разработкой занимается наш соотечественник, Эдуард Шишкин, и группа энтузиастов. Эдуард полон оптимизма и решительности включить Reiser4 в ванильное ядро. Последний на момент написания статьи патч (reiser4-for-2.6.34.patch.gz) скачать можно здесь: ftp://ftp.kernel.org/pub/linux/kernel/people/edward/reiser4/reiser4-for-2.6/. После наложения патча появится опция File Systems –> Reiser4.

Но поддержка ядром ФС – это еще не все. Чтобы можно было оперировать с разделами reiser4, надо поставить reiser4progs. Во многих дистрибутивах этот комплект утилит есть в репозитории:

$ sudo apt-get install reiser4progs

Соответственно, основные операции с ФС:

  • mkfs.reiser4 – создать раздел с reiser4;
  • fsck.reiser4 – проверить раздел с reiser4;
  • measurefs.reiser4 – посмотреть параметры раздела с reiser4.
 

Grsecurity

Патч, содержащий потрясающее количество механизмов для повышения защищенности Linux-системы. Опции компиляции grsecurity расположены в Security options –> Grsecurity. Есть три уровня безопасности на выбор: низкий, средний и высокий. Низкий уровень рекомендован, когда более высокие уровни не подходят из-за использования нестандартного набора ПО. Он содержит:

  • защиту ссылок и FIFO – пользователям запрещается переходить по ссылкам (писать в FIFO), владельцем которых является другой пользователь;
  • запрет пользователям на чтение dmesg – у всех пользователей, кроме root, отберут право на чтение системных сообщений ядра;
  • начальную защиту chroot – рабочая директория для всех только что запущенных в песочнице приложений будет принудительно установлена в корневую директорию chroot.

В среднем уровне защиты дополнительно добавятся технологии:

  • дополнительные ограничения для приложений, запускаемых в chroot: запрет монтирования и mknod (создание именованных каналов, специальных символьных и блочных файлов), запрет на двойной chroot, запрет на запись в sysctl и другое;
  • ограничение прав на чтение /proc для пользователей, не входящих в заранее заданную группу (по умолчанию wheel);
  • ограничение записи в /dev/kmem, /dev/mem и /dev/port;
  • рандомизация адресного пространства;
  • серьезное логирование подозрительных событий (неудавшихся вызовов fork(), попыток изменения системного времени, сигналов вроде SIGSEGV и подобных);

Высокий уровень еще больше затягивает узлы, так как дополнительно:

  • ограничивает права на чтение /proc – теперь пользователи смогут читать из /proc информацию только о своих процессах. Можно также указать GID специальной группы, которая сможет читать любую информацию из /proc.
  • накладывает ограничения на работу процессов в chroot-окружении: отключение возможности устанавливать suid-бит, отключение возможности посылать некоторые сигналы внешним процессам, ограничение на выполнение таких системных задач, как изменение системного времени или перезагрузка компа;
  • добавляет дополнительное логирование (в том числе всех mount/umount);
  • включает рандомизацию стека ядра;
  • добавляет ограничение на чтение информации о ядре через системные вызовы для обычных пользователей (для root эта возможность остается).

Необязательно в качестве Security Level выбирать один из имеющихся уровней. Есть вариант Custom, позволяющий отдельно выбрать все необходимые опции. Еще одна интересная опция Grsecurity –> Sysctl support позволит включать/отключать параметры безопасности через sysctl без необходимости пересобирать ядро. Так как эта директива отрицательно влияет на общую безопасность системы, ее рекомендуется использовать лишь в тестовых целях.

Помимо уровней безопасности, при конфигурации можно включить/отключить RBAC (Role Based Access Control) – управление доступом на основе ролей. Управление пользователями и их ролями осуществляется с помощью специальной утилиты gradm2, присутствующей в большинстве дистрибутивов:

$ sudo apt-get install gradm2

 

Zen-kernel

Zen-kernel – наверное, самая большая пачка заплаток ядра в одном месте. Позиционируется как быстрое ядро для десктопов. Получить zen-kernel можно тремя способами:

  • скачать архив с последним релизом (за номером 2.6.34-zen1);
  • забрать версию с уже наложенными патчами из git’а;
  • скачать патч для нужной версии и наложить самому.

У них есть два репозитория: zen-stable.git (с патчами, наложенными на стабильное ядро) и zen.git (синхронизация с git-хранилищем Линуса и наложение тестовых патчей).
Набор сторонних патчей меняется от релиза к релизу и на данный момент включает в себя:

  • патчи от Кона Коливаса (в том числе BFS);
  • Reiser4;
  • Linux-PHC – проект, позволяющий снижать напряжение CPU для уменьшения энергопотребления и температуры;
  • обновленные и добавленные дрова (для Lenovo ThinkPad SL, Gamecube/Wii, Macbook, WiFi-чипов и другого);
  • Tuxonice – патч, реализующий продвинутый hibernate («спящий режим» – при выключении содержимое ОЗУ скидывается на винт, при включении – восстанавливается);
  • поддержка FatELF – формата бинарников, содержащего в одном файле варианты для нескольких архитектур (аналог Universal Binary в Mac OS X);
  • DazukoFS – виртуальная ФС, предоставляющая on access доступ к файлам. Широко используется различными антивирусами.
 

Универсальная сборка

Итак, ядро и патчи выбраны, можно приступать к сборке. Опишу сборку своего ядра на примере Ubuntu, хотя в других дистрибутивах последовательность действий будет аналогичной. Если нужно просто пересобрать имеющееся ядро (изменив опции конфигурации), то проще скачать исходники ядра с помощью стандартного менеджера пакетов твоего дистрибутива и собирать уже их:

$ sudo apt-get install linux-source

Но мне zen-kernel нравится больше, чем стандартное generic-ядро ubuntu, поэтому его и буду мучить. Поставим все, что может пригодиться для сборки:

$ sudo apt-get install build-essential libncurses5-dev \
libgtk2.0-dev libglade2-dev libqt3-mt-dev git-core

Добавим своего юзера в группу src, чтобы можно было без проблем собирать в /usr/src:

$ sudo usermod -a -G src adept

Клонируем git-репозиторий (приготовься скачать около 500 метров):

$ cd /usr/src
$ git clone git://zen-kernel.org/kernel/zen-stable.git linux-2.6-zen

Смотрим, какие ветки есть в репозитории:

$ git tag # кроме патченных, доступны также ванильные версии

Выбираем последнюю патченную версию:

$ git checkout v2.6.34-zen1

Сорцы не обязательно вытягивать из git. Если ты ограничен по трафику или скорости инета, то быстрее и дешевле будет скачать патч и официальное ядро. Заплатка накладывается следующим образом:

$ cd /usr/src/linux-2.6.34
$ zcat ../patch-2.6.35.bz2 | patch -p1

Утилита patch также имеет замечательную опцию ‘—dry-run’, позволяющую протестировать, как наложится патч, прежде чем его накладывать.
Далее выбираем способ конфигурирования ядра:

  • make config – для тех, у кого уйма свободного времени. Система задаст несколько тысяч вопросов (по одному на каждую опцию конфигурации);
  • make allnoconfig/allyesconfig – генерируется конфиг, в котором на все вопросы отвечено no/yes;
  • make defconfig – конфиг с настройками по умолчанию;
  • make randconfig – самый веселый способ – использует великий рандом для ответа на вопросы;
  • make oldconfig – при использовании старого конфига. Задаст вопросы только про те пункты, которых не было в старом конфиге;
  • make menuconfig – псевдографический, использующий ncurses, интерфейс;
  • make nconfig – одно из нововведений ядра 2.6.35. Тоже псевдографический, использующий ncurses, интерфейс, но выглядит несколько более свежо, чем menuconfig;
  • make xconfig – графический интерфейс на базе QT;
  • make gconfig – графический интерфейс на базе GTK.

Мне больше привычен интерфейс menuconfig.
Какие-то конкретные советы по конфигурированию ядра давать сложно – все очень сильно зависит от имеющегося окружения и желаемых результатов. Но я всегда придерживаюсь нескольких простых правил:

  • Все, что мне точно понадобится (в том числе поддержка ФС, на которой у меня /) и будет нужно часто, я включаю в ядро. Все, что может пригодиться или будет нужно редко – компилирую модулем. Все, что точно не пригодится, соответственно, выкидываем.
  • Опции с пометкой EXPERIMENTAL лучше не включать без крайней на то необходимости. Также не рекомендуется включать Device Drivers –> Staging Drivers. Ядро может просто не собраться или работать не стабильно.
  • Чтобы не путаться в ядрах, добавляю суффикс версии ядра в General Setup –> Local Version.

Также неплохой отправной точкой может стать конфиг дистрибутивного ядра.
После того, как конфиг готов (и сохранен в файл .config), можно приступать к сборке:

$ make

С помощью опции «-j» можно указать количество потоков, что немного ускорит компиляцию на многоядерном процессоре. В зависимости от мощности компа и опций конфигурации, ядро может собираться по часу и даже больше. После компиляции начинается установка:

$ sudo make modules_install
$ sudo make install

На самом деле модули просто скопируются в /lib/modules/, а ядро с конфигом – в /boot.
Создаем initrd для нашего нового ядра:

$ sudo update-initramfs -k v2.6.34-zen1 -c

Обновляем конфигурацию grub, чтобы он нашел новое ядро:

$ sudo update-grub

Все, можно идти в ребут, скрестив пальцы и затаив дыхание, загрузиться с новым ядром.

 

Компиляция. Debian-way

Выше я описал способ, которым можно собрать ядро в любом дистрибутиве. Но практически во всех дистрах есть свой путь, дающий те или иные плюшки, самая большая из которых — получение на выходе пакета с ядром, который можно легко поставить или удалить штатным пакетным менеджером.

В Debian/Ubuntu за сборку ядра отвечает make-kpkg. Для того, чтобы воспользоваться make-kpkg, установим один пакет:

$ sudo apt-get install kernel-package

Генерация конфига происходит точно так же, как и в способе выше, а сборка несколько иначе:

$ fakeroot make-kpkg --initrd --revision=mykernel \
kernel_image kernel_headers modules_image

Эта команда сначала соберет ядро, а потом создаст два пакета: linux-image-version-revision.deb (бинарник и модули ядра) и linux-headers-version-revision.deb (заголовочные файлы ядра), которые будут лежать в /usr/src.

Ставим то, что получилось, и идем на перезагрузку:

$ sudo dpkg -i /usr/src/*.deb
$ sudo reboot

 

make complete

К сожалению, журнал не резиновый, и рассказать получилось далеко не про все заслуживающие внимания патчи. За бортом остались OpenVZ и Xen, Openwall, а также целый класс патчсетов – дистрибутивные (ведь очень небольшое количество дистрибутивов использует ванильное ядро).

 

Скажи «нет!» ребуту

Допустим, у тебя есть высоконагруженный production-сервер, который должен быть доступен 24×7. Он отлично работает, да вот беда – вышел secutity-update ядра твоего дистрибутива, и надо бы перезагрузиться. Но ребут – это downtime сервера. И оставлять сервер с уязвимостью – тоже не дело. Придется искать второй сервер для временного переноса функционала с первого. Есть выход гораздо проще: можно обновлять ядро, не перезагружаясь, а используя ksplice.com – платный сервер обновлений для ядер распространенных дистрибутивов. Установка очень проста – добавляется репозиторий и ставится программулина uptrack. Потом делается

# uptrack-upgrade

И все обновления установлены! Правда, «uname -a» все еще показывает старую версию. Зато

# uptrack-show

расскажет всю правду об установленных апдейтах.
В дополнение система еще имеет веб-интерфейс, где можно посмотреть статус всех своих подключенных серверов, умеет присылать на email уведомления о выходе новых патчей. И такое rebootless счастье стоит, в принципе, не так уж и дорого – $3,95 в месяц за один физический сервер (если серверов больше 20, то $2,95). Есть триальный доступ на 30 дней. А поддержка десктопной убунты вообще бесплатна.

В общем, сказка, если б не одно «но» – все это работает только со стандартным ядром твоего дистра – никаких тебе патчей и обновлений версий ядра.

 

Турбо-компиляция

Далеко не всегда получается с первого раза собрать идеально работающее ядро – обязательно забудешь включить какой-нибудь модуль или наложить какой-нибудь патч. А новая сборка, особенно на маломощном компе, может быть раздражающе долгой. В таком случае на помощь придет ccache, умеющий кэшировать результаты компиляции. В результате повторная пересборка проходит значительно быстрее. Для использования ccache при сборке ядра набирай

$ make CC="ccache gcc" CXX="ccache g++"

Весь кэш будет храниться в каталоге ~/.ccache, а статистику по его использованию можно посмотреть с помощью команды

$ ccache -s

 

INFO

  • fakeroot – эмулирует для программы получение рутовых привилегий. Позволяет создавать пакеты, не прибегая к sudo.
  • Шедулер BFS используется в проекте Android.
  • Утилита hackbench (developer.osdl.org/craiger/hackbench/src/hackbench.c) может пригодиться при тестировании планировщика BFS. Она измеряет скорость создания указанного числа процессов и скорость обмена данных между ними.
  • Kernel Check (kcheck.sf.net) – набор python’овых скриптов, позволяющих за пару щелчков мыши сделать свежий deb-пакет ядра, включая необходимые патчи.
 

WWW

Оставить мнение

Check Also

В гостях у чертёнка. FreeBSD глазами линуксоида

Порог вхождения новичка в мир Linux за последние десять-пятнадцать лет ощутимо снизился. О…