at.linux-FAQ

Kernel & Hardware



Wie baue ich einen Kernel?

The Linux Kernel HOWTO (2003): http://www2.uibk.ac.at/linuxdoc/LDP/HOWTO/Kernel-HOWTO.html

Das Linux Kernel HOWTO (1998): http://www.linuxhaven.de/dlhp/HOWTO/DE-Kernel-HOWTO.html

Das Linux Kernel HOWTO (1996): http://www.vipcom.de/linux/DE-Kernel-HOWTO.html

Der Kernel - Konfiguration: http://www.linuxfibel.de/kconf.htm

Ultrakurzfassung:

cd /usr/src/linux
make menuconfig
make dep modules modules_install install

Der schwierige Teil dabei ist die Kernel-Konfiguration. Wen man hier etwas vergisst oder falsch einstellt, bootet der resultierende Kernel nicht. Für die ersten Schritte ist es deswegen ratsam, auf die Default-Konfiguration der verwendeten Distribution zurückzugreifen. Einige Distributionen legen die Konfigurationsdatei zusammen mit Kernel-Image (und eventuell initrd) im Verzeichnis /boot ab.

ls /boot/config-*

Wenn das nicht hilft (etwa weil die Datei inzwischen gelöscht wurde) gibt es noch Sonderlösungen.

Kernel bauen unter Debian

Notwendige Pakete (abgesehen vom Kernel-Source):

apt-get install kernel-package gcc binutils libc6-dev

Die bevorzugte Methode ist die Erzeugung eines eigenen Kernel-Pakets. Das erleichtert die Archivierung und die Installation auf anderen Rechnern.

cd /usr/src/linux
make menuconfig
make-kpkg kernel_image
cd ..
dpkg -i kernel-image*.deb

Siehe auch http://newbiedoc.sourceforge.net/system/kernel-pkg.html

Kernel bauen unter SuSE

Nur zwei Pakete sind unabdingbar: gcc und der Kernelquellcode.

Dabei ist darauf zu achten, dass SuSE gewöhnlich drei verschiedene Kernels anbietet: Standardmäßig aktiviert ist ein spezieller SuSE-Kernel, der aus einem aktuellen Kernel zusammengebastelt ist, ferner gibt es einen aktuellen Release-Kernel, und einen aktuellen Experimental-Kernel.

Wenn Du nicht weißt, welcher der richtige für Dich ist, empfehlen wir dringend den aktuellen Release-Kernel.

Wieso meldet neuer Kernel unresolved symbols?

Ich hab gerade den Kernel neu kompiliert und kriege bei einem Neustart diese Fehlermeldungen: z.B. mit den Appletalk- und den PCMCIA-Modulen, die ich aber nicht habe, und daher auch nicht kompiliert sind.

Die Module in /lib/modules/`uname -r`/ passen (teilweise) nicht zu Deinem Kernel - nämlich genau die, die Du nicht neu kompiliert hast (weil Du sie nicht brauchst). Dagegen hilft es, (nach dem Anlegen einer Sicherheitskopie) vor dem Installieren der Module den Inhalt des entsprechenden Verzeichnisses zu löschen.

Wie patche ich den Kernelquellcode?

Im folgenden Beispiel patchen wir den Kernel 2.4.20 auf 2.4.21-pre6. Der Kernel ist entpackt und der Patch bereits herunter geladen. Nun wechseln wir in das Verzeichnis /usr/src/linux-2.4.20 und tippen folgenden Befehl ein (für einen komprimierten Patch):

cd /usr/src/linux-2.4.20
zcat /tmp/patch-2.4.21-pre6.gz | patch -p1 2> out

Der Parameter -p ist sehr wichtig! Er gibt an, wie viele Teile des Pfades, von dem aus der Patch erstellt wurde, entfernt werden sollen. Befinden wir uns z.B. im Verzeichnis /usr/src, so könnten wir als Parameter einfach auch -p0 angeben. Da man aber häufig mehrere Kernelversionen parallel hält, ist es empfehlenswert, in das gewünschte Verzeichnis zu wechseln und den Patch mit -p1 anzuwenden, um sicherzustellen, dass der richtige Quellbaum gepatcht wird.

