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

Материал из Википедии - свободной энциклопедии.

Дана стаття у першій редакції була опублікована в журналі “Мой компьютер” (№22 (453))

Версія 1.6 від 10.02.2008 р.

Олександр Наталенко aka post-factum

mailto:pfactum@gmail.com (mailto:pfactum%40gmail.com)

http://postfactum.pl.ua (http://postfactum.pl.ua/)

Володимир Кирилов aka Dark Proger

mailto:darkproger@gmail.com (mailto:darkproger@gmail.com)

http://darkproger.org.ua (http://darkproger.org.ua/)

У разі знаходження помилок в даній статті, велике прохання повідомити про них за вказаними вище адресами.



Ядерна орнітологія

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

Маленьке попередження: якщо ви дійсно не знаєте, для чого вам потрібна перекомпіляція ядра - краще не робіть цього.

А для всіх інших почнемо.

Для початку вам, звичайно, необхідний вихідний код ядра Лінукса. У складі вашого дистрибутиву він має бути, але його версія не обов'язково найновіша, оскільки виробники дистрибутивів більше прагнуть надійності, аніж новизни, і тому використовують перевірені часом, але не найновіші ядра. Особисто я завжди віддаю перевагу останній версії. Цьому є кілька причин. По-перше, мною керує звичайна цікавість, по-друге, хочу знати, що в новому ядрі залатані дірки, а по-третє, люблю використовувати деякі його нові можливості. Наприклад, у ядрі 2.6.20 з'явилася підтримка віртуалізації, отже, якщо комусь ця штука необхідна (а останнім часом вона таки стає невід'ємною складовою побудови сучасного сервера), то без нового ядра не обійтися. Слід сказати, що додаються не тільки нові речі, а і вдосконалюються старі. Кому ж передусім важлива стабільність - є можливість використовувати старішу версію, зараз таким вимогам відповідає гілка 2.6.16 (кількість ядер у цій гілці вже перевищує 50). Останнім часом також взялися за стабілізацію гілки 2.6.20.

Отже, з версією ви визначилися. Зауважу, що я не буду розглядати гілку 2.4.x, а все написане стосуватиметься лише 2.6.x. Для прикладу, візьмемо версію 2.6.24. Вам необхідно завантажити перше ядро цієї гілки, тобто власне 2.6.24. Ніколи не завантажуйте повністю вихідний код ядер, версія яких має вигляд 2.6.x.y - набагато простіше буде накласти патч (про це буде сказано далі), та і трафіку менше використовуватиметься, до того ж, процес пропатчування може йти у зворотну сторону — ви маєте змогу відмінити патч, отримавши початковий вихідний код. Пряме посилання на це ядро (44.6 Мб) http://kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.tar.bz2 (інші ядра гілки 2.6 шукайте тут: http://www.kernel.org/pub/linux/kernel/v2.6/, директорією вище ви можете знайти всі інші версії). Далі, з часом, для даної гілки з'являтимуться патчі, які, в принципі, нового нічого не додають, окрім виправлення знайдених помилок (цим займається стабілізаційна команда). Для ядра 2.6.24 наявний вже перший патч (17 Кб): http://kernel.org/pub/linux/kernel/v2.6/patch-2.6.24.1.bz2.

Отже, після скачування ядра і основних патчів, необхідно подумати про патчі додаткові, якщо вам вони потрібні. Якщо ні – переходьте до безпосередьої конфігурації, компіляції та встановлення ядра.

Невеличке зауваження: подумайте гарно перед першою компіляцією, чи дійсно вам необхідно додатково патчити ядро. Спочатку попрактикуйтеся без патчіві. Причиною цього є те, що оскільки патчі сторонні, то нема ніякої гарантії, що вони безвідмовно працюватимуть на вашому “залізі”.

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

  • -ck - спеціальний набір патчів від Кона Коліваса (Con Kolivas), куди входить його власний планувальник SD, а також патчі підвищення інтерактивності системи. Внаслідок того, що Лінус Торвальдс (Linus Torvalds) не погодився включити цей патч до головної гілки ядра, Кон припинив розробку. Але для всіх доступні патчі для гілок 2.6.1 – 2.6.22. Детальніше можна прочитати на сторінці http://members.optusnet.com.au/ckolivas/kernel/ (http://members.optusnet.com.au/ckolivas/kernel/). Варто відмітити, що даний патчсет підтримується в гілці zen (і підтримвувався в гілці kamikaze).
  • CFS (Completely Fair Scheduler) - окремо патч нового планувальника процесів, що є розробкою Інго Молнара (Ingo Molnar). Даний планувальник забезпечує повністю справедливий розподіл процесорного часу між програмами, тобто звичайному користувачу він підходить ідеально. Домашня сторінка – http://people.redhat.com/mingo/cfs-scheduler/ (http://people.redhat.com/mingo/cfs-scheduler/). Починаючи з версії ядра 2.6.23 даний планувальник включений в основне ядро, але по заданій адресі можна знайти виправлення в планувальнику для поточного ядра.
  • Для екстремалів спеціально створений realtime-патч. Після накладанні його ваша ОС перетвориться на систему реального часу, що оззначає найкращу інтерактивність, але патч слід використовувати з обережністю, бо можлива нестабільність роботи. Автор - той же Інго Молнар. Посилання: http://www.kernel.org/pub/linux/kernel/projects/rt/ (http://www.kernel.org/pub/linux/kernel/projects/rt/) Варто зауважити, що до складу цього патчсету входить планувальник CFS (для версій ядер до 2.6.23), тобто ви отримуєте практично ідеальну інтерактивність і найкращу багатозадачність.
  • TuxOnIce (він же Suspend2) - патч для тих, хто дуже хоче погратися з такими речами, як hibernate і suspend. Дивимось і читаємо: http://www.tuxonice.net/ (http://www.tuxonice.net/).
  • reiser4 - патч, який додає у ядро підтримку найсучаснішої файлової системи reiser4. Зараз поновилися суперечки між розробниками ядра щодо неї з приводу того, чи варто включати її до ядра. Особисто моя позиція тверда - необхідно включати, адже показники швидкодії, можливостей та захищеності у неї найвищі. Патчі: ftp://ftp.namesys.com/pub/reiser4-for-2.6/ (ftp://ftp.namesys.com/pub/reiser4-for-2.6/).


Якщо вам хочеться усього і одразу, вам допоможуть патчсети:


  • -dark - просто набір всякої всячини, яка поки не входить до ванільного ядра. Тут ви знайдете свіжу звукову підсистему ALSA, патчі з гілки -ck, BadRAM (з назви видно, що цей патч дозволяє працювати системі з “битою” пам'яттю), патчі, які виправляють роботу енергозбереження, планувальник CFS та ще купа патчів, корисних і не дуже. Рекомендується до випробування. Архів: http://www.dcaf-security.org/dark-sources/ (http://www.dcaf-security.org/dark-sources/patch-2.6.22-dark4.patch.bz2).
  • -kamikaze - бачили всі патчі, які я описав вище? А тепер подивіться на цей. Тут є все: i CFS, і reiser4, і -ck, і дещо від realtime, і suspend2, і нові драйвери vesa, і патчі Gentoo, і взагалі... Патчсет існує у двох редакціях - повна і полегшена (klight). Яку обирати - вирішувати вам, у полегшеній немає reiser4, suspend2 і ще дечого, але більшості користувачів її вистачить. Домашня сторінка: http://kamikaze.waninkoko.info/. Патчсет на даний час вже не підтримується, замість нього ведеться розробка нового під назвою zen.
  • -helium — новий патчсет, який містить більшість основних можливостей kamikaze, але випускається для нових ядер. Знайти його можна за цією адресою: http://hirakendu.mooo.com/helium-sources/. Із основних патчів можна відмітити reiser4, madwifi, fbcondecor, squashfs.
  • -zen — логічний розвиток kamikaze, з тією відмінністю, що для підтримки і публікації вихідного коду використовується система git. З цієї гілки періодично роблять стабільні знімки вихідного коду, я&;#1082;і можна знайти на сайті http://zen.waninkoko.info/patches (http://zen.waninkoko.info/patches). Також за розвитком даного патчсету можна спостерігати з http://forums.gentoo.org/ (http://forums.gentoo.org/) у розділі “Unsupported Software”. Звичайно, цей патчсет містить набагато більше нових можливостей, ніж kamikaze і “ванільне” ядро.

Завантаживши всі патчі (або не завантаживши), приступаємо до процесу компіляції.

Для компіляції ядра вам потрібен компілятор gcc та інший “джентельменський” набір програм для розробки (напиклад, GNU ''make'' та ''binutils). Спосіб встановлення їх залежить від вашого дистрибутиву (зверніться до документації або у пакетному менеджері вашого дистрибутиву, виберіть пункт “розробка”, якщо такий є). Припустимо, у вас він вже встановлений.

Для початку нам необхідно отримати права суперкористувача (root). Це робиться командою "su" або “sudo -s -Hз подальшим вводом паролю. Далі запускаємо файловий менеджер Midnight Commander (команда "''mc''") і переходимо до директорії “/usr/src”. Розпаковуємо туди tar.bz2-архів з вихідним кодом ядра. Найкраще це зробити тим же Midnight Commander'ом, який уміє працювати з різними типами архівів. В результаті розпаковування має з'явитися директорія "linux-2.6.24" (нагадую, що для прикладу ми вибрали ядро 2.6.24, у вашому випадку версія може бути іншою). Це, звичайно, можна зробити за допомогою вашої командної оболонки власноруч, на ваш розсуд.

Є й інший варіант розпакування архіву - використання архіватора 7z. Особисто я так і роблю. Також можна використати спеціальну програму для полегшення розпакування - deco (це маленька програмка, яка використовує інші архіватори, сама знає, які параметри кому передавати, вам лишається лише вказати ім'я архіву).

Також буде розумно, якщо ви зробите символічне посилання з директорії linux-2.6.24 на /usr/src/linux, це допоможе вам у подальшому, якщо ви будете збирати програми з вихідних кодів, а також допоможе вам не забути, де лежать коди вашого ядра. Але, якщо у вас декілька ядер, або ви їх постійно перезбираєте, то робити цього не варто.

Переходимо до цієї директорії, копіюємо до неї обрані патчі і розпаковуємо їх тим самим способом. Наприклад, ви обрали патч -zen1 (http://zen.waninkoko.info/patches/2.6.24/linux-2.6.24-zen1.bz2, 6.3 Мб). Файл "linux-2.6.24-zen1.bz2" розпаковується, в результаті чого ми отримуємо файл "linux-2.6.24-zen1". Тепер накладаємо патч командою "patch -p1 <linux-2.6.24-zen1". На екран буде виведено рядки, які потім слід продивитися і впевнитися у тому, що патч накладено вірно. Для того, щоб тимчасово вимкнути панелі Midnight Commander'а, слід натиснути комбінацію клавіш CTRL+O.

Невеликий коментар: не слід думати, що можна просто так взяти і накласти всі патчі, які у вас є. Вони не завжди сумісні один з одним (наприклад, на 'realtime'-ядро неможливо накласти 'kamikaze', та це і &;;;;;;#1085;е потрібно).

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

Після накладання всіх патчів необхідно ядро сконфігурувати. Я не буду описувати кожну опцію ядра, бо у кожного користувача своє "залізо" і свої смаки. Одне скажу - аби ядро 95% працювало після компіляції, можна використати конфігураційний файл від поточного ядра. Цей файл можна знайти або в директорії "/proc" ("''config.gz''", стиснений файл конфігурації), якщо відповідна опція була увімкнена при компіляції старого ядра, або в директорії "/boot". Необхідно скопіювати його до нашої директорії (якщо він стиснений, то обов'язково розпакувати), перейменувати у ".config" і дати команду "make oldconfig". Запуститься консольне налаштування ядра, яке використає відповіді на більшість питань з готового конфігу, але будьте готовими відповідати на ті запитання, які стосуються нововведень у даному ядрі.

Якщо ви таки хочете конфігурувати ядро "з нуля" або хочете трохи змінити стару конфігурацію вашого ядра, давайте команду "make menuconfig". У цьому випадку вам буде представлений зручний псевдографічний інтерфейс у вигляді меню. Слід звернути увагу, що в цьому разі в системі мають бути встановлені бібліотеки ncurses і ncurses-devel.

Все ж таки дам кілька порад відносно конфігурування:

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

Завершивши конфігурування, запускайте компіляцію. Тут можливі два способи.

Найлегше тим, хто використовує Debian-based дистрибутиви, а також тим, хто на початку читання передумав перезбирати ядро ;). Тут дається команда "make-kpkg --initrd --append-to-version -blablabla kernel_image" (у вас має бути встановлений пакет kernel-package, а замість “blablabla” можете щось написати, наприклад своє ім'я, а можете не писати нічого), по завершенні якої ви матимете в директорії “/usr/src” готовий deb-пакет з ядром, який встановлюється командою "dpkg -i kernel-image-2.6.24-zen1-blablabla.deb". Якщо ви використовуєте завантажник grub (а рекомендується використовувати саме його, і ніякий більше), то просто перезавантажуйте комп'ютер, у меню завантажувача обирайте нове ядро і тестуйте.

Хто ж використовує інший дистрибутив, тим буде трохи важче.

Спочатку дається команда "make", яка збере ядро і модулі. Потім дається команда "make modules_install", яка встановить модулі. А далі йде ручна робота. Під час компіляції ядра ви можете трохи відпочити, хоча не дуже довго (це залежить від швидкодії центрального процесора).

Готове ядро (файл ''bzImage) береться з піддиректорії "arch/x86/boot" (замість ''x86 ''може бути назва архітектури вашого комп'ютера; слід звернути увагу, що починаючи з версії ядра 2.6.24 архітектури i386 &;#1110; x86_64 об'єднані в одну — x86, а для попередніх ядер вони різні) того каталогу, де у вас вихідні коди, і копіюється у директорію “/boot”. Лише необхідно перейменувати даний файл, щоб його назва мала вигляд "vmlinuz-2.6.24-zen1-blablabla". Туди ж копіюється файл "System.map" і так само перейменовується на "System-2.6.24-zen1-blablabla.map".

Далі знову є кілька варіантів.

Можливо, у вас в системі наявна утиліта "update-initramfs". В такому разі запускаєте її: "update-initramfs -k 2.6.24-zen1-blablabla -c", і вона все зробить за вас.

В іншому випадку, у вас має бути утиліта "mkinitrd". Запускаєте її: "mkinitrd initrd-2.6.24-zen1-blablabla.img 2.6.24-zen1-blablabla". Хочу попередити, до речі, що ця команда в різних дистрибутивах має різні параметри, і можливо, вам доведеться читати допомогу, щоб дізнатися її параметри (root-розділ, ім'я ядра, ім'я образу).

Хоча, якщо ви майже не збирали дуже важливі для вашої системи компоненти ядра як модулі, то initrd вам і не знадобиться.

У всякому випадку, припустимо, ви таки зробили все написане. Залишається налаштувати завантажувач. Припустимо, у вас grub. Тоді у файлі "/boot/grub/menu.lst" дописуємо такі рядки (тільки будьте впевненими у тому, що ви вказали правильний root-розділ; його можна взнати в цьому ж файлі, подивившись на записи, які стосуються старого ядра):


title

Debian GNU/Linux, 2.6.24-zen1-blablabla

root

(hd0,1)

kernel

/boot/vmlinuz-2.6.24-zen1-blablabla root=/dev/hda2 ro

initrd

/boot/initrd.img-2.6.24-zen1-blablabla

savedefault



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

Для абсолютно лінивих людей, яким просто не хочеться/не можеться робити зазначені речі вручну, придумана команда “make install”. Вона автоматично встановлює ядро і модулі, а також прописує необхідні параметри, взяті з попереднього ядра, у конфігураційному файлі завантажувача. Стовідсотково, однак, на цю команду покладатися не варто, і після неї все необхідно перевірити вручну, щоб мати змогу завантажити систему у будь-якому разі, навіть якщо ядро недієздатне.

На цьому все. Пишіть, як щось незрозуміло.

P. S. Окремо велике спасибі Уукруличу, alexeywww, Сергію Бурачеку, Олегу Матвійчуку, Володимиру Колибенку, dj_doom'у, Farcaller'у, Jan2ary за допомогу при написанні даної статті.

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

P. P. P. S. Linux forever!