вторник, 1 декабря 2015 г.

Собираем своё собственное ядро Linux

Иногда может потребоваться собрать своё собственное ядро Linux. Причины для этого могут быть следующими:





  • вам нужно чистое ядро, без дистрибутивных патчей;
  • вы хотите наложить собственные патчи (коих очень много);
  • вы хотите собрать ядро под свою конфигурацию железа, выкинуть из него лишнее и/или заточить под определённые задачи;
  • вы хотите включить в состав ядра эксперементальный драйвер или файловую систему, которой нет в "ванильном" ядре (например ZFS или Raiser 4);

В сборке ядра нет ничего сложного. Важно лишь понимать, для чего это делается, а также не трогать те параметры, которые вам непонятны. В этой заметке я опишу два примера сборки ядра в Debian-based дистрибутивах. В первом примере я покажу как просто собрать чистое, что называется "ванильное" ядро (такое, каким его выпускает Линус Торвальдс), а во втором - как применить собственные патчи и провести оптимизацию ядра. Сразу напишу два предупреждения:

  • вам нужно будет пересобирать ядро при каждом его обновлении (качать "обновляющий патч", накладывать его и собирать ядро);
  • пересобранное ядро может не заработать, если в вашей системе используются какие-нибудь хаки для обеспечения работоспособности того или иного оборудования;
  • при неправильном конфигурировании ядра, особенно в случае неграмотного или бездумного наложения патчей, вы можете получить либо тормозящую до ужаса систему, либо лишиться её вовсе.

ВСЕ ДЕЙСТВИЯ ВЫ ПРОИЗВОДИТЕ НА СВОЙ СТРАХ И РИСК!

Простая сборка ядра без применения патчей.


Исходные коды ядра Linux находятся на сайте kernel.org. Там же находятся "обновляющие патчи". Что нам нужно? Качаем с сайта тарболл (архив) с последней стабильной версией ядра (на момент написания статьи, это версия 4.3). Качаем любым удобным способом. Далее нам потребуются инструменты для сборки:

sudo apt install build-essential gcc kernel-package patch
sudo apt-get build-dep linux

После того как установятся все необходимые инструменты, распакуйте архив с кодом ядра в любую удобную директорию. Пусть это будет /home/user/KERNEL, где "user" - имя пользователя системы. Далее откройте терминал и перейдите туда:

cd /home/user/KERNEL

Осталось собрать ядро:

fakeroot make-kpkg -j 3 --initrd --append-to-version=-custom kernel_image kernel_headers #-j 3

Цифра 3 после j - это количество ядер вашего процессора + 1. То есть для двухядерного это 3, для 4-х ядерного это 5 и так далее.
-custom - здесь можете указать удобное имя для ядра, чтобы было легче его отличить от дистрибутивного.
kernel_image и kernel_headers - это само ядро и его заголовочные файлы соответственно. Headers необходимы для сборки драйверов и модулей ядра, а также для некоторых других целей. После выполнения этой команды, начнут появляться несколько вопросов по конфигурированию ядра. Так как мы всё оставляем по умолчанию, просто жмите Enter пока не начнётся сборка. В зависимости от мощности вашего компьютера, сборка может занять от 15-20 минут до нескольких часов. После сборки, в директории /home/user появятся два deb-пакета: ядро и заголовки. Установите их командой:

sudo dpkg -i linux-image-4.3*deb linux-headers-4.3*deb
sudo update-grub

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

Сборка ядра с применением патчей и дополнительной конфигурации.


В этот раз мы соберём оптимизированное ядро для работы со звуком и видео, а также для большей отзывчивости системы. Для этого мы применим два патча: так называемый патч для режима реального времени (PREEMPT RT) и патч для компилятора GCC, чтобы добавить дополнительные опции для процессорных оптимизаций. Для начала, что такое патч? Патч - это текстовый файл, который создаётся программой diff, содержащий в себе изменения кода в определённых частях, которые при применении патча, заносятся в нужные места. Так как RT-патч выходит с большим запаздыванием, последняя его версия - для ядра 4.1. Впрочем это не так важно. По той же схеме, качаем ядро 4.1 с kernel.org и распаковываем в директорию /home/user/KERNEL-CUSTOM. Теперь качаем патчи. PREEMPT_RT и GCC Patch. Из скачанных архивов, нам нужны файлы с расширением .patch, которые необходимо положить в каталог с исходным кодом ядра. То есть в /home/user/KERNEL-CUSTOM. Перед применением патчей нужно убедиться, что не будет никаких ошибок. Открываем терминал:

