Valery's Mlog

Mindlog of a Freak
July 22nd, 2001 by Valery Dachev

Компилиране и инсталиране на GNU/Linux ядрото (1.7)

“Компилиране на ядро” – това нещо звучи много страшно за всеки начинаещ Linux-ар. Всъщност, това е един не чак толкова сложен процес (особенно ако познавате добре компютъра си). Цялото това удоволствие може да се подели на три етапа, всеки от които ще разгледаме подробно по-долу.

0. Предговор

Що е то ядрото и какво е компилиране ? Има хора, които това не е ясно, така че ще обясня тук.

Ядрото е общото между всички дистрибуции на Linux – това е нещо, което зависи от Линус Торвалдс. Вие можете да се сдобиете безплатно с него. Обикновенно го получавате в неговия изходен код (така, както са го писали Линус Торвалдс, Алан Кокс и др.), но, за да се зареди операционната система, трябва ядрото да е в машинен код. Т.е. трябва на превърнете ядрото от изходен в машинен код, който процес се нарича компилиране. Това обаче позволява да компилирате само тези тези части, които са ви нужни. Например, вие може би не се нуждаете от поддръжка на SCSI адаптери и устройства или на поддръжка на повече от 1GB RAM. Благодарение вие можете да настроите така ядрото, че то да е най-оптимизирано за вашата конфигурация.

Когато инсталирате някаква дистрибуция на Linux, вие получавате компилирано ядро, което обаче е направено така, че да поддържа почти всичко, което
го прави доста неоптимизирано. Това предполага, че бихте искали да го прекомпилирате.

1. Подготовка

Започвам с предположението, че, както повечето от Linux-арите, изходния код на ядрото ви се намира в директорията /usr/src/linux. Ако това не е така, просто ще ви се наложи да замествате имената да директориите. В повечето дистрибуции /usr/src/linux не е директория, я сомволична връзка (“symlink“) към директорията съдържаща изходния код (който за краткост ще наричам “source“, доколкото започват да ме мързят пръстите) на текущото ядро, примерно /usr/src/linux-2.2.13.

Тук ще предположа, че вече сте си изтеглили пълно ядро (примерно 2.2.14) или само измененията в него (файла с последните ще наричам с по-популярното му название – “patch“). В зависимост от това какво точно сте изтеглили имате два вариянта на действие:

  • Изтеглили сте си чисто ново и функционално ядро. Да предположим, че името на файла е “/usr/src/linux-2.2.14*“, където “*” е разширението
    му. Правим следното:

    • Влизаме в директорията /usr/src:

      machine:~# cd /usr/src

    • Изтриваме symlink-а към директорията със старото ви ядро:

      machine:/usr/src# rm -f linux

    • Декомпресираме ядрото по съответния начин, в зависимост от разширението му.
      • Ако е “.tar.gz“, то пишем:

        machine:/usr/src# gunzip linux-2.2.14.tar.gz

      • Ако е “.tar.bz2“, пишем:

        machine:/usr/src# bunzip2 linux-2.2.14.tar.bz2

      • Ако е “.tar.Z“, пишем:

        machine:/usr/src# uncompress linux-2.2.14.tar.Z

      • Ако е нещо друго, можете да звъннете в най-близкото поделение на МВР или да ми драснете една пощичка ;-P.
    • Сега ще извадим файловете от некомпресирания “.tar“-архив:

      machine:/usr/src# tar -xvf linux-2.2.14.tar

  • Изтеглили сте гореспоменатото чудо, наречено patch. И тук аз отново започвам да предполагам казвайки, че файлът се казва “/usr/src/patch-2.2.14*“,
    където (за всеобща изненада 8-)) “*” отново е разширението му. Всъщност patch-е файл, който съдържа разликите между две различни версии
    на ядрото, което автоматично ви спестява трафик при теглене, но лошото тук е, че това са разликите между последната и предпоследната версии на ядрото. Това, което се опитвам да кажа е, че не можете с един patch да преминете примерно от ядро 2.0.36 към 2.2.14, освен ако нямате всички необходимите patch-ове или някой не е направим специално за вас един такъв. И така, това което трябва да направите е следното:

    • Влизате в директорията с patch-овете (примерно /usr/src/):

      machine:~# cd /usr/src

    • Пускате скрипта за patch-ване:

      machine:/usr/src# linux/scripts/patch-kernel

    По-ръчният и труден вариянт е следния:

    • Влизате в /usr/src:

      machine:~# cd /usr/src

    • В зависимост от разширението:
      • Ако е “.gz“, пишете:

        machine:/usr/src# gunzip linux-2.2.14.gz

      • Ако е “.bz2“, пишете:

        machine:/usr/src# bunzip2 linux-2.2.14.bz2

      • Ако е “.Z”, пишете:

        machine:/usr/src# uncompress linux-2.2.14.Z

      • По-горе вече споменах какво да правите с неизвестните разшерения ;-P
    • Престъпваме към patch-ването:

      machine:/usr/src# patch -p0 < linux-2.2.14

