Перейти до змісту

Огляд

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

Перебудова ядра не рекомендована та не підтримується для Rocky Linux. Перш ніж намагатися створити власне ядро, врахуйте наступне:

  • Чи доступна необхідна вам функція, якщо встановити модуль ядра з elrepo?
  • Чи доступні необхідні вам функції як окремий модуль від самого ядра?
  • Rocky Linux і більшість інших похідних EL були розроблені, щоб функціонувати як повне середовище. Заміна критичних компонентів може вплинути на роботу системи.
  • Більшості користувачів більше не потрібно створювати своє ядро. Вам може знадобитися просто модуль/драйвер ядра або, можливо, створити власний модуль ядра (kmod/dkms)

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

Ядро

Найчастіше, коли люди кажуть Linux, вони зазвичай мають на увазі «дистрибутив Linux» - наприклад, Rocky Linux і Debian є типами дистрибутивів Linux. Дистрибутив містить усе необхідне для існування Linux як функціональної операційної системи. Дистрибутиви використовують код із різних проектів з відкритим кодом, які не залежать від Linux.

Linux - це ядро. Ядро лежить в основі [операційної системи].

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

Вихідний код ядра

Дистрибутив Rocky Linux має вихідний код конкретної версії ядра, який він підтримує, доступний у тій чи іншій формі. Вони можуть бути у формі скомпільованого двійкового файлу (.src.rpm), вихідного RPM (.srpm) тощо.

Якщо вам потрібно завантажити іншу (можливо, новішу) версію, відмінну від тієї, яку надає ваш конкретний дистрибутив Rocky Linux, першим місцем, де потрібно шукати вихідний код, є офіційний веб-сайт ядра:

www.kernel.org

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

Список дзеркал ведеться за адресою:

mirrors.kernel.org

Підказка

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

Ми можемо виконувати більшу частину роботи як непривілейований користувач, оскільки ми будемо використовувати спеціальну опцію побудови ядра, яка дозволяє нам вказати спеціальний робочий або вихідний каталог. Зокрема, ми будемо використовувати параметр O=~/build/kernel для всіх відповідних викликів.

Де ~/build/kernel еквівалентно /home/$USER/build/kernel або $HOME/build/kernel

Версії ядра та правила іменування

Перелік доступних ядер на веб-сайті міститиме папки для v1.0, v2.5, v2.6, v3.0, v3.x, v4.x, v5.x, v6.x тощо. Перш ніж дотримуватися свого природного бажання отримати останню версію, переконайтеся, що ви розумієте, як працює система керування версіями ядра Linux.

Поточна конвенція полягає в тому, щоб називати та нумерувати основні нові випуски ядра як «Linux 5.x» (також званий мініатюрними або основними ядрами). Таким чином, першою з цієї серії буде версія Linux 5.0 (така ж, як 5.0.0), наступною буде версія Linux 5.1 (така ж, як 5.1.0), за нею буде версія Linux 5.2 і так далі.

Будь-які незначні зміни чи оновлення в кожній основній версії випуску буде відображено з кроком до третьої цифри. Їх зазвичай називають стабільними точковими випусками. Таким чином, наступним стабільним випуском для ядра серії 5.0.0 буде версія Linux 5.0.1, за якою піде версія 5.0.2 і так далі. Інший спосіб сказати це, наприклад, сказати, що версія Linux 5.0.4 є четвертим стабільним випуском на основі серії Linux 5.0.0.

Встановлення необхідних інструментів і бібліотек

