Про компіляції нового ядра
Навіщо взагалі потрібно компілювати ядро?
Як було сказано на початку цього розділу, основна функція ядра полягає в тому, щоб забезпечити взаємодію з апаратурою комп'ютера. Обслуговування деяких складових апаратного забезпечення (таких, як пам'ять, наприклад) безпосередньо вбудовано в ядро. Для тих частин апаратури, які можуть бути нестандартними, є драйвери пристроїв, які забезпечують взаємодію ОС з апаратурою. Більшість користувачів комп'ютерів з ОС Windows знайомі з поняттям драйвера хоча б тому, що після установки нового обладнання вони змушені встановлювати і програмні драйвери для цього обладнання. Тільки після цього стає можливим використовувати знову встановлену апаратну складову. У термінології, прийнятої в Linux, драйвера називаються "модулями". Таким чином, підтримка апаратних пристроїв може бути забезпечена двома способами: або шляхом вбудовування такої підтримки в ядро, або шляхом використання відповідного модуля (драйвера).
Компанії, які випускають дистрибутиви Linux (такі як RedHat, Caldera, Debian і т. Д.) Змушені вбудовувати в ядро підтримку якомога ширшого спектра пристроїв, тому що вони не можуть заздалегідь знати, які пристрої (моделі пристроїв) будуть встановлені на комп'ютері конкретного користувача. Підтримка в ядрі широкого спектру пристроїв полегшує установку і підтримку системи для покупців, позбавляючи їх від непотрібних складнощів.
Як результат, ядро, яке постачається в складі дистрибутива, швидше за все містить код для підтримки пристроїв, яких ніколи не буде на Вашому комп'ютері. З іншого боку, якщо у вас є пристрій, який не підтримується стандартним ядром, у вас може з'явитися обгрунтоване бажання вбудувати підтримку цього пристрою в ядро. Оптимізація ядра під конкретний набір апаратних пристроїв прискорює завантаження системи і економить пам'ять.
Користувачі Linux мають можливість або скомпілювати ядро з підтримкою всіх пристроїв, наявних на конкретному комп'ютері, або скомпілювати ядро, що підтримує мінімальний набір обладнання, і завантажувати модулі для підтримки інших пристроїв. Якщо підтримка всього обладнання здійснюється в ядрі, то таке ядро називається "монолітним". Ядро, скомпільований таким чином, що підтримка частини обладнання здійснюється з використанням модулів (драйверів), називається "модульним".
Який тип ядра вам вибрати при компіляції? Однозначної відповіді на це питання дати не можна. Якщо ви не маєте звички міняти апаратну конфігурацію комп'ютера, тоді вам краще вбудувати підтримку всіх наявних компонентів в ядро. Необхідно тільки мати на увазі, що чим більше пристроїв підтримуються безпосередньо ядром, тим більше його обсяг. А оскільки ядро повністю завантажується в оперативну пам'ять, підвищуються вимоги до обсягу пам'яті. На повільних комп'ютерах через великого розміру ядра може знизитися загальна продуктивність. Якщо ж ви часто міняєте конфігурацію комп'ютера (наприклад, у вас є знімні жорсткі диски або інші тимчасово підключаються пристрої), то, ймовірно, має сенс використовувати для управління ними модулі, які завантажуються в пам'ять тільки при необхідності (економлячи тим самим системні ресурси) . Таким чином, в найзагальнішому випадку підтримка деякої частини пристроїв повинна бути вбудована в ядро, а інші пристрої повинні підтримуватися за рахунок використання завантажувальних модулів.
Крім бажання мати ядро, оптимізоване для вашої системи, необхідність перекомпілювати ядро може бути викликана виявленням якихось помилок в старій версії ядра, зокрема таких, які становлять загрози з точки зору безпеки (коли ще з'явиться rpm-пакет з виправленою версією ядра?) .
Я був змушений займатися установкою ядра з вихідних кодів тому, що система віртуальних машин VMware відмовилася працювати з встановленим у мене ядром 2.2.16, повідомивши, що ця версія ядра не підтримує роботу з CDROM з VMware, і запропонувавши мені або встановити новішу версію ядра , або повернутися до версії 2.2.15. Спроби встановити нову версію ядра з rpm-пакетів теж не вирішили проблему, тому що конфігураційний скрипт VMware повідомляв, що йому не вистачає header-файлів. Установка пакетів kernel-headers (повністю відповідних ядру) теж не привела до успіху, ось і довелося зробити спробу встановити ядро з вихідних текстів.
Треба сказати, що на той час мій досвід установки програмного забезпечення для Linux з вихідних був дуже обмежений. Тому приступав я до цієї процедури тільки під тиском обставин (дуже хотілося запускати MS Office під Linux, не вдаючись до перезавантаження комп'ютера). Наведений нижче текст є якраз описом того, що я тоді робив. Оскільки мій експеримент виявився вдалим, я можу зі спокійною совістю стверджувати: нічого такого, що виявилося б не під силу початківцю, в компіляції ядра з вихідних кодів немає.
Я експериментував на версії 2.2.16-22 з свіжовстановленому дистрибутива ASPLinux Release Candidate 3 і встановлював ядро версії 2.4.2. Тому всі приклади в даній лекції наводяться для випадку, коли система вже працює на ядрі версії 2.2.x і ви прийшли до рішення встановити ядро версії 2.4.x.
Що треба знати до початку компіляції
Мабуть, найперше, до чого потрібно бути готовим, приступаючи до компіляції ядра, - це те, що процедура ця тривала. Так що не розраховуйте скомпілювати ядро "між справою", у вільну хвилинку. Заздалегідь плануйте, що витратите на це кілька годин, інакше ви будете змушені перервати процедуру посередині.
По-друге, до початку компіляції ядра вам необхідно хоча б у загальних рисах уявляти, яку саме конфігурацію апаратного забезпечення обслуговуватиме нове ядро, і вирішити, які пристрої будуть обслуговуватися самим ядром, а які - модулями.
По-третє, ядро версії 2.4.2 навіть в архивированном (програмою bzip2) виді займає більше 20 Мбайт, а після розархівації обсяг вихідних текстів перевищує 108 Мбайт. Ще стільки ж може знадобитися для проміжного tar-архіву, так що треба мати не менше 250 Мбайт вільного місця. Тому перш ніж приступити до компіляції, подбайте про те, щоб місця на диску було достатньо.
На цьому попередні попередження зроблені, і я переходжу до викладу покрокових інструкцій щодо збирання і встановлення нового ядра. Надалі передбачається, що всі описані дії виконуються з правами суперкористувача root. і що домашнім каталогом є каталог / root.