Додавання патчів в ядро

Введення [ред]

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

Чому цього не варто робити:

  • Завдання складне, якщо не дуже потрібно, не забивайте собі голову.

Чого не варто робити:

  • Плодити різні flavour. Краще додати до наявних.
  • Робити тільки для себе. Якщо ви додали патч, який робить що то корисне, варто його викласти в сизиф. Воно може ще комусь стати в нагоді.
  • знання git. Хоча б початкові. Вся розробка ядра ведеться в git, і його тут ніяк не оминути.
  • Знання складальної системи gear
  • Доступ до сховища.
  • Досить потужна машина. Ядро може збиратися довго (близько півгодини) в залежності від заліза, і в процесі складання вимагати до 1Gb під тимчасові файли. Будьте готові що цей процес з'їсть багато ресурсів.
  • Доступ до git.alt. git репозиторій з ядром може займати до 300Mb будьте готові хоча б раз завантажити його повністю.

Розбираємося з Бранч [ред]

Для початку нам потрібен git репозиторій з ядром. для цього ми його хилимо, наприклад,

Тепер заходимо в kernel-image-2.6.25 і бачимо ванільне ядро. Справа в тому, що git cкопіровал тільки гілку master. Подивитися інші гілки можна за допомогою команди

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

Розповімо про них по порядку.

kernel-image- * [ред]

Основні бранчі - це бранчі kernel-image- *, саме з них збираються ядра. Ці бранчі відповідають flavour'ам, наприклад, пакет kernel-image-std-def збирається з однойменного бранча. Решта - std-pae, std-ll, std-srv є його похідними і в даний момент нам не цікаві. Для початку отримаємо собі копію цього бранча

тепер, подивившись в отриману директорію, ми побачимо файли kernel-image.spec. .gear /. modules.build. subflavours та вихідні ядра. Spec-файл і директорія .gear / виконують звичайну роль. Файл modules.build - це список модулів для скриптів автоматичного складання модулів, туди додаються всі модулі, які треба пересобрать після поновлення ядра. Файл subflavours - це список subflavour'ов, які треба оновити при оновленні основного subflavour. Наприклад, ми оновлюємо і тестуємо std-def. а потім ці зміни спеціальним скриптом затягуються в інші subflavour.

kernel-source [ред]

- це спеціальний бранч з якого збирається пакет kernel-source-версія. Цей пакет завжди містить вихідні коди ванільного ядра, і використовується для складання всіх ядер своєї версії. Важливо, що в цьому пакеті міститься, наприклад, 2.6.25, а не 2.6.25.17. Перед складанням gear робить diff між тегами v2.6.текущая верся ядра (наприклад, v2.6.25) і бранч kernel-image-flavour. Цей diff кладеться в SRPM, а при складанні витягується kernel-source-версія і на нього накладається цей diff. Таким чином, kernel-source має сенс чіпати, тільки якщо ви намагаєтеся зібрати нову версію ядра.

fix і feat [ред]

- це бранчі з патчами. Вони "ростуть" з ванільного ядра (можна базової, на кшталт v2.6.25. Можна найсвіжішої ванільною) і містять патчі, що додають (feat) якусь можливість або усувають будь-яку помилку (fix).

Далі, їх назви мають структуру -подсістема -суть. Наприклад, fix-fs-security усуває уразливості в файлових системах або VFS, а feat-drivers-net-atl1e додає драйвер для мережевої картки atl1e.

  • в один бранч можна класти кілька патчів.
  • Різні речі краще тримати в окремих Бранч
  • Не варто робити бранчі на основі kernel-image-std-def. Це потім викликає масу проблем.
  • Якщо є якісь фікси, необхідні для мерджа або виправляють виникає проблему, то їх варто класти в цей бранч.

Про назви, приклади:

  • додати нову wifi картку треба в бранч feat-drivers-net-wireless-картка
  • виправити проблему з підтримкою процесорів - в бранч fix-arch-cpu-проц

Додавання патчів [ред]

Власне послідовність необхідна для додавання пачей. Для початку виберемо ім'я наречених, і для зручності назвемо його $ branch. $ Vversion - це поточна версія ванільного ядра. Створюємо бранч:

Тепер докладемо патч. Його можна або докласти і закомітіть. Тобто:

У git commit варто написати опис, власне що цей патч робить. Ще можна скористатися командою git am.

Вищеописане дію треба повторювати, застосувавши всі необхідні патчі.

Далі пробуємо додати наші патчі в вихідні коди ядра.

Після другої команди у нас можуть виникнути конфлікти. Якщо вони виникли їх можна виправляти наступним ітераційним алгоритмом.

Побачили конфліктні файли, вибрали один

Шукаємо там рядки >>>>. ====, <<<<и устраняем конфликты. Так же можно воспользоваться git mergetool.

І повторюємо з кожним файлом потім робимо

Власне смерджілі. Якщо патч чіпає фали KConfig варто оновити конфіги.

Збірка і публікація [ред]

Зібрати ядро ​​можна, також як і будь-який пакет, за допомогою gear, тільки пам'ятайте що пакет великий, збирається він довго, і при цьому активно споживає місце.

Після складання іноді має сенс зібрати модулі, про це можна почитати тут. Тільки власне збірка відбувається командою

Потім йдемо в директорію з ядром і додаємо (для зручності) remote. git.alt відповідає нам $ url

Власне після цього ядро ​​всі наші зміни заливаються на git.alt

Критерії додавання патчів в ядро ​​std [ред]

Хороший патч повинен:

  • Бути корисним
  • Бути стерпним (хоча б працювати на x86_64 та i586)
  • Бажано бути відключається при завантаженні або збиратися модулем
  • Міняти роботу базових систем ядра
  • Заважати іншим патчам
  • Що або псувати.

Схожі статті