Есть много причин, по которым хорошую перспективную технологию могут не принимать в официальную ветку 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

LUKS container vs Border Patrol Agent. Как уберечь свои данные, пересекая границу

Не секрет, что если ты собрался посетить такие страны как США или Великобританию то, прежд…