Поширеним джерелом збою, що виникає під час процесу збирання ядра, може бути відсутність усього необхідного програмного забезпечення для компіляції та створення основного ядра Linux. Відсутні інструменти та бібліотеки можна встановити за допомогою менеджера пакетів DNF у дистрибутиві Rocky Linux. Ми подбаємо про це в цьому розділі.

  1. У дистрибутиві Rocky Linux ви можете швидко встановити більшість необхідних інструментів розробки, виконавши цю команду:

    sudo dnf -y groupinstall 'C Development Tools and Libraries'
    

    Якщо ви отримуєте повідомлення «Module or Group 'C Development Tools and Libraries' is not available.». помилка, наведена нижче команда еквівалентна наведеній вище:

    sudo dnf -y groupinstall 'Development Tools'
    
  2. Деякі інші бібліотеки, файли заголовків і програми також можна отримати, встановивши наступні пакети. Впишіть:

    sudo dnf -y install ncurses-devel openssl-devel elfutils-libelf-devel python3
    
  3. Далі нам потрібні інші утиліти, доступні лише в деяких підтримуваних сторонніх сховищах. Одним із таких сховищ є репозиторій Powertools. Давайте увімкнемо це репо в нашій системі Rocky. Впишіть:

    sudo dnf config-manager --set-enabled powertools
    
  4. Нарешті, давайте встановимо один із необхідних пакетів зі сховища Powertool. Впишіть:

    sudo  dnf -y install dwarves
    

Ось і все, що стосується попередніх пакетів, необхідних для фактичного складання ядра!

Завантаження та розпакування ядра Linux

Версія ядра, яку ми збираємося створити в наступному розділі, це версія 6.5.7, яка доступна за адресою:

www.kernel.org/pub/linux/kernel/v6.x/linux-6.5.7.tar.xz

Почнемо процес.

  1. Спочатку завантажте вихідний код ядра у ваш поточний робочий каталог за допомогою такої команди curl. Впишіть:

    curl -L -o linux-6.5.7.tar.xz \
    https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.5.7.tar.xz
    
  2. Вихідний код ядра, який ви завантажуєте з Інтернету, — це файл, стиснутий і збережений у tar. Тому вам потрібно розпакувати та розархівувати вихідний файл, щоб використовувати джерело.

    Переконайтеся, що ви перебуваєте в каталозі, куди завантажуєте архів ядра. Використовуйте команду tar, щоб розпакувати та розпакувати файл, виконавши:

    tar xvJf linux-6.*.tar.xz
    

Створення ядра

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

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

Це також одна з причин, чому можна налаштувати Linux для роботи в різних установках апаратного забезпечення, від систем низького класу до вбудованих систем і систем високого класу.

Для створення ядра необхідні два основні кроки:

  • налаштування
  • компіляція

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

У системі, яка вже працює під керуванням Linux, ви можете запускати команди на зразок – lspci, lshw тощо, щоб показати детальну інформацію про точні налаштування обладнання у вашій системі. У дистрибутивах на основі RPM ці утиліти надаються пакетами pciutils*.rpm і lshw*.rpm.

Краще розуміння того, що являє собою базове апаратне забезпечення, може допомогти вам краще визначити, що вам потрібно у вашому спеціальному ядрі. Ви готові почати налаштування ядра.

Дезінфекція архітектурного середовища

Ми можемо почати фактичну конфігурацію з приблизного уявлення про типи обладнання та функції, які має підтримувати наше нове ядро. Але спочатку трохи довідкової інформації.

Дерево вихідних кодів ядра Linux містить кілька файлів під назвою Makefile (make-файл — це просто текстовий файл із директивами, який також описує зв’язки між файлами в програмі).

Ці makefiles допомагають склеїти разом тисячі інших файлів, які складають джерело ядра. Для нас тут важливіше те, що make-файли також містять цілі. Цілі — це команди або директиви, які виконує програма make.

попередження: уникайте непотрібних оновлень ядра

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

  • Виправлення безпеки або помилки впливає на вашу систему та має бути застосоване
  • Вам потрібна конкретна нова функція в стабільному випуску

У разі виправлення системи безпеки вирішіть, чи впливає ризик на вас. Наприклад, якщо проблему безпеки виявлено в драйвері пристрою, який ви не використовуєте, можливо, немає причин для оновлення. У разі випуску виправлення помилок уважно прочитайте примітки до випуску та вирішіть, чи справді помилки стосуються вас — якщо у вас стабільна система, оновлювати ядро латками, які ви ніколи не використовуєте, може бути безглуздим.

