
Guide/artikel til konkurrencen på hjemmesiden http://www.linuxin.dk
Jeg vil i følgende artikel komme ind på begrebet at compile en kerne. Jeg vil komme ind på hvad en kerne er; og hvad den laver på en pc.
Alle kan naturligvis læse denne artikel/guide om emnet, men primært henvender den sig til brugere som har installeret deres første GNU/Linux distribution. De sidder måske og ønsker at komme et skridt videre derfra hvor de står nu. Dette skridt kan være at compile sin egen kerne. Det er således kerne compilering denne artikel tager udgangs punkt i. Jeg vil komme ind på nogle af de tekniske begreber i forbindelse med kernen og dens funktion i computeren.
Men lad os da komme igang så.
1.Som mange nok ved er Linux en kerne som er skrevet af finnen Linus Thorvalds, fordi han var interesseret i at lave et gratis alternativ til Unix. Den software de fleste Linux distributioner distribueres med er software som er licenseret under GPL licensen, såkaldt GNU software oftest. GNU projektet er kortsagt et forsøg på at lave et gratis operativ system. Da Linux kernen er gratis/fri var det et oplagt valg at benytte den kerne sammen med GNU software. Heraf burde et operativ system baseret på Linux kernen altid kaldes GNU/Linux, da det sådan set er GNU softwaren som gør det muligt at bruge Linux kernen til noget fornuftigt. Meget groftsagt.
2.Hvad er en kerne i operativ system sammenhæng? Operativ systemet i overordnet sammenhæng er det som gør det muligt at benytte hardwaren i computeren. Et operativ system består basalt set af:
Kernen som håndterer de kørende programmer, hukommelses styring, filsystemet, I/O altså kommunikationen med hardwaren i maskinen. Ovenpå kernen har vi i unix/linux sammenhænge et standard bibliotek som indeholder rutiner til de mest basale ting så som, åbne, lukke, læse og skrive. Det er herfra der laves system kald til kernen. Et niveau længere oppe har vi standard værktøjerne som, shells, editore, oversættere o.s.v. Derefter har vi brugeren som kan håndtere de værktøjer der er til rådighed, de kan stilles til rådighed for brugeren via et grafisk interface eller et tekst baseret interface som kaldes en shell. Man kan via et af de to interfaces starte forskellige af de standard programmer som ligger i standard biblioteket, f.eks. filkopiering eller lign.
Se figur 1 for et blok diagram og over det grundlæggende i det jeg lige har gennemgået.
Figur 1.
3.Det næste vi lige mangler er at beskrive hvorfor kernen skal compiles.
Grunden til det er at kernen har den direkte kommunikation med hardwaren. Data kommunikation i hardware og digital elektronik sker binært. Det binære talsystem består af 0 og 1, eller det der svare til tændt eller slukket. Førend vi har mulighed for at bede om at skrive til en harddisk skal vi altså have et stykke værktøj som lader os gøre det. Her kommer harddisk controlleren ind i billedet, via den kan vi skrive til disken. Men vi kan ikke umiddelbart kommunikere med harddisk controlleren. Det kan kernen, den kan modtage et system kald fra vores standard bibliotek og bede controlleren gemme nogle bits på en bestemt addresse fysisk på harddisken. Det er naturligvis gjort ved hjælp af et filsystem som igen er bindeledet mellem kernen og den fysiske struktur på harddisken. Uden at komme alt for teknisk ind på det, er det hvad der sker. Kernen er altså i princippet den direkte forbindelse mellem hardwaren og softwaren. Når man så skriver noget software til operativ systemet gør man brug af de standard funktioner som man har til at kommunikere med hardwaren gennem kernen.
Kernen skal altså oversættes fra noget programmerings kode til maskin kode, altså binær kode som hardwaren kan forstå for at kunne tjene til de tiltænkte formål.
Det var lidt grudlæggende omkring funktionen af Linux kernen eller unix kerner generelt om man vil.
Når det er sagt kommer vi sådan set til det primære hvordan man rent faktisk oversætter en kerne til sit system.
Når man skal oversætte sin kerne skal man vælge de funktioner man ønsker sin kerne skal have. F.eks. support for et specifikt lydkort, eller en speciel harddisk controller.
Et andet begreb som skal introduceres i forbindelse med kerne håndtering og oversættelse er et såkaldt kerne modul eller loadbare moduler. Med et modul får man muligheden for at tilføje kernen funktioner mens den kører. Hvor imod man skulle oversætte hele kernen og genstarte maskinen for at få en pågældende funktion hvis ikke man tilføjede funktionen via et modul. Et kerne modul kan indeholde mange funktioner, oftests er det dog tilføjelsen af en kerne funktion i forbindelse med en enheds driver, filsystem eller system kald.
Det vil sige at man får muligheden for at tilføje ekstra funktioner til en kørende kerne, eller fjerne eksisterende funktioner fra den kørende kerne.
Jeg vil ikke komme yderligere ind på begrebet moduler, da det i denne sammenhæng ikke har synderlig betydning.
Inden man går igang med at oversætte en kerne er det en god idé at undersøge hvilken type hardware man har i sin maskine. Harddisk controller, chipsæt på bundkortet, cpu, lydkort, netkort og andre hardware enheder man måtte have i sin maskine.
Det er også en god idé at undersøge om bundkortet undersøtter apm eller acpi strømstyrings typerne.
Jeg vil prøve og lade min egen maskine indgå som eksempel på en kerne oversættelse.
Det er en laptop som kører Gentoo GNU/Linux. Hvilken distribution der er benyttet er i princippet ligegyldigt da vi ikke gør brug af nogen distributions specfikke metoder til at oversætte en ny kerne. F.eks. har Debian GNU/Linux distributionen nogle værtøjer som måske for nogen er med at lette en kerne oversættelse. Det er dog heller ikke noget jeg vil komme ind på her;
Hvis man har en maskine hvor man har installeret en distribution og man ønsker specifik information om hardwaren kan man køre flere kommandoer fra en shell:
# dmesg
# dmesg | more (så har man muligheden for at nå og se hvad der sker)
# lspci
Disse to kommandoer vil give en en masse informationer omkring hardwaren i maskinen. For at få lov at kører lspciskal man være superbruger.
# su
password
# lspci
Jeg har vedlagt resultatet af min egen lspci for at give et syn på hvordan det kan se ud og hvilke informationer man får ved nævnte kommando.
Som man måske kan se giver det et rimelig godt billede af hardwaren i maskinen.
Det skal lige siges at cpu'en i maskinen er en: Athlon XP mobile 1600+ m/ PowerNow.
Så er vi klar til at gå igang, det første som vi gør er at hente kerne sourcen. I dette tilfælde vil jeg oversætte 2.6 kerne. Inde på kernel.org finder jeg den kerne jeg vil bruge:
http://mirrors.sunsite.dk/kernel/kernel/v2.6/linux...
Filen kan hentes direkte ved at man i en shell skriver:
# wget http://mirrors.sunsite.dk/kernel/kernel/v2.6/linux...
Filen er hentet hjem i min brugers hjemme mappe og ligger derfor her:
# /home/arnbak/linux-2.6.4.tar.bz2
Her vil jeg dog ikke pakke den ud. Derimod vil jeg gerne have den liggende i
/usr/src/ biblioteket. Men før jeg kan kopiere den derhen skal jeg lige være superbruger. Skiftet til superbruger gøres sådan:
# su
password:
Jeg indtaster nu mit password for superbrugeren og har nu rettigheder til at kopiere filen til den ønskede placering. Resten af tiden laver jeg arbejdet som superbruger.
Filen kopieres:
# cp /home/arnbak/linux-2.6.4.tar.bz2 /usr/src/
Således ligger filen i /usr/src/ biblioteket. Det næste der skal ske er at koden skal pakkes ud. Dette gøres med denne kommando:
# tar xvfj /usr/src/linux-2.6.4.tar.bz2
Således har jeg pakket filerne ud, de ligger nu placeret i /usr/src/linux-2.6.4
Da mange af de applikationer som benytter kernen kigger efter kerne filerne i
/usr/src/linux er det en god idé lige at lave et symbolsk link fra linux til linux-2.6.4. Det gøres sådan:
# ln -sf /usr/src/linux-2.6.4 /usr/src/linux
På den måde ryger man i biblioteket med filerne til 2.6.4 kernen hvis man prøver at hoppe i /usr/src/linux.
Så er vi klar til at starte konfigurationen af kernen, tilføje og fjerne support for hardware o.s.v.
Der er flere værktøjer til at gøre dette. Et af dem er make xconfig, hvor man får et fint grafisk frontend til kerne konfigurationen. Jeg selv foretrækker at bruge det der hedder menuconfig. Her forgår konfigurationen via en ncurses genereret menu.
Når man compiler kernen har man muligheden for at vælge om en funktion skal compiles som modul eller direkte i kernen. Dette ser sådan ud hvis funktionen er den del af kernen [*] eller <*>, hvis det er som et modul ser det sådan ud .
# cd /usr/src/linux/
# make menuconfig
Man får sådan en menu at se ved denne kommando (se illustration):
1.punkt i hoved menuen
Code maturity level options --->
Her gør du det muligt at tilføje nogle af de drivere til din kerne som måske ikke er 100% stable, dvs. du kan opleve ustabile drivere, men hvis ikke du vælger at tilføje dette punkt er det muligt der ikke er nogle drivere til din hardware (specielt hvis du har noget specielt hardware).
Min konfiguration ser således ud:
2.punkt i hoved menuen
General setup --->
Her er der ikke nødvendigt at pille ved noget med mindre man har nogle specielle behov. Hvis man gerne vil kan man lige fjerne support for embedded systemer:
[*] Remove kernel features (for embedded systems) --->
3.punkt i hoved menuen
Loadable modules support --->
Her skal du tilføje muligheden for at loade moduler mens kernen kører; dvs. funktioner til en kørende kerne som tidligere beskrevet. Det er en god ting at have mulighed for. Så det har jeg også i min kerne.
4.punkt i hoved menuen
Processor type and features --->
Her begynder konfigurationen for de fleste at blive lidt mere specifik. Under dette punkt skal man vælge hvilken cpu man har; om der skal være support for smp og andre ting:
Da min maskine må betegnes som en pc, har jeg valg (X) ved pc-compatible.
Under menupunktet Subarchitecture type (pc-compatible)
Under punktet Processor family; har jeg valgt Athlon/Duron/K7 da det jo er en cpu i denne familie som sidder i min maskine!
Ellers har jeg [*] ved følgende:
5.punkt i hoved menuen:
Power management options (ACPI, APM) --->
Her vælges de forskellige options for enten ACPI eller APM strømstyrings funktionerne. Du skal vælge her det der svarer til funktionerne i din maskine. Min bærbare understøtter acpi derfor har jeg valgt de funktioner som understøttes.
6.Punkt i hoved menuen:
Bus Options (PCI, PCMCIA, EISA, ECA, ISA) --->
Under dette menupunkt har jeg som sådan ikke tilføjet noget i min konfiguration. Jeg har en PCMCIA port i min bærbare men bruger den ikke, og har derfor ikke compilet support for den med i kernen.
Man kan ellers fint klare sig med den standard indstilling der allerede er valgt.
7.Punkt i hoved menuen:
Executable file formats --->
Her under har jeg [*] ved all punkterne.
8.Punkt i hoved menuen;
Device Drivers --->
Dette menupunkt er nok et af de vigtigste under kernel compillingen. Herunder vælger man drivere til usb controlleren, lydkort, scsi kort, ide controllere o.s.v.
Det er først ved punktet Parallel port support ---> jeg vælger opsætning. Jeg bruger parallel porten på denne maskine til printeren og ønsker selvfølgelig support for denne.
Under Parallel port support ---> har jeg følgende:
[*]Parallel port support
<*> PC style hardware
[*]Support foreign hardware
Plug and Play support ---> Jeg har support for dette:
[*] Plug and play support
Block devices --->
Her har jeg valgt at have support for floppy disks, og loopback devices:
<*>Normal floppy disk support
<*>Loopback device support
ATA/ATAPI/MFM/RLL support ---> Under dette punkt vælges support for ide controlleren i maskinen:
For mit vedkommende er det en VIA82CXX der skal vælges:
Muligheden for at vælge denne ligger under:
<*> VIA82CXX
Resten skal selvfølgelig tilpasses specfikt til den pågældende maskines hardware.
De næste punkter har jeg ingen brug for i min opsætning så de er fjernet fra kernen:
Det næste punkt hvor jeg skal konfigurere til mit behov er under:
I20 support --->
Her under er det alt sammen compilet som moduler.
Det næste jeg skal til at sætte op nu er netværks kortet:
Networking support ---> Det er også herunder man vælger om kernen skal indeholde support for iptables og andre netværks funktioner. Men da denne maskine ikke har en funktion som netværks router, firewall eller andet skal jeg ikke konfigurere til dette.
Netkortet i maskinen er et Via-Rhine 100 mbit netkort, support for dette vælges derfor under menupunktet Ethernet (10 or 100 mbit) --->
Det var konfigurationen til netværkskortet, næste punkt hvor der skal tilføjes nogle funktioner er: Character Devices --->
Under dette punkt vælger jeg support for virtuel terminaler og Unix98 pty support, samt parallel printer support.
[*]Virtuel Terminal
[*]Support for console virtual terminal
[*]Unix98 pty support (gentoo specifikt)
[*]Parallel printer support
Længere nede har jeg muligheden for at vælge support for agp, samt tilhørende drivere til mit bundkort. Det ønsker jeg selvfølgelig:
<*> /dev/agpgart (AGP support)
<*>VIA chipset support
Næste punkt hvor der skal configureres drivere er ved menupunktet Sound --->
Her under vælger jeg Advanced Linux Sound Architecture --->
Under PCI devices ---> vælger jeg support for det lydkort der er i maskinen:
<*> Via 82C686A/B, 8233 south bridge
Sidste punkt hvor der skal konfigureres er under punktet USB Support --->
Herunder vælger jeg kun support for USB og driveren til den controller jeg har i maskinen, samt support for HID:
<*>Support for USB
<*>UHCI HCD
<*>USB Human interface Device (full HID) support
Det var det, jeg hopper nu ud til hoved menuen.
Nu er det sidste jeg mangler bare at konfigurere under menupunktet
File Systems --->
Det er herunder man har muligheden for at vælge hvilke filsystemer kernen skal understøtte f.eks. fat32 hvis man ønsker at kunne læse et windows drev.
Da jeg kun bruger Reiserfs fil systemet i min maskine er det deteneste jeg vælger. Der udover vælger jeg også kernel automounter support:
<*>Reiserfs support
<*>Kernel automounter version 4 support
Under CD-ROM/DVD filesystems vælger jeg det hele.
Under DOS/FAT/NT filesystems vælger jeg support for fat32, da jeg har en fat32 partition i maskinen.
Under Pseudo Filesystems ---> skal jeg enable nogle gentoo specifikke ting:
De næste par punkter efter Pseudo filesystems springer jeg over, da jeg ikke har behov for nogle af de funktioner som der kan tilføjes under disse.
Det sidste punkt jeg vælger er Native Language support --->
Her skal der vælges hvilke sprog kernen skal understøtte. Min konfiguration ser således ud:
Det var det, jeg hopper ud til hoved menuen igen. Hvis jeg ønskede support for f.eks. kryptering ville jeg have muligheden for at konfigurere det under punktet
Cryptographic options --->
Jeg har dog ikke flere funktioner jeg skal ha tilføjet til kernen og vælger derfor at lukke konfigurationen ved at vælge punktet < Exit >. Jeg siger ja til at gemme kerne konfigurationen. Den konfiguration jeg har lavet er nu at finde i .config filen. Denne fil kan genbruges senere til en ny kerne compilling, således slipper man for at skulle konfigurere kernen igen.
Nu er kernen konfigureret til vore ønsker og kan derfor oversættes til maskin kode. Dette gøres sådan:
# make all
Med denne kommando startes oversættelsen, her bliver alt oversat.
Man kan vælge og bruge følgende kommandoer også:
# make
# make modules
# make modules_install
Dette er det samme som første kommando bare delt op.
Hvis man har en kørende kerne og man ønsker en funktion, kan den som før nævnt tilføjes via et modul. Hvis man ønsker det vælger man selvfølgelig den funktion man ønsker. Vælger den som modul, gemmer konfigurationen.
Hernæst skrives:
# make modules
# make modules_install
Nu kan man så modprobe eller insmodde det modul man har oversat:
# modprobe
Når man er færdig med at compile sin kerne har man en fil liggende som hedder bzImage. Denne fil ligger i /usr/src/linux/arch/i386/boot/ biblioteket. Den skal kopieres til mappen /boot/ hvor bootloaderen leder efter filen.
# cp /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage
Dernæst skal der henvises til den rigtige fil i boot loaderens konfigurations fil. Jeg bruger bootloaderen lilo, dennes konfigurations fil ligger i /etc/lilo.conf.
Følgende tilføjes i lilo.conf for at bruge den bzImage fil vi lavede under kernel compillingen:
image = /boot/bzImage
root = /dev/hda1
label = VoresKerne
read-only
For så at opdatere lilo skal denne lige køres:
# lilo
Added Gammelkerne*
Added VoresKerne
Det var faktisk det der skulle til, nu er vi færdige med oversættelsen og klar til at reboote maskinen.
# reboot
Kilder: Personlig erfaring, google og bogen Modern Operating Systems af Andrew S. Tanenbaum (ISBN 0-13-092641-8)