cd /home/user/KERNEL-CUSTOM
patch -p1 -i patch-4.1.13-rt15.patch --dry-run


Опция --dry-run позволяет симулировать применение патча, без внесения изменений в файлы. Если ошибок не обнаружено (см. скриншот) - примните патч уже без опции --dry-run. Аналогичные действия проведите и со вторым патчем. Не применяйте одновременно больше одного патча! Теперь нам нужно сконфигурировать наше ядро. На выбор нам предлагаются следующие варианты:

make config - в терминал будут поочерёдно выводиться вопросы о конфигурации той или иной подсистемы ядра. Крайне долгий и утомительный процесс. Забудем о нём :)
make oldconfig - будет задействована конфигурация работающего в данный момент ядра. Так как мы собираем своё с нуля, этот способ также бесполезен.
make defconfig - аналогично предыдущему, только значения будут по умолчанию. Такими, какими его задали разработчики ядра. Аналог первого способа сборки.
make menuconfig - псевдографический интерфейс на основе библиотеки Ncurses. На экран будет выводиться интерфейс с удобным иерархическим меню. Управления с помощью клавиш направления, пробела и клавиши TAB. Рекомендуется если вы собираете ядро в системе, не имеющей графической оболочки.
make gconfig - графический интерфейс на основе GTK, рекомендуется в окружениях GNOME, Mate, Xfce, Cinnamon, Unity и прочих, использующих GTK.
make xconfig - графический интерфейс на основе Qt. Рекомендуется в KDE. Так как в моей системе используется KDE, я воспользуюсь этим способом. Помимо этого есть ещё пара способов, но их применения ни чем особенным не отличается. Итак, после применения патчей, запускаем make xconfig и перед нами предстаёт вот это:


Первым делом выключаем dynticks. Для этого идём в Timers subsystem и выбираем Periodic timer ticks


Теперь самое вкусное. Идём в Processors type and features, ищем пункт Processor famaly и указываем вашу серию процессора. К примеру если у вас Intel Core i5-4xxx, указывайте Hasswell (4 поколение процессора). Если вы точно не уверены, то можете выбрать пункт Native optimizations autodetected by GCC. В этом случае, при сборке, компилятор сам определит что поддерживает ваш процессор, и включит все его фичи.

Идём ниже и включаем параметр Full preemptible kernel (RT). Режим жёсткого реального времени.


Листаем ниже и в пункте Timer frequency выставляем частоту системных прерываний на 1000 Гц


Полностью выключаем любое энергосбережение. Это важно! Слева ищем пункт Power management and ACPI options и снимаем галочку с ACPI. Также выключаем энергосбережение процессора





Вот и всё. При желании (и тщательном изучении документации), вы можете внести дополнительные изменения в конфигурацию (отключить лишние драйверы, задействовать дополнительные подсистемы и так далее). Теперь сохраняем конфиг через File - Save, закрываем конфигуратор и собираем ядро:

fakeroot make-kpkg -j 3 --initrd --append-to-version=-rt-custom kernel_image kernel_headers #-j 3
sudo update-grub

На моём компьютере с процессором Intel Core i3-550 (3.2 ГГц), прирост производительности был довольно ощутимый. Но самое главное - при работе в LMMS и Kdenlive, исчезли периодические заикания рассинхронизация звуковой и видеодорожек, а также подвисания при сильной нагрузке на жёсткий диск. Вывод - работает! Напоследок опишу два модифицированных ядра, которые весьма популярны в кругах линуксоидов:

PF-kernel - самый популярный набор патчей от украинца Александра Наталенко (aka post-factum). Это набор патчей, которые не входят в основное ядро, но обеспечивают повышенную отзывчивость системы, предоставляют альтернативную подсистему гибернации, более быструю, нежели основная, а также уменьшают использование памяти с помощью техники объединения одинаковых страниц. В набор входят:

  • планировщик процессов BFS от Кона Коливаса (Con Kolivas) с дополнительными исправлениями от Альфреда Чена (Alfred Chen);
  • планировщик ввода-вывода BFQ от Паоло Валенте (Paolo Valente), Арианны Аванзини (Arianna Avanzini) и Мауро Маринони (Mauro Marinoni);
  • подсистема гибернации TuxOnIce от Найджела Каннингема (Nigel Cunningham);
  • реализация техники слияния одинаковых страниц в памяти UKSM от Най Ся (Nai Xia);
  • патч от Graysky, расширяющий список процессоров для оптимизации ядра компилятором (тот, что мы применили выше)

Репозиторий модифицированного ядра. Официальный сайт.