У виробничих системах ядро не слід просто оновлювати, щоб отримати «останнє ядро»; у вас повинна бути вагома причина для оновлення.

Файл Makefile у корені дерева вихідних кодів ядра містить конкретні цілі, які можна використовувати для підготовки середовища збирання ядра, налаштування ядра, компіляції ядра, встановлення ядра тощо. Деякі цілі обговорюються більш детально тут:

make mrproper :

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

make clean :

Ця ціль не виконує такої ретельної роботи, як ціль mrproper. Він видаляє лише більшість створених файлів. Він не видаляє файл конфігурації ядра (.config).

make menuconfig :

Ця ціль викликає інтерфейс текстового редактора з меню, списками параметрів і текстовими діалоговими вікнами для налаштування ядра.

make xconfig :

Цей інструмент/ціль налаштування ядра на основі графічного інтерфейсу базується на бібліотеках графічної розробки Qt. Програми на основі KDE/Plasma використовують ці бібліотеки.

make gconfig :

Це також інструмент/ціль конфігурації ядра на основі GUI, але він покладається на набір інструментів GTK+. Цей набір інструментів GTK активно використовується в настільному світі GNOME.

make olddefconfig :

Ця мета використовує наявний файл .config у поточному робочому каталозі, оновлює залежності та автоматично встановлює для нових символів значення за замовчуванням.

make help :

Ця мета покаже вам усі можливі цілі та слугуватиме системою швидкої онлайн-довідки.

У цьому розділі ми будемо використовувати лише одну з цілей для налаштування ядра. Зокрема, ми будемо використовувати команду make menuconfig. Редактор конфігурації ядра menuconfig — це проста і популярна текстова утиліта налаштування, яка містить меню, списки перемикачів і діалогові вікна.

Він має простий і зрозумілий інтерфейс, яким можна легко керувати за допомогою клавіатури, і він майже інтуїтивно зрозумілий у використанні.

Нам потрібно змінити (cd) у вихідний каталог ядра, після чого ми можемо почати налаштування ядра. Але перед початком фактичної конфігурації ядра вам слід очистити (підготувати) середовище збірки ядра за допомогою команди make mrproper:

cd linux-6.*
make  O=~/build/kernel mrproper

Конфігурація ядра

Далі ми почнемо налаштовувати ядро серії Linux 6.*. Щоб дослідити деякі нутрощі цього процесу, ми ввімкнемо підтримку функції, яку будемо вважати обов’язковою в системі. Коли ви зрозумієте, як це працює, ви можете застосувати ту саму процедуру, щоб додати підтримку будь-якої нової функції ядра, яку ви хочете. Зокрема, ми ввімкнемо підтримку файлової системи NTFS у нашому спеціальному ядрі.

Більшість сучасних дистрибутивів Linux постачаються з файлом конфігурації ядра для запущеного ядра, доступним у локальній файловій системі у вигляді стисненого або звичайного файлу. У нашому прикладі системи Rocky цей файл знаходиться в каталозі /boot і зазвичай називається config-*.

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

Підказка

Використання відомого попередньо існуючого файлу конфігурації як основи для створення нашого спеціального файлу допомагає гарантувати, що ми не витрачаємо надто багато часу на дублювання зусиль, які інші люди вже доклали, щоб знайти, що працює, а що ні!

Наступні кроки описують, як налаштувати ядро. Ми будемо використовувати текстову утиліту конфігурації ядра, яка дозволить вам слідкувати за вашим терміналом, незалежно від того, використовуєте ви робоче середовище GUI чи ні.

  1. Для початку ми скопіюємо та перейменуємо існуючий файл конфігурації з каталогу /boot у наше середовище збирання ядра:

    cp /boot/config-`uname -r` ~/build/kernel/.config
    

    Тут ми використовуємо uname -r, щоб отримати файл конфігурації для запущеного ядра. Команда uname -r друкує запущений випуск ядра. Його використання допомагає гарантувати, що ми отримуємо саме ту версію, яку нам потрібно, на випадок наявності інших версій.

    Примітка

    Редактор конфігурації ядра Linux починає явно шукати та генерувати файл із назвою .config (вимовляється як «крапка конфігурація») у корені дерева вихідних кодів ядра. Цей файл приховано.

  2. Запустіть утиліту налаштування графічного ядра:

    make O=~/build/kernel menuconfig
    

    З’явиться екран, схожий на цей:

    Головний екран конфігурації ядра

    Екран конфігурації ядра, що з’являється, поділений приблизно на три області. У верхній частині показано корисну інформацію, комбінації клавіш і легенди, які допоможуть вам орієнтуватися в програмі. Основна частина екрана показує розширюваний деревовидний список загальних настроюваних параметрів ядра. Ви можете детальніше перейти до елементів зі стрілками в батьківському меню, щоб переглянути та/або налаштувати підменю (або дочірні) елементи. Нарешті, у нижній частині екрана відображаються дії/параметри, які користувач може вибрати.

  3. Далі ми додамо підтримку NTFS у наше спеціальне ядро для демонстраційних цілей.

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

    У розділі «Файлові системи» використовуйте клавіші зі стрілками, щоб перейти до файлових систем DOS/FAT/NT. Натисніть Enter, щоб переглянути дочірні елементи для файлових систем DOS/FAT/NT.

  4. У розділі файлових систем DOS/FAT/NT перейдіть до пункту підтримки файлової системи NTFS.

    Введіть ++M++ (великі літери), щоб увімкнути модулі для підтримки файлової системи NTFS.

    Використовуйте клавіші зі стрілками, щоб перейти вниз до підтримки запису NTFS (New), а потім натисніть y, щоб включити її.

    Використовуйте клавіші зі стрілками, щоб перейти вниз до підтримки запису в NTFS, і натисніть Y, щоб включити її. Коли ви закінчите, літера M або символ зірочки (*) має з’явитися біля кожного параметра, як показано тут:

    Екран файлових систем конфігурації ядра

    Підказка

    Для кожного настроюваного параметра в утиліті налаштування ядра порожні кутові дужки <> вказують на те, що відповідну функцію вимкнено. Літера M у кутових дужках, , вказує на те, що функцію буде скомпільовано як модуль.

    Символ зірочки в кутових дужках, <*>, вказує на те, що підтримка цієї функції буде безпосередньо вбудована в ядро. Зазвичай ви можете перемикати всі можливі параметри за допомогою пробілу на клавіатурі.

  5. Поверніться до головного екрана файлових систем, двічі натиснувши клавішу esc на клавіатурі на екрані файлових систем DOS/FAT/NT. Поверніться до головного екрана налаштування ядра, двічі натиснувши esc на клавіатурі.

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

  7. З’явиться діалогове вікно з пропозицією зберегти нову конфігурацію. Переконайтеся, що вибрано Yes, а потім натисніть enter.

  8. Після завершення роботи утиліти конфігурації ядра ви повернетеся до своєї оболонки всередині дерева вихідних кодів ядра. Ви майже готові до створення свого ядра!

  9. Нам потрібно виконати ще кілька налаштувань нашого дистрибутива Rocky. Впишіть:

    sed -ri '/CONFIG_SYSTEM_TRUSTED_KEYS/s/=.+/=""/g' ~/build/kernel/.config
    

    Підказка

    Щоб переглянути результати деяких змін, внесених за допомогою інструменту menuconfig, скористайтеся утилітою grep, щоб переглянути файл .config, який ви зберегли безпосередньо. Наприклад, щоб переглянути вплив підтримки файлової системи NTFS, яку ми ввімкнули раніше, введіть наступне:

    $ grep NTFS ~/build/kernel/.config
    CONFIG_NTFS_FS=m
    CONFIG_NTFS_DEBUG=y
    CONFIG_NTFS_RW=y
    

    Коротка примітка про модулі ядра

    Підтримка завантажуваних модулів — це функція ядра Linux, яка дозволяє динамічно завантажувати (або видаляти) модулі ядра.

    Модулі ядра — це скомпільований код, який можна динамічно вставляти в запущене ядро, а не постійно вбудовувати в ядро. Таким чином можна ввімкнути функції, які не часто використовуються, але вони не займатимуть місця в пам’яті, коли не використовуються.

    На щастя, ядро Linux може автоматично визначати, що і коли завантажувати. Звичайно, не кожна функція може бути скомпільована як модуль. Ядро має знати кілька речей перед завантаженням і вивантаженням модулів, таких як доступ до жорсткого диска та аналіз файлової системи, де зберігаються завантажувані модулі. Деякі модулі ядра також зазвичай називають драйверами.