Nach dem Patchen des Kernels muss dieser konfiguriert, kompiliert und installiert werden.

modprobe: can't locate module ppp-compress-2x

Vor kurzen sind mir folgende Einträge in meiner /var/log/messages aufgefallen:

modprobe: can´t locate module ppp-compress-21
modprobe: can´t locate module ppp-compress-24
modprobe: can´t locate module ppp-compress-26

Was meint modprobe damit?

In deiner /etc/modules.conf fehlen folgende Zeilen:

alias ppp-compress-21 bsd_comp
alias ppp-compress-24 ppp_deflate
alias ppp-compress-26 ppp_deflate

modprobe: can't locate module char-major-4

Vor kurzen sind mir ein paar Meldungen während des Bootens aufgefallen:

Configuring serial ports
ttyS0 at 0x03f8 (irq = 4) is a 16450
ttyS0 at 0x02f8 (irq = 3) is a 16450 
modprobe: modprobe: Can't locate module char-major-4

Das Programm setserial will die seriellen Schnittstellen konfigurieren und greift dazu auf /dev/ttyS* zu, und diese Gerätedateien haben die »major number« 4.

$ ls -l /dev/ttyS*
crw-rw----   1 uucp     uucp       4,  64 Jan 23 18:57 /dev/ttyS0
crw--w--w-   1 root     root       4,  65 Jan 20 19:51 /dev/ttyS1
crw-rw----   1 root     uucp       4,  66 Jul 29 14:48 /dev/ttyS2
crw-rw----   1 root     uucp       4,  67 Jan 23 19:14 /dev/ttyS3
                                   ^   ^
                                   |   |
                                   |   +--- minor device number
                                   +------- major device number

Der Kernel versucht also auf einen »character device driver« mit der »major device number« 4 zuzugreifen. Der ist aber nicht im Kernel registriert. Du hast diesen Treiber also nicht in den Kernel ein-kompiliert und auch nicht als Modul geladen. Daher versucht der Kernel modprobe aufzurufen und übergibt als Argument eine Beschreibung des fehlenden Treibers: char-major-4.

modprobe versucht dann dieses Modul zu laden, kann es aber nicht in /lib/modules/`uname -r`/ finden. Denn das Modul, das den »character device driver« mit der »major device number« 4 implementiert, heisst nicht char-major-4 sondern serial.o.

1. Variante: Unterstützung für die serielle Schnittstelle statisch in den Kernel übersetzen.

2. Variante: Unterstützung für die serielle Schnittstelle als Modul übersetzen, mit make modules_install nach /lib/modules/`uname -r`/ kopieren, und dann noch modprobe beibringen, dass es serial.o zu laden hat, wenn char-major-4 gefordert ist. Das geht mit der Zeile

alias char-major-4 serial

in /etc/modules.conf.

Wie kann ich libc5-Programme laufen lassen?

Auf meinem Rechner ist die libc6 installiert. Wie kann ich dennoch libc5-Programme ausführen?

Die »shared libraries«libc.so und libm.so müssen in der Version 5 installiert sein. Bei SuSE sind die im Paket shlibs5.

Gibt es Anleitungen zum Selberkompilieren?

http://www.linux-user.de/ausgabe/2004/06/028-configure/

Was haben die Zeilen mit ‐‐ MARK ‐‐ in /var/log/messages zu sagen?

Der syslogd loggt per Default alle 20 Minuten einen solchen Timestamp mit. Das kann ganz nützlich sein, um zu sehen, ob er noch korrekt arbeitet. Wenn man das nicht möchte, kann man den syslogd mit dem Kommandozeilenparameter -m 0 aufrufen (bzw. den Aufruf in den init-Scripten ändern), dann werden diese Timestamps unterbunden.

CD-ROM lässt sich nicht mounten

