Home    Решения    Услуги    Download    Публикации    Работа    Продукти    Документи
 

 

 
Print this page/Отпечатай тази страница  

 

Компилиране на ново ядро на Linux

от Йовко Ламбрев ([email protected])




(Статията е публикувана във в-к "Компютри" бр.43 от 23-29 октомври 2000 г.)

       

Излишно е да казвам, че ядрото на една операционна система е най-важната и част. Това обаче не означава, че то трябва да е забулено в мистерия - поне в света на отворения код това съвсем не е така. Ядрото (често наричано кърнъл от английската дума kernel) е просто софтуер като всеки друг, който предоставя основния интерфейс между хардуера на машината и приложенията, които стартирате върху нея.

Възможно е никога да не ви се наложи да компилирате Linux ядро, но обикновено на някакъв етап от работата ви с Linux (а и други UNIX-и) това се случва. Понякога това се прави веднага след самата инсталация. Ядрата, които идват с дистрибутивите са вече доста големи и натруфени заради идеята да са способни да поддържат възможно най-много различен хардуер, а вие едва ли се нуждаете от всичко това. Много по-добре е да прекомпилирате ядрото с поддръжка само на вашия хардуер и да изхвърлите излишното от него , особено ако не променяте често компонентите на компютъра си. Така ще имате малко ядро, което ще се зарежда по-бързо и ще заема по-малко памет.

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

 

Няколко общи думи за ядрото

Ново ядро можете да получите от FTP сървърите на kernel.org, sunsite.unc.edu, техните mirror-и, както и от много други места, разбира се също и от FTP сървърите на вашата предпочитана дистрибуция. Обикновено ядрото е архив във формат tar.gz и името на файла съдържа и номера на версията му linux-x.y.p, където x е версията, y е номера на конкретната реализация, а p е номер на patch. Patch се наричат малки промени в ядрото, които се правят непрекъснато с цел включване на нови функции или подобряване на предишния код. Когато номера на реализацията ( y) е четно число ядрото се нарича стабилно, а когато е нечетно това е ядро, което е в стадий на разработка - нещо като бета-версия, когато едно такова ядро премине достатъчно тестове, то излиза като стабилно с четен номер. Например ядрата 2.0.36 и 2.2.13 са стабилни, а ядро версия 2.3.74 е развойно. Всяка дистрибуция по правило инсталира стабилно ядро.

 

Конфигуриране и компилиране

Всички действия по конфигурирането, компилирането и донастройката на новото ядро трябва да извършите като root. Няма да ви е излишно да имате boot-дискета в случай, че нещо се обърка. Командата mkbootdisk в някои дистрибуции ще ви е от полза за целта иначе ще трябва да прочетете някъде как да си направите такава дискета. Вероятността да попаднете на непредвиден проблем не е голяма, но все пак се случва, особено ако компилирате много ново и недостатъчно тествано ядро или преминавате от версия 2.0 към 2.2.
И едно уточнение - от тук нататък предполагаме, че имаме Linux с ядро 2.2.9 и искаме да компилираме ново с версия 2.2.14.

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

mv linux linux-2.2.9

Ако пък имате символична връзка трябва просто да я изтриете без да преименувате нищо:

rm linux

Сега да разархивираме новото ядро:

tar xvfz linux-2.2.14.tar.gz

В този момент вече можете да изтриете архива linux-2.2.14.tar.gz ако имате недостиг на място. Сега в / usr/src ще видите новосъздадена директория linux, която съдържа изходния код на новото ядро. Нека да я преименуваме като linux-2.2.14 и да създадем символична връзка linux, сочеща към нея. След това трябва да влезем в новата директория за да започнем конфигурирането.

mv linux linux-2.2.14
ln -s linux-2.2.14 linux
cd /usr/src/linux

За многообразието от опции и възможности при компилирането на ядрото може да се напише книга (и такива има), но общия съвет, който мога да ви дам е, че когато не разбирате нещо е по-добре да го оставите в неговото състояние по подразбиране. Имате на разположение няколко инструмента за конфигуриране. Всъщност това са няколко make команди - по подробно за тях можете да прочетете в README файла към ядрото. Например ще ви оставя сами да разберете за какво служи командата make mrproper като точно тук е момента да я изпълните ако решите. Иначе първият класически инструмент за конфигуриране се стартира с

make config

Това е текстово базиран метод, който ще ви попита за абсолютно всичко въпрос след въпрос, което е страшно отегчително и ще ви отнеме ужасно много време.

make menuconfig

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

Третият се стартира с командата make xconfig и както може би се досещате предлага графичен интерфейс с бутони.

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

make oldconfig

Две думи как се работи с конфигураторите - за всеки елемент имате до три възможности - да го включите в ядрото, да го компилирате като външен модул, който ще се зарежда при boot-ване на ядрото или да не го компилирате въобще. В Linux обществото има спорове за това кое е по-добре - да имаме малко ядро с модули около него или да компилираме по-голямо ядро, включвайки модулите, които са необходими вътре в него. Истината винаги е някъде по средата. Трябва да прецените кое е необходимо да включите в ядрото и кое да оставите като run-time модул. Защото ако примерно имате по някаква причина две или три звукови карти, защо трябва да имате драйверите и за трите едновременно компилирани в ядрото - оставете ги на модули и зареждайте само този, който ви е необходим. Именно в това е силата на Linux - неговата гъвкавост.

След като сте конфигурирали ядрото трябва да изпълните последователно командите:

make dep
make clean
make bzImage