Компіляція ядра

In the preceding section, we walked through the process of creating a configuration file for the custom kernel that we want to build. У цьому розділі ми виконаємо фактичну збірку ядра. Але перш ніж це зробити, ми додамо одну простішу настройку до всього процесу.

Останнім налаштуванням буде додавання додаткової інформації, яка використовується в остаточній назві нашого ядра. Це допоможе нам відрізнити це ядро від будь-якого іншого ядра з таким же номером версії. Ми додамо тег «custom» до інформації про версію ядра. Це можна зробити шляхом редагування основного Makefile і додавання потрібного тегу до змінної EXTRAVERSION.

Етап компіляції процесу збирання ядра, безумовно, найпростіший, але він також займає найбільше часу. Все, що потрібно на цьому етапі, це просто виконати команду make, яка потім автоматично згенерує та вирішить будь-які проблеми залежностей, скомпілює саме ядро та скомпілює будь-які функції (або драйвери), які були активовані як завантажувані модулі.

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

  1. По-перше, ми додамо додаткову частину до ідентифікаційного рядка для ядра, яке збираємося створити. Перебуваючи в корені вихідного дерева ядра, ми використаємо утиліту sed для редагування Makefile на місці. Змінна, яку ми хочемо змінити, знаходиться близько до верхньої частини файлу. Ми хочемо змінити рядок у файлі, який виглядає так:

    EXTRAVERSION =
    

    На такий:

    EXTRAVERSION = -custom
    

    Використовуйте таку команду sed, щоб внести зміни. Впишіть:

    sed  -i 's/^EXTRAVERSION.*/EXTRAVERSION = -custom/'  Makefile
    

    Звичайно, ви можете використовувати будь-який текстовий редактор, який вам зручний, щоб внести зміни. Тільки не забудьте зберегти зміни у файлі!

  2. Передайте ціль kernelversion команді make, щоб переглянути повну версію ядра, яку ви щойно налаштували:

    make O=~/build/kernel kernelversion
    

    Порада

    Ви можете скористатися всією цією додатковою обчислювальною потужністю (ЦП, ядрами тощо) у більшості сучасних систем і значно пришвидшити інтенсивні ЦП операції, такі як компіляція ядра. Для цього ви можете передати команді make параметр, який визначає кількість завдань, які потрібно виконувати одночасно. Зазначена кількість завдань потім розподіляється та виконується одночасно на кожному ядрі ЦП. Синтаксис команди:

        ```bash
        make -j N
        ```
    
     де N – кількість завдань, які виконуються одночасно. Наприклад, якщо у вас восьмиядерний (8) ЦП, ви можете ввести:
    
        ```bash
        make -j 8
        ```
    
  3. Єдина команда, яка потрібна тут для компіляції ядра, це команда make:

    $ make  O=~/build/kernel
    make[1]: Entering directory '/home/super/build/kernel'
    SYNC    include/config/auto.conf.cmd
    GEN     Makefile
    HOSTCC  scripts/kconfig/conf.o
    HOSTLD  scripts/kconfig/conf
    GEN     Makefile
    ...<OUTPUT TRUNCATED>…
    LD [M]  sound/usb/usx2y/snd-usb-usx2y.ko
    LD [M]  sound/x86/snd-hdmi-lpe-audio.ko
    LD [M]  sound/xen/snd_xen_front.ko
    LD [M]  virt/lib/irqbypass.ko
    make[1]: Leaving directory '/home/super/build/kernel'
    
  4. Кінцевий продукт цієї команди (тобто ядро) стоїть і чекає на шляху:

    ~/build/kernel/arch/x86/boot/bzImage
    
  5. Нам потрібно встановити модулі, оскільки ми скомпілювали частини ядра як модулі (наприклад, модуль NTFS). Введіть наступне:

    sudo make O=~/build/kernel modules_install
    

    У нашій системі Rocky ця команда встановить усі скомпільовані модулі ядра в каталог /lib/modules/<new_kernel-version>. У цьому прикладі цей шлях буде перекладено на /lib/modules/6.5.7-custom/. Це шлях, з якого ядро буде завантажувати всі завантажувані модулі за потреби.

    Підказка

    Слід (розмір) модулів ядра, встановлених за допомогою make modules_install, може бути досить значним, оскільки модулі містять символи налагодження. У результаті ви можете легко отримати каталог /lib/modules/6.5.7-custom/ розміром близько 5 Гб!

    У цьому посібнику ми уникаємо такого великого розміру, додаючи параметр INSTALL_MOD_STRIP=1 до нашого виклику make modules_install. Ви можете зменшити загальний розмір на порядки (наприклад, менше 200 МБ!!), видаливши ці символи налагодження.

    Це можна зробити, включивши опцію INSTALL_MOD_STRIP=1 до команди make modules_install.

Встановлення ядра

Якщо припустити, що у вас є ПК і ви працюєте в каталозі ~/build/kernel/, скомпільоване ядро, створене в попередній вправі, буде розташовано в цьому шляху - <kernel- build-dir>/arch/x86/boot/bzImage або, якщо бути точним, у нашому прикладі ~/build/kernel/arch/x86/boot/bzImage.

Відповідний файл карти для цього буде розташовано за адресою ~/build/kernel/System.map. На етапі встановлення вам знадобляться обидва файли.

Файл System.map корисний, коли ядро поводиться неправильно та генерує повідомлення «Oops». Повідомлення «Oops» генерується під час деяких помилок ядра через помилки ядра або несправне обладнання.

Ця помилка схожа на синій екран смерті (BSOD) у Microsoft Windows. Ці повідомлення містять багато деталей про поточний стан системи, включаючи кілька шістнадцяткових чисел.

System.map дозволяє Linux перетворювати ці шістнадцяткові числа на читабельні імена, що полегшує налагодження. Хоча це в основному на користь розробників, це може бути зручно під час повідомлення про проблему.

Давайте розглянемо кроки, необхідні для встановлення нового образу ядра.

  1. Перебуваючи в кореневому каталозі збирання ядра, скопіюйте та перейменуйте файл bzImage у каталог /boot:

    sudo cp ~/build/kernel/arch/x86/boot/bzImage \
    /boot/vmlinuz-<kernel-version>
    

    Тут <kernel-version> номер версії ядра. Ім’я файлу зразка ядра, яке ми використовуємо в цьому посібнику, буде vmlinuz-6.5.7-custom. Отже, ось точна команда для цього прикладу:

    sudo cp ~/build/kernel/arch/x86/boot/bzImage \
    /boot/vmlinuz-6.5.7-custom
    

    Примітка

    Рішення назвати образ ядра vmlinuz-6.5.7-custom є дещо довільним. Це зручно, оскільки образи ядра зазвичай називають vmlinuz, а суфікс номера версії корисний, якщо у вас є кілька доступних ядер або ядер, які надають певну функціональність (наприклад, vmlinuz-6.50.0-ws).

  2. Тепер, коли образ ядра на місці, скопіюйте та перейменуйте відповідний файл System.map у каталог /boot, використовуючи ті самі імена:

    sudo cp -v  ~/build/kernel/System.map \
    /boot/System.map-6.5.7-custom
    
  3. З ядром на місці, файлом System.map і модулями на місці ми готові до останнього кроку. Синтаксис необхідної команди:

    kernel-install add <kernel-version> <kernel-image>
    

    Тут <kernel-version> номер версії (і назва) ядра. А <kernel-image> це шлях до щойно скомпільованого образу ядра.

    Для нашого прикладу введіть:

    sudo kernel-install \
    add  6.5.7-custom /boot/vmlinuz-6.5.7-custom
    

Команда kernel-install - це чудовий сценарій оболонки. Він може бути доступний не в кожному дистрибутиві Linux, але він доступний у новіших дистрибутивах Fedora, RHEL, CentOS. Цей інструмент автоматизує багато останніх ручних дій, які нам зазвичай доводиться робити, щоб налаштувати систему для завантаження нового ядра, яке ми щойно створили.

Зокрема, інструмент робить наступне:

  • Він створює відповідний початковий образ файлової системи RAM (образ initramfs, тобто файл /boot/initramfs-<kernel-version>.img). Щоб зробити це вручну в системах, де kernel-install недоступний, скористайтеся командою mkinitramfs.
  • Він запускає команду depmod (яка створює список залежностей модуля).
  • Оновлює конфігурацію завантажувача.

Для систем із новішими версіями GRUB2 файл матиме назву /boot/grub2/grub.cfg. Для систем на основі EFI /boot/efi/<distro>/fedora/grub.cfg також оновлено.

А для систем із застарілими версіями GRUB це буде файл /boot/grub/grub.conf або /boot/grub/menu.lst. А для дуже нових дистрибутивів, які реалізували нову специфікацію завантажувача (BLS), новий запис завантажувача буде додано до каталогу /boot/loader/entries/ або будь-якого каталогу, на який вказує змінна під назвою blsdir.

На нашому демонстраційному сервері Rocky на базі EFI, на якому працює GRUB 2 за допомогою BLS, у файлі завантажувача, розташованому тут, створюється новий запис завантаження: /boot/loader/entries/6fa25ca775f64accb0d3e53f0e4e6e92-6.5.7-custom.conf

$ sudo cat  /boot/loader/entries/6fa25ca775f64accb0d3e53f0e4e6e92-6.5.7-custom.conf
title Rocky Linux (6.5.7-custom) 8.5 (Green Obsidian)
version 6.5.7-custom
linux /vmlinuz-6.5.7-custom
initrd /initramfs-6.5.7-custom.img $tuned_initrd
options $kernelopts $tuned_params
id rocky-20220212013135-6.5.7-custom
grub_users $grub_users
grub_arg --unrestricted
grub_class kernel

Примітка

У більшості дистрибутивів є кілька доступних утиліт grub2-*, які можна використовувати для виконання різноманітних завдань із обслуговування GRUB2 і завантажувача. Наприклад, ви можете використовувати команду grub2-set-default, щоб змінити або встановити ядро за замовчуванням, яке завантажуватиметься під час запуску системи.

Завантаження спеціального ядра

Наступним етапом є тестування ядра, щоб переконатися, що система може завантажуватися з ним.

  1. Припускаючи, що ви зробили все саме так, як прописав лікар, і все пройшло саме так, як сказав лікар, ви можете безпечно перезавантажити систему та вибрати нове ядро в меню завантажувача під час завантаження системи:

    sudo reboot
    
  2. Після завантаження системи ви можете скористатися командою uname, щоб дізнатися назву поточного ядра:

    $ uname -r
    6.5.7-custom
    
  3. Ви пам’ятаєте, що однією з функцій, які ми додали до нашого нового ядра, є можливість підтримки файлової системи NTFS. Переконайтеся, що нове ядро справді підтримує NTFS, відобразивши інформацію про модуль NTFS:

    [rockstar ~]$ modinfo ntfs
    filename:       /lib/modules/6.5.7-custom/kernel/fs/ntfs/ntfs.ko
    license:        GPL
    version:        2.1.32
    description:    NTFS 1.2/3.x driver - Copyright …..
    ...OUTPUT TRUNCATED...
    

І це все!

Author: Wale Soyinka

Contributors: Steven Spencer, Louis Abel, Ganna Zhyrnova