Der von Dir eingesetzte Kernel unterstützt das CD-ROM-Filesystem nach ISO 9660 nicht; daher musst Du den notwendigen Treiber nachladen. Fast alle Distributionen bieten mit dem Modul isofs.o aus dem Verzeichnis /lib/modules/`uname -r`/fs/ einen solchen an. Der Befehl modprobe isofs.o lädt das Modul. Wenn der Treiber nicht vorhanden ist, muss man einen neuen Kernel übersetzen, der das ISO-9660-Filesystem unterstützt.

umount: /cdrom: device is busy

Das Kommando umount /cdrom scheitert gelegentlich mit der Fehlermeldung umount: /cdrom: device is busy auch wenn scheinbar kein Programm mehr auf das Laufwerk zugreift. Ohne umount bleibt das Laufwerk gesperrt, so dass ich die CD nicht entnehmen kann.

Die Ursache für die Fehlermeldung ist in der Regel ein vom Benutzer vergessener Prozess, der noch eine Datei oder ein Verzeichnis der CD-ROM geöffnet hält. Dazu zählt auch ein Programm, dass gestartet wurde, während das aktuelle Verzeichnis auf der CD-ROM lag. Dieses dient dem Prozess dann als Arbeitsverzeichnis. Wenn man den Prozess beendet, sollte ein umount Erfolg haben.

Um herauszufinden, welche Prozesse auf ein Dateisystem zugreifen, kann der Befehl fuser -m /cdrom dienen. Dies liefert die Prozess-IDs aller betroffenen Programme. Nähere Details zur Benutzung von fuser erhält man auf der zugehörigen man-page.

umount: /dev/hdc is not in the fstab

Mein CD-ROM-Laufwerk lässt sich mit mount /dev/hdc /cdrom problemlos mounten. Das Kommando umount /dev/hdc scheitert aber mit der Fehlermeldung umount: /dev/hdc is not in the fstab (and you are not root). Ohne umount bleibt das Laufwerk gesperrt, so dass ich die CD nicht entnehmen kann.

Du willst doch nicht das Gerät freigeben, sondern das Verzeichnis! Also umount /cdrom.

Audio-CD ohne Kabel abspielen?

Ist es zwingend notwendig, zum Abspielen einer Audio-CD in einem DVD-Laufwerk dieses per Kabel mit der Soundkarte zu verbinden?

Die Alternative besteht darin, die Audiospur digital auszulesen und über die CPU an die Soundkarte zu schicken. Der einzige Grund, warum man das so machen will, ist ein schlecht zusammengebauter Rechner.

Direkte Ausgabe mit OSS-Treiber:

cdparanoia -ZpR 1- - | sox -t cdr - -t ossdsp /dev/dsp

Indirekte Ausgabe über esound:

cdparanoia -Z 1- - | esdcat

Floppy-LED als Dauerlicht

Nach einem Hardware-Umbau leuchtet die LED des Floppy-Laufwerks ständig.

Der geschilderte Fall ist kein Linux-spezifisches Problem. Offenbar wurde der Stecker des Floppy-Kabels um 180 Grad verdreht angeschlossen. Vorsicht: Solange die LED Dauerlicht zeigt, wird jede eingelegte Diskette gelöscht.

Wo finde ich Treiber für meinen Drucker? Wird mein Drucker unter Linux überhaupt unterstützt?

Das Drucker-HOWTO

http://www.linuxhaven.de/dlhp/
http://www.linuxhaven.de/dlhp/

The Linux Printing HOWTO

http://www2.uibk.ac.at/linuxdoc/LDP/
http://en.tldp.org/

http://www.linuxprinting.org/

Hauptspeicher wird nicht vollständig erkannt

Ich habe 128MB RAM in meinem Rechner, die vom BIOS beim Booten auch brav hochgezählt werden - aber Linux erkennt nur 64MB!