И точно в този момент преключва първия етап от компилирането на ядрото.

2. Настройка и компилиране

В тази част ще можете да проявите познанията си по английски. Но първо трябва да влезете в директорията със source-а:

machine:/usr/src# cd /usr/src/linux

Конфигурирането на ядрото става с помощта на конфигурационите скриптове и програми, които вървят с него. Самите скриптове се пускат както следва:

  • текстов с въпроси:

    machine:/usr/src/linux# make config

  • текстов с менюта:

    machine:/usr/src/linux# make menuconfig

  • графичен за X с менюта:

    machine:/usr/src/linux# make xconfig

Още нещо, което може да ви спести доста играчка при настройката на ядрото, това е възможността да направите един вид upgrade. Идеята се състои в следното – вече сте си компилирали веднъж ядро и сте доволни от настройката му (например гореспоменатото 2.2.13 ядро). Можете да запазите файла с настройките (.config) от директорията с изходния код на ядрото, който можете да използвате при компилирането на новото ядро. Това става като го изкопирате в директорията с изходния код на новото ядро и напишете в нея:

machine:/usr/src/linux# make oldconfig

При това положение, ще имате възможност да избере кои от новите неща в ядрото да компилирате в ядрото или като модул, в стил a la make config.

Искам да спомена за модулите. Те са аналог на драйверите под Microsoft (r) Windows (tm), с тази разлика там, че те могат да бъдат пускани и спирани по
всяко време. Трябва добре да прецените кое колко често ви трябва и дали да го компилирате на модули. Уви, не всичко може. Но определено модулите помагат за смаляването на паметта заемана от ядрото по време на работа.

По време на настройката разполагате информация за почти всяка опция, като в същото време можете да хвърляте по едно-две или там колкото искате очи на документацията на ядрото забутана в директорията /usr/src/linux/Documentation, където примерно можете да намерите информация за това как стъпка по стъпка да инсталирате мрежовата и/или звуковата си карта, както и много други дрънкулки по машината си, като, примерно, любителски радиоприемник.

Забележка: За съжаление поддръжка за кафе-машина няма в ядрото, поради липсата на стандартизиран протокол за комуникация разработен от производителите на такива, но информация по въпроса можете да намерите във файла /usr/doc/Linux-mini-HOWTOs/Coffee (който, ако искате, бих превел).

След като настроите ядрото, добре би било да запишете конфигурацията му във файл със “Save Kernel Configuration“, за да можете при следваща преконфигурация на ядрото да я заредите с “Load Kernel Configuration“.

Вече свършихте с настройките. Точно по средата сте.

  • Първо ще трябва да оправите зависимостите между файловете:

    machine:/usr/src/linux# make dep

  • След това трябва да се подсигурите, че няма останали компилирани файлове:

    machine:/usr/src/linux# make clean

  • Новите ядра вече не са толкова малки като първите, така че е добре да се компресират, като единственият отрицателен ефект на това е, че зареждането на Linux става малко по-бавно заради декомпресирането.
    • За да компилирате ядрото без компресия, напишете:

      machine:/usr/src/linux# make

    • За да компилирате ядрото с нормална компресия:

      machine:/usr/src/linux# make zImage

    • За да компилирате ядрото с висока компресия:

      machine:/usr/src/linux# make bzImage

  • Сега трябва да се компилират модулите:

    machine:/usr/src/linux# make modules

Вече сте готови да инсталирате ядрото.

3. Инсталиране

Сигурно се питате къде ви е ядрото, което след толкова писания уж сте компилирали. Е, добре, ядрото се намира в /usr/src/linux/arch/?!?/boot, където “?!?”
е архитектурата ви (тя може да е “alpha“, “sparc“, “m86k“, но в повечето случаи е “i386“). В зависимост какво е нивото на компресия на ядрото, което сте компилирали, файлът се казва:

  • vmlinuz“, ако е без компресия;
  • zImage“, ако е с нормална компресия;
  • bzImage“, ако е с висока компресия.