Zen-kernel - второй по популярности, но первый по количеству патчей набор.  Zen Kernel использует комбинацию нескольких проектов, обновляет код через git-репозиторий, а также имеет несколько специфичных для Zen вещей, стремящихся удовлетворить большинство потребностей пользователей, реализовав их в одном ядре. Некоторые возможности патча: drm-next, wireless-testing, выбор планировщиков CPU (CFS/BFS), BFQ-планировщик ввода-вывода, aufs, unionfs, reiser4, tuxonice, PHC и многие другие вещи, которые замечательно подойдут для оптимизации настольных систем или ноутбуков. Всё это доступно в виде одного патча к ванильному ядру. Официальный сайт. GIT- репозиторий. Пакеты для Debian/Ubuntu.

На сегодня, пожалуй, всё. Больше информации вы можете найти в ссылках к статье. Всё описанное в статье проверено мной на многих конфигурациях.

Ссылки:

Сборка и конфигурирование ядра Linux (видео)
Официальная документация к ядру Linux (англ.)
Инструкция по сборке ядра от проекта Debian 

15 комментариев:

  1. Спасибо большое за статью!
    если есть время, напиши пожалуйста, почему нужно отключать любое энергосбережение и ACPI. Это как-то связано с Timer frequency и Full preemptible kernel (RT)? или можно энергосбережение оставить для домашнего ПК одновременно с остальными изменениями?

    ОтветитьУдалить
    Ответы
    1. Так написано в документации к ядру. Видимо они влияют на таймер прерываний. Можно попробовать не выключать их, и понаблюдать за работой системы. Хотя лично я не вижу в них смысла на десктопе. Энергосбережение нужно ноутбукам.

      Удалить
  2. Добрый день! Скомпилировал ядро 4.4.4 с применением патчей описанных вами на Убунту 14.04 х64. Наотрез отказывалось компилироваться на последнем этапе создание deb. в домашней директории. Помогло перенесение всех файлов и компиляция в /usr/src. Там компиляция прошла успешно, но после установки ядра запускается только openbox, при старте иксов в консоли пишет в разных вариантах (в зависимости от версии драйверов Nvidia) - modprobe: error: couldn't insert Nvidia 340; Function not implemented. Победить не могу, а очень хочется.

    ОтветитьУдалить
    Ответы
    1. Это странно, возможно проблема с правами на каталоги. Запустился Openbox, потому что не собрался модуль Nvidia. Попробуйте собрать его командой sudo dpkg-reconfigure nvidia-kernel-dkms

      Удалить
  3. NVIDIA drivers does not support real-time kernels

    ОтветитьУдалить
    Ответы
    1. Я не знаю, может в Убунте как-то особенно запаковывают драйвер, но в Debian у меня всё работало

      Удалить
  4. А можно ставить последнее ядро, или отвалится куча программ, включая нвидиа дрова?

    ОтветитьУдалить
    Ответы
    1. Программы никакие не отвалятся. Драйвер может, но если ставился через DKMS - то автоматом пересоберётся под новое ядро

      Удалить
  5. Спасибо за статью,проделал огромную работу. Непонятно пару моментов. Можно ли брать исходники ядра с текущего репозитория а не с kernel.org и на него наложить патч pf, конфликтов не будет? И второй момент после установки нового ядра когда выйдут обновления по команде apt-get update он заменит мне мое собрание ядро обновленным или предложит варианты?

    ОтветитьУдалить
    Ответы
    1. 1) можно взять исходники из репозитория.
      2) если оригинальное ядро осталось в системе - будут устанавливаться его обновления. Собранное никак не будет затронуто.

      Удалить
  6. Классный блог

    ОтветитьУдалить
  7. Если честно то ничго не понял.... Пока ничего) Я всего месяц на линукс вояджер, но хотелось бы понять как и что можно подбить под использование ядер для игр тиа Сталкер, ну и основное это запуск адоб аудишн и вэйв лаб, в максималке запуск и стабильная работа reason, хотя бы версии 5. для работы нужен...

    ОтветитьУдалить
    Ответы
    1. Новичкам в ядром лезть не нужно. То, что вы перечислили, от ядра не зависит. Пилите Wine под эти программы и игры

      Удалить
  8. Большое спасибо за статью. Очень подробный мануал.
    Объясните пожалуйста, почему важно отключать ACPI Support при компиляции ядра с rt-патчем? После отключения ACPI пропадает опция "Support mmconfig PCI config space access" в разделе "Bus options (PCI etc.)", и это приводит к ошибкам ioatdma при загрузке системы. Может быть, внутри ACPI нужно убрать что-то конкретное, а не отключать его полностью?

    ОтветитьУдалить