Du hast einen alten Kernel (< 2.0.36) und/oder ein fehlerhaftes BIOS. Ältere Kernel verwenden einen alten (aber »sicheren« BIOS-Aufruf, der aber aufgrund von x86-Register-Beschränkungen höchstens 64 MB RAM zurückmelden kann (64 MB war früher einmal viel RAM!).

Neuere Kernel verwenden einen Extended-BIOS-Call, der auch mehr als 64 MB zurückmelden kann. Allerdings ist die Implementation in manchen Motherboard/BIOS Kombinationen fehlerhaft, so dass auch hier nur 64 MB (oder ein anderer falscher Wert) zurückgemeldet wird.

Lösung: Entweder ein BIOS-Update (Achtung: Anweisungen des BIOS- bzw. Motherboard-Herstellers genauestens befolgen, ansonsten ist das Motherboard danach im schlimmsten Fall unbrauchbar) oder dem Kernel einen Bootparameter übergeben (und anschließend rebooten):

LILO

Die folgende Zeile in /etc/lilo.conf einfügen, danach /sbin/lilo ausführen. Für 128 MB RAM sieht das so aus:

append="mem=128M"
loadlin

Den folgenden Parameter in der Kommandozeile, der LINUX.BAT oder der LOADLIN.CFG angeben, danach neu starten. Für 192 MB RAM sieht das so aus:

mem=192M
GRUB

An die "kernel" Zeile einfach »mem=128M« in der GRUB-config-Datei anhängen (/etc/grub.conf oder /boot/grub/menu.lst), das sieht etwa so aus:

kernel /boot/vmlinuz root=/dev/hda2 mem=128M

top zeigt nur X KByte »free« an

Ich habe zwar 256 MB RAM in meinem Rechner, aber schon bei wenigen laufenden Anwendungen zeigt top an, dass der freie Hauptspeicher praktisch Null ist ist (... 3580K free, ...). Das kann doch nicht sein!

Ganz recht, ist auch nicht so. Verwende besser free, um herauszubekommen, wieviel freien Hauptspeicher du hast.

             total       used       free     shared    buffers     cached
Mem:        239464     236212       3252          0      10200     175100
-/+ buffers/cache:      50912     188552
Swap:       265032       2276     262756

Linux versucht, den Hauptspeicher möglichst sinnvoll zu nutzen. Und wenn es sonst keine Verwendung gibt, werden einmal gelesene Dateien in einem Cache gehalten. Könnte ja sein, dass die selbe Dateien noch einmal gebraucht werden. free zeigt im Gegensatz zu top beide Werte an. In diesem Beispiel ist 3252 kB die Menge an Speicher, die mit nichts belegt, also völlig frei ist. 10200 kB und 175100 kB sind mit nichts wichtigem belegt, also kurzfristig verfügbar. 3252 + 10200 + 175100 = 188552. Das ist die tatsächlich freie Menge an Speicher.

Was bedeuten diese ISDN-Fehlercodes in /var/log/messages?

man isdn_cause listet eigentlich alle Codes (und den Klartext dazu).

Wie ermittle ich die Ethernet-Adresse (MAC) meiner Netzwerk-Karte?

http://de.wikipedia.org/wiki/MAC-Adresse

Beim traditionelle Kommando ifconfig heißt das Stichwort »HWaddr« oder »Hardware Adresse«, je nachdem welche Sprache eingestellt ist.

/sbin/ifconfig eth0

Das mächtigere ip verzichtet auf mehrsprachigen Schnickschnack, das Stichwort lautet »link/ether«.

/sbin/ip link show eth0

Kann ich meinen Linux-Server ohne Tastatur booten?

Das erfordert manchmal eine Einstellung im BIOS, etwa

Halt On Errors: All But Keyboard

Bei einigen Rechnern (etwa von Compaq/HP) fehlt diese Option, sie bleiben dann bei jedem Neustart mit einer Kafkaesken Meldung hängen:

Keyboard error, or no keyboard present: Press F1 to continue.

Linux selbst hat kein Problem damit. Es gibt allerdings automagische Hardware-Erkennungsdienste wie kudzu (Red Hat), die unter Umständen ähnlich dumme Fragen stellen.