Вместо последната команда можете да направите make zImage, но тя ще направи gzip-компресия на ядрото, за разлика от първата, която компресира с bzip2 и дава като резултат много по-малко ядро.
На този етап не ви остава нищо друго освен да изчакате компилирането да приключи - това отнема различно време в зависимост от това, какави са изчислителните способности на компютъра ви. Добра идея е да следите за грешки по време на компилирането въпреки, че ако проблемът е серозен процесът просто ще спре. Ако компилирането на ядрото е преминало успешно трябва да направим същото и с модулите. Готовите модули след инсталация се разполагат в директория /lib/modules/<версия> в случая / usr/lib/2.2.14, ако обаче това не е първата компилация на това ядро е добра идея да преместим компилираните преди това модули на същото ядро, защото в противен случай ще ги препокрием. Например така:

mv /lib/modules/2.2.14 /lib/modules/2.2.14.backup

Сега отново в директория / usr/src/linux трябва да подадем командите:

make modules
make modules_install

Ако не сте получили някакви грешки можете да се поздравите - имате ново ядро.

 

Настройка на новото ядро

Току-що компилираното ядро се казва bzImage (или zImage) и ще го намерите в директория /usr/src/linux/arch/i386/boot (ако разбира се компютърът ви не е Intel PC съвместим вместо i386 там трябва да очаквате да има директория с името на вашата архитектура примерно alpha).
Най-напред да си запазим старото ядро - за него сме сигурни, че работи, докато новото още не сме го изпробвали - обикновено то се намира в директория / boot, където след малко ще преместим и новото. Да преименуваме старото ядро, както и стария System.map файл (за какво служи последния не е тема на настоящата статия) и да копираме новите. Ако органзацията на / boot директорията ви е със символични връзки т.е. System.map не е самия файл, а връзка, сочеща към истинския файл, който се казва по друг начин, както е в Red Hat Linux това би станало със следните команди:

cd /boot
rm /boot/System.map
rm /boot/vmlinuz
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-2.2.14
ln -s /boot/vmlinuz-2.2.14 /boot/vmlinuz
cp /usr/src/linux/System.map /boot/System.map-2.2.14
ln -s /boot/System.map-2.2.14 /boot/System.map

Ако във вашата дистрибуция нямате символични връзки трябва да направите нещо такова:

cd /boot
mv bzImage vmlinuz-2.2.9
mv System.map System.map-2.2.9
cp /usr/src/linux/arch/i386/boot/bzImage /boot
cp /usr/src/linux/System.map /boot

Ако вашата дистрибуция (напр. Red Hat) ползва initrd image той се получава с командата:

/sbin/mkinitrd /boot/initrd-2.2.14.img 2.2.14

Остава да конфигурираме boot-мениджъра LILO. За целта отворете файла /etc/lilo.conf с предпочитания от вас текстов редактор. Ще намерите фрагмент от файла, който е подобен на този:

image = /boot/vmlinuz-2.2.9-12
label = linux
initrd = /boot/initrd-2.2.9.img
read-only
root = /dev/hda1

Това е частта, която boot-ва вашето старо ядро - добре е да си го оставите за да можете да се върнете към него при необходимост. Ако сте преименували ядрото или initrd имидж-файла трябва да отразите промените съответно в реда image и initrd.

Трябва да добавите аналогичен фрагмент за новото ядро, който би изглеждал примерно така:

image = /boot/vmlinuz-2.2.14
label = new
initrd = /boot/initrd-2.2.14.img
read-only
root = /dev/hda1

Това е всичко - запишете файла / etc/lilo.conf и от командния ред изпълнете:

/sbin/lilo

 

Закърпване ” на ядрото ( patching)

Вместо да download-вате изцяло ново ядро можете да upgrade-вате старото си с така наречените patches. Обикновено patch файла е около 20-30 K и ще ви спести тегленето на мегабайти изходен код на новото ядро. Проблемът е, че patch-овете трябва да прилагате последователно т.е. за да преминем от ядро 2.2.9 до 2.2.14 са ни необходими patch-ове 2.2.10, 2.2.11, 2.2.12, 2.2.13 и 2.2.14, които трябва един по един и последователно да прилагаме към старите си сорсове. Имената на тези файлове изглеждат така patch-2.2.12, което означава, че това е upgrade за ядро 2.2.11 до 2.2.12.
За разлика от изходните кодове на самото ядро за patch-овете е без значение къде ще ги разположите важна е само директорията , от която подавате командите и тя трябва да е /usr/src

Всеки patch се прилага с командата:

gunzip -c patchfile | patch -p0

където patchfile е пълното име на patch-файла включително и пътя до него напр. / home/bobo/patch-2.2.11.

Можете да проверите дали patch-а е приложен правилно с командите:

find /usr/src/linux -follow -name “*.rej” -print
find /usr/src/linux -follow -name “*#” -print

Ако някоя от тези две команди върне като резултат някакви файлове по някаква причина някаква част от patch-а не е била приета както трябва. Ако не сте достатъчно наясно какъв е проблема единствения съвет, който мога да ви дам е да си download-нете ново ядро и да започнете отначало.

И накрая едно, може би, излишно уточнение, но все пак да не въведа някого в заблуда - тези patch-ове към ядрото са всъщност “кръпки ” към неговите изходни кодове т.е. към сорса на ядрото, а не към компилираното ядро т.е. след като приложим patch-овете не отпада следващия етап с компилирането на новото ядро.

 

8 юли 2000

Йовко Ламбрев