Введення [ред]
- просто цікаво.
- є функціональність, яку хотілося додати, а в наших ядрах її немає.
- розширення підтримки заліза. Є залізяка, вона не працює, але є патч і можливість перевірити.
Чому цього не варто робити:
- Завдання складне, якщо не дуже потрібно, не забивайте собі голову.
Чого не варто робити:
- Плодити різні 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)
- Бажано бути відключається при завантаженні або збиратися модулем
- Міняти роботу базових систем ядра
- Заважати іншим патчам
- Що або псувати.