Сборка ядра Linux - современный подход

HELP-ME-24.COM (Freelance Team), Черноусов Антон

Как сказал один мой хороший знакомый, - "я не доверяю Линукс-администратору, который не разу не компилировал ядро" и в этом я полностью с ним соглашусь, ведь только после того как вы сами соберете ядро и загрузите с него систему у вас появится некоторое понимание внутренних процессов происходящих в системе на этапе загрузки ОС (и наступит просветление).

Сборка ядра Linux. Современный подход.

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

Подготовка окружения для сборки ядра Linux

Для сборки ядер в Ubuntu Linux необходимо установить следующие пакеты:

# apt-get install build-essential checkinstall
# aptitude install libssl-dev libncurses5-dev

Получаем исходные коды ядра

Исходные коды ядра можно получить несколькими методами:

  • Официальный репозиторий на GitHub - https://github.com/torvalds/linux
  • Скачать стабильную версию с www.kernel.org 
  • Загрузить пакет с исходными кодами из репозитория дистрибутива

Первый вариант я не рекомендую, так как в этом случае вы получите последнюю версию которая не факт, что даже соберется и которую довольно глупо использовать не только на боевых серверах, но и на рабочих станциях. 

Вообще, возьмите себе за правило использовать LTS-версию (с длительным циклом поддержки) на боевых серверах, а последнюю стабильную версию на серверах менее ответственных и рабочих станциях.

Кстати, неплохим вариантом является именно третий (загрузить пакет с исходными кодами из репозитория дистрибутива), так как он содержит патчи от мэйнтейнеров дистрибутива и как вы понимаете, мы будем рассматривать именно его.

Прежде всего, расскомментируйте пакеты исходных кодов в файле /etc/apt/sources.list (закомментированные строки начинающиеся с deb-src):

deb http://ru.archive.ubuntu.com/ubuntu/ xenial multiverse
# deb-src http://ru.archive.ubuntu.com/ubuntu/ xenial multiverse

Скачиваем исходные коды текущего ядра (с которого в данный момент загружена система) и устанавливаем окружение для сборки:

# mkdir /usr/src/kernel-build
# cd /usr/src/kernel-build
# apt-get source linux-image-$(uname -r)
# apt-get build-dep linux-image-$(uname -r)

Модифицируем базовую конфигурацию

Модификация конфигурации при сборке пакета ядра при помощи fakeroot несколько отличается от типовой сборки при помощи make menuconfig:

# cd ./linux-4.4.0/
# chmod a+x debian/scripts/*
# chmod a+x debian/scripts/misc/*
# fakeroot debian/rules clean
# fakeroot debian/rules editconfigs

При выполнении последней команды editconfigs, вам последовательно предложат к редактированию несколько конфигурационных файлов:

Do you want to edit config: i386/config.flavour.generic? [Y/n] n
Do you want to edit config: i386/config.flavour.lowlatency? [Y/n] n

После того как вы дойдете до требуемого вам конфигурационного файла и нажмете Y (согласившись с режимом редактирования), будет запущен обычный make menuconfig о котором мы говорили выше.

Собираем ядро Linux в deb-пакет

По завершении редактирования конфигурационных файлов запускаем сборку deb-пакетов:

# fakeroot debian/rules clean
# fakeroot debian/rules binary

В результате сборки (довольно длительный процесс) в корне сборочной директории появятся требуемые deb-пакеты:

# ls *.deb
# linux-headers-4.8.0-17_4.8.0-17.19_all.deb
# linux-headers-4.8.0-17-generic_4.8.0-17.19_amd64.deb
# linux-image-4.8.0-17-generic_4.8.0-17.19_amd64.deb

Сборка GIT-версии Linux-ядра

Аналогично сборке git-версии происходит и сборка версии с официального сайта https://www.kernel.org/ и единственным отличием является метод получения исходных кодов. 

Для загрузки версии с GitHub используйте следующую команду:

# git clone https://github.com/torvalds/linux.git

Для загрузки с kernel.org потребуется дополнительно распаковать архив:

# wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.11.8.tar.xz
# tar -xvf ./linux-4.11.8.tar.xz

Дальнейшая последовательность действий уже многократно описывалась в различных интернет изданиях и сводится к выполнению простой последовательности консольных команд:

# make oldconfig
# make xconfig
# make && make make_modules
# make modules_install && make install

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

Например так:

*
* Control Group support
*
Control Group support (CGROUPS) [Y/?] y
 Memory controller (MEMCG) [Y/n/?] y
   Swap controller (MEMCG_SWAP) [Y/n/?] y
     Swap controller enabled by default (MEMCG_SWAP_ENABLED) [N/y/?] n
 IO controller (BLK_CGROUP) [Y/n/?] y
   IO controller debugging (DEBUG_BLK_CGROUP) [N/y/?] n
 *
 * CPU controller
 *
 CPU controller (CGROUP_SCHED) [Y/?] y
   Group scheduling for SCHED_OTHER (FAIR_GROUP_SCHED) [Y] y
     CPU bandwidth provisioning for FAIR_GROUP_SCHED (CFS_BANDWIDTH) [Y/n/?] y
   Group scheduling for SCHED_RR/FIFO (RT_GROUP_SCHED) [N/y/?] n

Команда make xconfig запускает удобный графический конфигуратор с удобной контекстной подсказкой по параметрам модулей и опций.

Графический конфигуратор настроек ядра

В консольном варианте сборки вам естественно потребуется другой вариант конфигуратора:

# make menuconfig

Он не такой удобный, зато работает в консоли. После того как вы сконфигурировали свое ядро на свой вкус и цвет, выполните последние две команды и ждите окончания сборки. 

По окончании сборки ядро будет установлено в систему и можно попробовать перезагрузить сервер (или рабочую станцию). На этапе загрузки выбрать собранное ядро и скрестить пальцы, что оно загрузится.

Оптимизация Linux-ядра для рабочей станции

Вот мы и пришли к вопросу, что там собственно можно покрутить.

  • Ядро изначально собирается для процессора Generic-x86-64 и не использует специальных возможностей. Это сделано специально для того чтобы ядро можно было запустить на любом оборудовании. Изменить тип процессора можно в разделе: Processor type and features -> Processor family.
  • В этом же разделе можно поменять параметр Preemption Model, этот параметр определяет модель поведения ядра. В зависимости от назначения компилируемого ядра можно выбрать параметры сервер, рабочая станция и рабочая станция с малыми задержками. Для рабочей станции я обычно меняю режим работы на Preemptible Kernel (Low-Latency Desktop).
  • Для рабочей станции так же очень важным является параметр Timer frequency. Задание этого параметра в 1000 HZ можно повысить отзывчивость интерфейса при высокой загрузке процессора.
  • Default I/O scheduler - этот параметр будет отдельно рассматриваться в следующих статьях и он крайне важный. Хотя его можно изменить в процессе работы я рекомендую для рабочей станции установить его в CFQ.

Это лишь малая часть параметров которые можно покрутить и честно говоря это самые важные параметры которые могут повилять на производительность рабочей станции.

BFS/BFQ - не принятый в mainline планировщики для рабочих станций

Дополнительно, для экстремалов, существует два дополнительных планировщика BFS и BFQ (планировщик очереди операций и планировщик ввода-вывода), они не приняты в основную ветку ядра, хотя пользователи подтверждают повышение отзывчивости системы при их использовании. Используйте их на свой страх и риск.

Не сказать о этих планировщиках, рассказывая о сборке ядра было бы неправильно. Официальные странички где можно найти патчи расположены по адресам:

Устанавливаются они довольно просто.

Загрузите патчи BFQ:

# wget -nd --no-parent --level 1 -r -R "*.html*" --reject 4.11.0-v8r11 \
http://algogroup.unimore.it/people/paolo/disk_sched/patches/4.11.0-v8r11

Загрузите патчи CFQ:

# wget http://ck.kolivas.org/patches/bfs/4.0/4.8/4.8-sched-bfs-512.patch

Примените патчи:

# patch -p1 < ./4.8-sched-bfs-512.patch
# patch -p1 < ./0001-block-cgroups-kconfig-build-bits-for-BFQ-v7r11-4.11..patch
# patch -p1 < ./0002-block-introduce-the-BFQ-v7r11-I-O-sched-for-4.11.0.patch
# patch -p1 < ./0003-block-bfq-add-Early-Queue-Merge-EQM-to-BFQ-v7r11-for.patch
# patch -p1 < ./0004-blk-bfq-turn-BFQ-v7r11-for-4.11.0-into-BFQ-v8r11-for.patch

Активируйте новые планировщики планировщики используя make xconfig.

Активация планировщика BFQ

BFQ - выбрать используемым по умолчанию не получится и придется переключаться на этапе загрузке рабочей станции.

BFS - процессорный планировщик

BFS - в свою очередь после применения патча активирован по умолчанию.

Примечание

В современных ядрах Линукс появилось несколько дополнительных методов сборки и конфигурирования. 

  • make allmodconfig  - Активируются все возможные опции и все что возможно устанавливается в режим модуля
  • make localyesconfig  - Все загруженные модули переключаются в режим встраивания в ядро

Довольно часто меня спрашивают как сменить ядро по умолчанию в Grub2 и там честно говоря не все так просто как было в первом Grub и для удобства настройки Grub2 на рабочих станциях лучше использовать удобную утилиту grub-customizer.

Grub customizer позволяет выбрать ядро по-умолчанию и сменить оформление grub2. Для установки утилиты используйте следующие команды:

# sudo add-apt-repository ppa:danielrichter2007/grub-customizer
# sudo apt-get update
# sudo apt-get install grub-customizer

Оставьте комментарий

Вы должны быть вошедший в чтобы отправить комментарий