Збірка ядра linux - сучасний підхід, (freelance team)

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

Збірка ядра linux - сучасний підхід, (freelance team)

У більшості випадків, для повсякденної роботи досить штатного пакета дистрибутива, що містить вже скомпільований ядро, а збірка ядра може бути корисна тільки при застосуванні специфічних патчів або створенні монолітного ядра з фіксованим набором драйверів для вбудованих пристроїв. Питання розглядаються в цій статті знадобляться нам надалі при побудові оптимізованого вузла віртуалізації KVM.

Підготовка оточення для збірки ядра Linux

Для збірки ядер в Ubuntu Linux необхідно встановити наступні пакети:

# Apt-get install build-essential checkinstall
# Aptitude install libssl-dev libncurses5-dev

Отримуємо вихідні коди ядра

Тексти програм ядра можна отримати декількома методами:

Перший варіант я не рекомендую, так як в цьому випадку ви отримаєте останню версію яка не факт, що навіть збереться і яку досить нерозумно використовувати не тільки на бойових серверах, а й на робочих станціях.

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

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

Викачуємо вихідні коди поточного ядра (з якого в даний момент завантажена система) і встановлюємо оточення для збірки:

# 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-ядра

Для завантаження версії з GitHub використовуйте наступну команду:

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

Подальша послідовність дій вже багаторазово описувалася в різних інтернет виданнях і зводиться до виконання простої послідовності консольних команд:

# 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 запускає зручний графічний конфігуратор зі зручною контекстної підказкою по параметрам модулів і опцій.

Збірка ядра linux - сучасний підхід, (freelance team)

У командному варіанті збірки вам природно потрібно інший варіант конфігуратора:

Він не такий зручний, зате працює в консолі. Після того як ви сконфигурировали своє ядро ​​на свій смак і колір, виконайте останні дві команди і чекайте закінчення зборки.

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

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

Ось ми і прийшли до питання, що там власне можна покрутити.

Це лише мала частина параметрів які можна покрутити і чесно кажучи це найважливіші параметри які можуть повілять на продуктивність робочої станції.

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

Додатково, для екстремалів, існує два додаткових планувальника BFS і BFQ (планувальник черзі операцій і планувальник вводу-виводу), вони не прийняті в основну гілку ядра, хоча користувачі підтверджують підвищення чуйності системи при їх використанні. Використовуйте їх на свій страх і ризик.

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

Завантажте патчі BFQ:

Завантажте патчі CFQ:

# 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.

Збірка ядра linux - сучасний підхід, (freelance team)

BFQ - вибрати використовується за умовчанням не вийде і доведеться перемикатися на етапі завантаження робочої станції.

Збірка ядра linux - сучасний підхід, (freelance team)

BFS - в свою чергу після застосування патча активований за замовчуванням.

Примітка

В сучасних ядрах Лінукс з'явилося кілька додаткових методів збирання і конфігурації.

  • make allmodconfig - Активуються всі можливі опції і все що можливо встановлюється в режим модуля
  • make localyesconfig - Всі завантажені модулі переключаються в режим вбудовування в ядро

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

Grub customizer дозволяє вибрати ядро ​​за замовчуванням і змінити оформлення grub2. Для установки утиліти використовуйте наступні команди: