Як сказав один мій хороший знайомий, - "я не довіряю Лінукс-адміністратору, який не разу не компілював ядро" і в цьому я повністю з ним погоджуся, адже тільки після того як ви самі зберете ядро і завантажте з нього систему у вас з'явиться деякий розуміння внутрішніх процесів, що відбуваються в системі на етапі завантаження ОС (і настане просвітлення).
У більшості випадків, для повсякденної роботи досить штатного пакета дистрибутива, що містить вже скомпільований ядро, а збірка ядра може бути корисна тільки при застосуванні специфічних патчів або створенні монолітного ядра з фіксованим набором драйверів для вбудованих пристроїв. Питання розглядаються в цій статті знадобляться нам надалі при побудові оптимізованого вузла віртуалізації 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-ядра для робочої станції
Ось ми і прийшли до питання, що там власне можна покрутити.
Це лише мала частина параметрів які можна покрутити і чесно кажучи це найважливіші параметри які можуть повілять на продуктивність робочої станції.
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.
BFQ - вибрати використовується за умовчанням не вийде і доведеться перемикатися на етапі завантаження робочої станції.
BFS - в свою чергу після застосування патча активований за замовчуванням.
Примітка
В сучасних ядрах Лінукс з'явилося кілька додаткових методів збирання і конфігурації.
- make allmodconfig - Активуються всі можливі опції і все що можливо встановлюється в режим модуля
- make localyesconfig - Всі завантажені модулі переключаються в режим вбудовування в ядро
Досить часто мене запитують як змінити ядро за замовчуванням в Grub2 і там чесно кажучи не все так просто як було в першому Grub і для зручності настройки Grub2 на робочих станціях краще використовувати зручну утиліту grub-customizer.
Grub customizer дозволяє вибрати ядро за замовчуванням і змінити оформлення grub2. Для установки утиліти використовуйте наступні команди: