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

    Общий рейтинг статьи: 5 (проголосовало 1 )
    Опубликовано:  [просмотров 1006]


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

    Сборка ядра 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


    Связанные записи в блоге

    Обсуждение статьи
    Вопрос нашего пользователяЕдинственная нормальная статья по сборке из исходников для Ubuntu и иже с ним. В мешанине на https://help.ubuntu.com/community/Kernel/Compile#Alternate_Build_Method_.28B.29:_The_Old-Fashioned_Debian_Way разобраться можно, но сложно.
    Если сможите, уточните пожалуйста параметры при запуске debian/rules help:

    updateconfigs
    editconfigs
    genconfigs
    updateportsconfigs
    editportsconfigs
    genportconfigs
    printchanges
    insertchanges
    startnewrelease
    diffupstream

    По этим параметрам больше вопросов чем ответов. В сети толком ничего не нашёл.
    Ответ на комментарийТут просто в комментарий не уложиться. На следующей неделе попробую сделать отдельной статьей с примером раз это заинтересовало.

    Ваш комментарий: