Иногда может потребоваться собрать своё собственное ядро Linux. Причины для этого могут быть следующими:
В сборке ядра нет ничего сложного. Важно лишь понимать, для чего это делается, а также не трогать те параметры, которые вам непонятны. В этой заметке я опишу два примера сборки ядра в 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). Это набор патчей, которые не входят в основное ядро, но обеспечивают повышенную отзывчивость системы, предоставляют альтернативную подсистему гибернации, более быструю, нежели основная, а также уменьшают использование памяти с помощью техники объединения одинаковых страниц. В набор входят:
Репозиторий модифицированного ядра. Официальный сайт.
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
- вам нужно чистое ядро, без дистрибутивных патчей;
- вы хотите наложить собственные патчи (коих очень много);
- вы хотите собрать ядро под свою конфигурацию железа, выкинуть из него лишнее и/или заточить под определённые задачи;
- вы хотите включить в состав ядра эксперементальный драйвер или файловую систему, которой нет в "ванильном" ядре (например 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
Спасибо большое за статью!
ОтветитьУдалитьесли есть время, напиши пожалуйста, почему нужно отключать любое энергосбережение и ACPI. Это как-то связано с Timer frequency и Full preemptible kernel (RT)? или можно энергосбережение оставить для домашнего ПК одновременно с остальными изменениями?
Так написано в документации к ядру. Видимо они влияют на таймер прерываний. Можно попробовать не выключать их, и понаблюдать за работой системы. Хотя лично я не вижу в них смысла на десктопе. Энергосбережение нужно ноутбукам.
УдалитьДобрый день! Скомпилировал ядро 4.4.4 с применением патчей описанных вами на Убунту 14.04 х64. Наотрез отказывалось компилироваться на последнем этапе создание deb. в домашней директории. Помогло перенесение всех файлов и компиляция в /usr/src. Там компиляция прошла успешно, но после установки ядра запускается только openbox, при старте иксов в консоли пишет в разных вариантах (в зависимости от версии драйверов Nvidia) - modprobe: error: couldn't insert Nvidia 340; Function not implemented. Победить не могу, а очень хочется.
ОтветитьУдалитьЭто странно, возможно проблема с правами на каталоги. Запустился Openbox, потому что не собрался модуль Nvidia. Попробуйте собрать его командой sudo dpkg-reconfigure nvidia-kernel-dkms
УдалитьNVIDIA drivers does not support real-time kernels
ОтветитьУдалитьЯ не знаю, может в Убунте как-то особенно запаковывают драйвер, но в Debian у меня всё работало
УдалитьА можно ставить последнее ядро, или отвалится куча программ, включая нвидиа дрова?
ОтветитьУдалитьПрограммы никакие не отвалятся. Драйвер может, но если ставился через DKMS - то автоматом пересоберётся под новое ядро
УдалитьСпасибо за статью,проделал огромную работу. Непонятно пару моментов. Можно ли брать исходники ядра с текущего репозитория а не с kernel.org и на него наложить патч pf, конфликтов не будет? И второй момент после установки нового ядра когда выйдут обновления по команде apt-get update он заменит мне мое собрание ядро обновленным или предложит варианты?
ОтветитьУдалить1) можно взять исходники из репозитория.
Удалить2) если оригинальное ядро осталось в системе - будут устанавливаться его обновления. Собранное никак не будет затронуто.
Спасибо все понял.
УдалитьКлассный блог
ОтветитьУдалитьЕсли честно то ничго не понял.... Пока ничего) Я всего месяц на линукс вояджер, но хотелось бы понять как и что можно подбить под использование ядер для игр тиа Сталкер, ну и основное это запуск адоб аудишн и вэйв лаб, в максималке запуск и стабильная работа reason, хотя бы версии 5. для работы нужен...
ОтветитьУдалитьНовичкам в ядром лезть не нужно. То, что вы перечислили, от ядра не зависит. Пилите Wine под эти программы и игры
УдалитьБольшое спасибо за статью. Очень подробный мануал.
ОтветитьУдалитьОбъясните пожалуйста, почему важно отключать ACPI Support при компиляции ядра с rt-патчем? После отключения ACPI пропадает опция "Support mmconfig PCI config space access" в разделе "Bus options (PCI etc.)", и это приводит к ошибкам ioatdma при загрузке системы. Может быть, внутри ACPI нужно убрать что-то конкретное, а не отключать его полностью?