Generelt ======== * Alt hvad der siges i aften handler om Linux på Intel platformen. Hvorfor ? ========= * Distributions-kernerne fungerer glimrende for langt de fleste Linux brugere * De er oven i købet testet, så man kan være rimelig sikker på at der ikke er alvorlige fejl i dem - det er standard-versionerne ikke. * Måske mangler man en speciel driver ... * eller man vil hjælpe med at debugge den nyeste kerne-version ... * eller man vil vise at man er NØRD * Nogle roder med biler - andre roder med Linux Ingredienser ============ * kernel source 2.4.17 * gcc - 2.95.3 (FSF), 2.96.74 (Red Hat). 3.0.3 virker, men ... Virker ikke: 2.7.2.3, egcs (frarådes), pgcc * binutils - NB: Nyeste debian (unstable) defekt, brug min. 2.11.92.0.7.1 Debian bug 116041 * make - 3.77 eller nyere * tar, gzip, bzip2, bash, fileutils (rm m.fl.) * Tcl/Tk hvis man bruger xconfig Nødvendig for visse drivere (typisk firmware-assembler): * perl * db as86 (16-bit assembler fra dev86) er ikke længere nødvendig! (kræves af 2.2 kerner, og ældre 2.4.x kerner). Nyttige: * patch * diff Check Documentation/Changes filen ! Nødvendig viden =============== * Hvilken hardware er der i maskinen ? - /proc/cpuinfo - /proc/meminfo - /proc/pci /sbin/lspci - lsmod samt /etc/modules.conf - output fra seneste bootup (dmesg, /var/log/boot.log) - Windows' "Device Manager" - Luk maskinen op og kig efter! * Hvilke filsystemer benyttes ? - ext2, ext3, reiserfs er de mest almindelige - check /etc/fstab - cat /proc/filesystems * Hvordan fungerer boot-loaderen ? - Som regel LILO, d.v.s. kig i /etc/lilo.conf Generelt ======== Det er IKKE nødvendigt at lave sin kerne i /usr/src/linux/ !! Faktisk er det ikke særlig smart ... include-filerne i /usr/src/linux/include/ bruges i sjældne tilfælde til at oversætte user-mode programmer med, og de skal helst passe til den libc-version som er i brug. Det er IKKE nødvendigt at være root for at lave en kerne !! Undtagen til sidst, når man installerer den og konfigurerer boot-loaderen. Udpakning ========= mkdir ~/kernel cd ~/kernel tar zxvf ~/download/linux-2.4.17.tar.gz cd linux Konfiguration ============= Hans sagde "over 600 options". Det faktiske tal er 2288 dokumenterede options i 2.4.17. Mange options er dog relateret til specifikke drivere eller arkitekturer, så en typisk Intel-PC bruger nok omkring 600-700 options. * make config - textmode, meget simpel * make menuconfig - textmode, men med vinduer * make xconfig - X11 program Der er ingen forskel på hvad man kan med de forskellige værktøjer. * make oldconfig - brug en eksisterende konfiguration Resultatet af filen ligger i ".config". Default værdier tages fra ".config", eller - hvis den ikke findes - så fra arch/i386/defconfig defconfig filen stammer fra Linus' eget system. Man kan sagtens gemme en .config fil til senere brug - det er faktisk en god ide, hvis man ikke vil gå igennem hele konfigurations- processen hver gang. Eller hvis man laver kerner til flere forskellige systemer. MODVERSIONS * gør at moduler kan "gen-bruges" fra en kerne-version til den næste * navne påhæftes en checksum, dannet ud fra type og funktions-parametre * er slået TIL i de kerner, som de fleste distributioner shipper * er sjældent nødvendig med mindre man bruger proprietære kerne-moduler * hvis man ændrer denne parameter SKAL man køre "distclean; config; dep" * DO NOT MIX ! Enten med eller uden, ikke moduler af begge slags. SMP * multi-processor support * Ændring kræver re-compile af hele kernen (make clean) CPU-type * "386" virker på alle Intel-baserede cpu'er * andre typer virker som hovedregel KUN på den cpu, de er beregnet til men har til gengæld processor-specifikke optimeringer. * Hvor stor forskel ? Nogle få procent, afhængig af workload. * Ændring kræver re-compile af hele kernen (make clean) Power Mgmt * Kan virke godt eller skidt - afhænger meget af BIOS. Hvis kernen opfører sig "underligt" i.f.m. suspend, reboot o.lign. så prøv at slå det fra. * ACPI - ikke særlig stabilt, svjv. Meget kompleks Intel spec. Plug and Play * P.t. kun nødvendig for ISA PnP. PCI-kort er også "plug'n'play", men fungerer fint uden denne support. * ISA PnP kort skal stadig konfigureres med isapnp programmet Ram disk * Hvis du konfigurerer drivere der skal bruges under boot som moduler, SKAL du enable ramdisk og initial ram disk support Packet socket og Unix domain sockets * Lav dem built-in, selv om de kan konfigureres som moduler. De kan *ikke* auto-loades. Virtual terminal / Support for console on VT * Slå dem til ! Ellers kan maskinen ikke boote, da den ikke har nogen konsol. Man kan bruge en seriel konsol (hvis det enables senere), men almindeligvis er den jo altså på skærmen. Unix98 PTY support * Bruges f.eks. til netværks-terminaler (telnet, ssh). Slå det til. Den lange ventetid ================== * make bzImage I gamle dage var det "make zImage". Begge danner de en gzip-komprimeret kerne med en real-mode de-compressor "stub" vedhæftet. Forskellen ligger i den måde kernen udpakkes i RAM; zImage formatet lægger en begrænsning på størrelsen af kernen, mens bzImage kan bruge al RAM. Den eneste grund til at bruge zImage, er hvis man har en gammel bootloader som ikke forstår bzImage formatet. * Filen ligger i arch/i386/boot/bzImage !! vmlinux filen er en midlertidig fil (ukomprimeret, uden de-comp. stub'en) som ikke kan bootes. * Hvis den stopper med en fejl Noget med "internal compiler error - signal 11" er i 99% af tilfældende hardware-problem, oftest dårlig RAM eller over-clocked/dårligt kølet CPU Andre fejl kan være en regulær bug. Prøv "make clean" og oversæt igen. Stopper den det samme sted, har du nok fundet en fejl. Modulerne ========= * Disk drivere og filsystem-kode bør ikke være i moduler * Overvej om det er fornuftigt at bruge moduler overhovedet - der er lidt overhead i et modul kontra built-in drivere (ca. 5%) * make modules Installation ============ * Lav en boot-diskette: mkbootdisk - og prøv den ! * Kopier kerne filen et fornuftigt sted hen. Ofte er det /boot/ - giv filen et unikt navn, så man kan se hvad det er for en version. vmlinuz-2.4.17 * System.map-filen kan lægges samme sted - System.map-2.4.17 * Ret /etc/lilo.conf *TILFØJ* en ekstra sektion, så du beholder den gamle, fungerende kerne. Der er intet så kedeligt som at se at den nye ikke virker, og så opdage at nu kan man ikke komme tilbage til den gamle. * Kør lilo * Tidligere: cat arch/i386/boot/bzImage >/dev/floppy, boot fra floppy Virker stadig, men der er grænser for bzImage filens størrelse * Husk at installere modulerne: make modules_install Initial RAM disk ================ * mkinitrd Bruges til at loade moduler INDEN rod-filsystemet kan access'es. F.eks. moduler til disk-controllere eller rod-filsystem. initrd filen loades ind i memory af bootloaderen, og fungerer som rod-filsystem indtil det rigtige filsystem monteres. * initrd-filen skal stå i lilo.conf * Nemmere at konfigurere disse ting statisk i kernen. Opgradering / patching ====================== * Hvis man har downloadet en fuld source, så kan man nøjes med patches * Patches er tekstfiler genereret med "diff -u" diff -Naur -X /home/marcelo/lib/dontdiff linux.orig/CREDITS linux/CREDITS --- linux.orig/CREDITS Tue Jan 15 22:07:12 2002 +++ linux/CREDITS Mon Jan 14 17:27:23 2002 @@ -525,6 +525,16 @@ S: Bellevue, Washington 98007 S: USA +N: Christopher L. Cheney +E: ccheney@debian.org +E: ccheney@cheney.cx +W: http://www.cheney.cx +P: 1024D/8E384AF2 2D31 1927 87D7 1F24 9FF9 1BC5 D106 5AB3 8E38 4AF2 +D: Vista Imaging usb webcam driver +S: 314 Prince of Wales +S: Conroe, TX 77304 +S: USA + N: Stuart Cheshire E: cheshire@cs.stanford.edu D: Author of Starmode Radio IP (STRIP) driver * For at installere dem: cd ~/kernel/linux-2.4 zcat ~/downloads/patch-2.4.18-pre3.gz | patch -s -p1 * "-p1" betyder at der strippes 1 directory-niveau fra filnavnene i patch filen. D.v.s. patchen til "linux/CREDITS" udføres på filen "CREDITS" * Det er smart at installere patches mens man står i kerne-directoryet. Så kommer man ikke til at apply'e sin patch til de forkerte filer... * Efter patch: make oldconfig; make dep; make bzImage; make modules * Efter patch fra een kerne-version til den næste: make clean * Hvordan ser man hvilken version af sourcen man har ? Kig i top-level Makefile : VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 18 EXTRAVERSION = -pre4 Altså her: 2.4.18-pre4 Hvis man selv laver ændringer ============================= * Du har den originale kerne i linux-2.4.17.orig/ * Du har lavet dine rettelser i linux-2.4.17.henrik/ * Kør "diff -urN linux-2.4.17.orig/ linux-2.4.17.henrik/ >henrik.diff" Det er en god ide at køre "make distclean" først, for at fjerne alle de midlertidige filer som genereres når man oversætter kernen. * Du har nu en patch-fil, som kan bruges til at gen-danne dine ændringer, også i en senere kerne-version. * Hvis du vil have dine ændringer med i den officielle kerne, så send en mail med ændringerne i til linux-kernel@vger.kernel.org NB: Linus hader attachments - send dem "inline". Husk en forklaring af, hvad det gør og hvorfor det er en god ide. Docs ==== * linux-kernel@vger.kernel.org - majordomo@vger.kernel.org * linux-kernel FAQ http://www.tux.org/lkml/ * Arkiv: http://marc.theaimsgroup.com/ * Ugentlig opsummering: LWN Kernel section, http://lwn.net/ * Kernel HOW-TO - http://mirrors.sunsite.dk/ldp/HOWTO/Kernel-HOWTO.html