Преименувайте файла и го изкопирайте примерно в главната директория. В следващия пример ще предположа, че ядрото е 2.2.14 и е компилирано на
i386
-архитектура с “make bzImage“:

machine:/usr/src/linux# cp arch/i386/boot/bzImage /bzImage-2.2.14

Тук трябва и да инсталираме System.map файла:

machine:/usr/src/linux# cp System.map /boot/System.map

Забележка: Горните две стъпки можете да пропуснете, ако смятате да инсталирате ядрото с “make zlilo” или “make bzlilo” (които не са описани тук, но са описани във файла /Documentation/kbuild/commands.txt в директорията с изходния код на ядрото).

Сега трябва да сложим модулите по местата им, т.е. да ги инсталираме:

machine:/usr/src/linux# make modules_install

Следват настройки в зависимост от това какво ползвате, за да пуснете Linux:

  • LILO (“LInux LOader“). Значи, LILO има конфигурационен файл (обикновенно /etc/lilo.conf). В този файл ще трябва да добавите въпросното ядро по показания начин и след това да напишете “lilo“, за да може то да се обнови.
    	    image	= /bzImage-2.2.14
    		root	= /dev/hda2
    	        label	= Linux
    	        read-only
  • LoadLin. За тази цел, ще трябва да изкопирате ядрото на  Windows дял, като последния монтирате в някоя празна директория (нещо,
    което не смятам да коментирам тук). LoadLinще трябва вече да пускате с ред от рода на:c:\loadlin.exe c:\bzImage root=/dev/hda2 roРазбира се, този ред можете да си натъпчете в някой “.bat“-файл, но това вече си е ваша работа.

Остава ви само да рестартирате машината си и да си пуснете Linux-а.

Проблеми

След като пуснете Linux-а си, може да се имате появяват някои досадни грешки при зареждането на модулите. В такъв случай направете следното:

  • Изтрийте директорията с компилираните модули:

    machine:~# rm -Rf /lib/modules/2.2.14

  • Влезте в директорията със source-а на ядрото:

    machine:~# cd /usr/src/linux

  • Преинсталирайте модулите:

    machine:/usr/src/linux# make modules_install

  • Оправяте зависимостите между тях, доколкото има модули, които изискват зареждането на други:

    machine:/usr/src/linux# depmod -a

Рестартирайте своя Linux и вижте какво ще стане. Дано проработи. Ако не, пишете ми и кажете точно какво става – ще се опитам да ви помогна.

Друга полезна информация

Като най-полезна информация (защо ли съм на това мнение ? :-)), можете да намерите този документ на страницата ми.

Linux ядро можете да си изтеглите от  www.kernel.org или www.kernelnotes.org. В документацията, която върви с ядрото (/usr/src/linux/Documentation/*),
можете да намерите информация за почти всичко свързано с него (включително и скриптове, които да автоматизират и улеснят процеса на компилиране).

Голяма е вероятността с всичко останало да сте инсталирали и стандартната документация. Там можете да намерите следните файлове, в които можете да намерите доста полезна информация:

Други

Авторът на това произведение (в мое лице), се не носи отговорност за каквито и да било (морални, физически, софтуерни, хардуерни, мийтуерни и т.н.) щети нанесени пряко или косвено от информацията публикувана в този документ. Т.е., правейки нещо в резултат на употребата на този документ, вие носите цялата отговорност за действията си. Този документ може да бъде разпространяван свободно съгласно поледната версия на GNU GPL във вида, в който е публикуван от Free Software Foundation.

Авторът (отново моя милост, за изненада на всички) не приема упреци, а само предложения (и поздравителни картички). Шегувам се ! Що се отнася до тази статия, можете спокойно да ме упреквате по съдържанието и, но като в същото време давате предложения за допълване и/или поправка. Всичко това, естествено, ще бъде обелязано.


Забележка: Лицензът на тази статия е за това той да се спазва. За съжаление, в последно време се убедих, че някои хора (в лицето на Атанас Петров) в тая държава не само, че не смятат така, а и очевидно не съжаляват въобще за това че нарушават правото ми като автор да избера как ще се разпространява тази статия – право, нарушаването на което, автоматически значи нарушаване на българското и международното законодателство. По принцип бих сметнал за неморално да им кажа имената тук, но го правя, защото смятам, че постъпката им е още по-неморална по отношение на мен и на труда, който съм вложил в тази статия.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: