• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Kernel-Meldungen

mag82

Newbie
Ich habe folgendes Problem:

Ich möchte das popelige "Hello World"-Modul aus dem "Linux Device Drivers 3"-Buch auf meinem System (Suse 10.1 64 Bit) testen. Das Laden/Löschen des Moduls funktioniert anscheinend auch, jedoch werden die beiden Kernel-Meldungen(printk(...)) nicht auf der Konsole ausgegeben.
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

Natürlich ist mir nicht entgangen, dass in dem Buch Lösungsmöglichkeiten für das Problem angegeben sind. Ich habe also folgendes probiert:

1. klogd killen und mit klogd -c 8 neu starten, damit alle Kernel-Meldungen auf der Konsole ausgegeben werden.
-> klappt nicht

2. # echo 8 > proc/sys/kernel/printk soll den gleichen Effekt haben. Bei mir gibt es beim Laden/Löschen des Moduls trotzdem keine Ausgabe von "Hello, world" oder "Goodbye, cruel world" auf der Konsole.

Ich habe irgendwo gelesen, dass Suse als einzige Linux-Distribution Kernel-Meldungen unterdrückt. Wie kann ich das ändern?

Ich hoffe, jemand kann helfen!
 

abgdf

Guru
Hallo,

erstmal: Wie hast Du das denn kompiliert ?
Bei mir spuckt gcc schon bei

Code:
#include <linux/init.h>
#include <linux/module.h>

int main()
{}

jede Menge Fehlermeldungen. Oder hast Du den Code irgendwie anders als Modul eingebunden ?

Viele Grüße
 
OP
M

mag82

Newbie
abgdf schrieb:
Hallo,

erstmal: Wie hast Du das denn kompiliert ?
Bei mir spuckt gcc schon bei

Code:
#include <linux/init.h>
#include <linux/module.h>

int main()
{}

jede Menge Fehlermeldungen. Oder hast Du den Code irgendwie anders als Modul eingebunden ?

Viele Grüße

Ich benutze folgendes Makefile:

Code:
obj-m := hello_mod.o
KDIR := /lib/modules/`uname -r`/build
PWD := $(shell pwd)

default:
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
	$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules_install

clean:
	rm -rf .*.cmd *~ *.o *.ko .tmp_versions *.mod.c

Die Einrückungen sind Tabs, keine Leerzeichen. Die Quelltextdatei muß "hello_mod.c" heißen und sich im gleichen Ordner wie das Makefile befinden.

Das Problem liegt nicht beim Kompilieren. Kommilitonen von mir benutzen andere Linux-Distributionen und haben die Probleme nicht. Es scheint also ein Suse-spezifisches Problem zu sein. Kernel Messages werden anscheinend einfach nicht auf der Konsole ausgegeben.
 
OP
M

mag82

Newbie
Ok, Ich habe jetzt folgende unbefriedigende "Lösung" gefunden:

Nachdem ich mein Modul mit "# insmod ./hello.ko" in den Kernel geladen habe, bzw. mit "# rmmod hello" aus dem Kernel gelöscht habe, sehe ich die Kernel Messages indem ich mir mit "dmesg" den Inhalt des Kernel Ring Buffers anzeigen lasse.

Wie ich mir Kernel Messages unter Suse direkt auf der Konsole ausgeben lassen kann, ist mir aber weiterhin ein Rätsel.
 
Obwohl an dem Makefile nichts falsch ist (clean: könnte besser sein) schau dir mal das Beispielpaket http://jengelh.hopto.org/f/oops_ko.tar.bz2 an.
 

abgdf

Guru
Also gut,

das Kompilieren hat jetzt auch bei mir geklappt (nach Installation der Kernel-Sourcen) (das mit den Makefiles muß ich noch lernen, kennt einer einen guten Link zu einem Tutorial dazu :mrgreen: ?).

Kernelmeldungen werden (neben dmesg) ja auch nach

Code:
/var/log/messages

geschrieben.

Probier aber doch noch mal Folgendes:
Wechsele in eine Textkonsole, zum Beispiel mit STRG+ALT+F2.
Logge dich dort als root ein und mach

Code:
klogconsole -l8 -r0

Dann probiere es nochmal mit

Code:
insmod hello_mod.ko

:cool:, oder ?

Viele Grüße
 
abgdf schrieb:
Also gut,

das Kompilieren hat jetzt auch bei mir geklappt (nach Installation der Kernel-Sourcen) (das mit den Makefiles muß ich noch lernen, kennt einer einen guten Link zu einem Tutorial dazu :mrgreen: ?).
/usr/src/linux/Documentation/kbuild/ der ganze Ordner!
Code:
klogconsole -l8 -r0
Dann probiere es nochmal mit
Code:
insmod hello_mod.ko
:cool:, oder ?
Ja, das ist am hilfreichsten. Verschiedene Distributionen lenken die Ausgabe verschieden um. Bei SUSE normalerweise so: Kernel-Meldungen selber werden auf der VC unterdrückt, oder werden irgendwie auf eine zufällige VC geschickt (passiert mir irgendwie manchmal). Die Meldungen werden dann generell nur über /proc/kmsg bereitgestellt, wo sie dann von syslog gelesen und auf tty10 geschrieben werden.
 
OP
M

mag82

Newbie
abgdf schrieb:
Probier aber doch noch mal Folgendes:
Wechsele in eine Textkonsole, zum Beispiel mit STRG+ALT+F2.
Logge dich dort als root ein und mach

Code:
klogconsole -l8 -r0

Dann probiere es nochmal mit

Code:
insmod hello_mod.ko

:cool:, oder ?

Viele Grüße

Danke! Das ist eigentlich, was ich wissen wollte.
 
Oben