PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kernel-Module kompilieren (bonding) schlägt immer fehl



hannesd
27.05.09, 09:22
Hallo allerseits

Ich habe ein openSUSE 11.1-System (2.6.27.21-0.1-pae), mit installiertem Bonding-Treiber (Version 3.3.0). Der neue Kernel (2.6.29) hat eine neue Version des Bonding-Treibers verfügbar (3.5.0). Ich habe nun die Kernel-Source heruntergeladen und entpackt. Dann folgendes Makefile erstellt:


opensuse:/tmp/linux-2.6.29/drivers/net/bonding # cat Makefile
#
# Makefile for the Ethernet Bonding driver
#
obj-m := bonding.o
bonding-objs := bond_main.o bond_3ad.o bond_alb.o bond_sysfs.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean


Das Kompilieren mit "make" schlägt jedoch immer mit folgender Fehlermeldung fehl:


opensuse:/tmp/linux-2.6.29/drivers/net/bonding # make
make -C /lib/modules/2.6.27.21-0.1-pae/build M=/tmp/linux-2.6.29/drivers/net/bonding modules
make[1]: Entering directory `/usr/src/linux-2.6.27.21-0.1-obj/i386/pae'
make -C /usr/src/linux-2.6.27.21-0.1 O=/usr/src/linux-2.6.27.21-0.1-obj/i386/pae/. modules
CC [M] /tmp/linux-2.6.29/drivers/net/bonding/bond_main.o
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_vlan_rx_registerā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:456: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:459: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:460: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_vlan_rx_add_vidā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:478: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:481: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:482: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_vlan_rx_kill_vidā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:508: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:511: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:516: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_add_vlans_on_slaveā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:532: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:540: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:541: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:544: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:548: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_del_vlans_from_slaveā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:556: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:566: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:574: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:580: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:581: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_check_dev_linkā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:690: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:698: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_compute_featuresā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:1350: error: āNETIF_F_ONE_FOR_ALLā undeclared (first use in this function)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:1350: error: (Each undeclared identifier is reported only once
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:1350: error: for each function it appears in.)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:1353: error: implicit declaration of function ānetdev_increment_featuresā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:1362: error: implicit declaration of function ānetdev_fix_featuresā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_enslaveā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:1388: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:1397: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:1479: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_get_statsā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:3906: error: implicit declaration of function ādev_get_statsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:3906: warning: initialization makes pointer from integer without a cast
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_neigh_setupā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4129: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4130: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4131: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_change_mtuā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4165: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_set_mac_addressā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4252: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4255: error: dereferencing pointer to incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: At top level:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4585: error: variable ābond_netdev_opsā has initializer but incomplete type
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4586: error: unknown field āndo_openā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4586: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4586: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4587: error: unknown field āndo_stopā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4587: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4587: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4588: error: unknown field āndo_start_xmitā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4588: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4588: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4589: error: unknown field āndo_get_statsā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4589: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4589: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4590: error: unknown field āndo_do_ioctlā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4590: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4590: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4591: error: unknown field āndo_set_multicast_listā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4591: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4591: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4592: error: unknown field āndo_change_mtuā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4592: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4592: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4593: error: unknown field āndo_set_mac_addressā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4593: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4593: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4594: error: unknown field āndo_neigh_setupā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4594: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4594: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4595: error: unknown field āndo_vlan_rx_registerā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4595: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4595: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4596: error: unknown field āndo_vlan_rx_add_vidā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4596: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4596: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4597: error: unknown field āndo_vlan_rx_kill_vidā specified in initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4597: warning: excess elements in struct initializer
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4597: warning: (near initialization for ābond_netdev_opsā)
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c: In function ābond_initā:
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4632: error: āstruct net_deviceā has no member named ānetdev_opsā
/tmp/linux-2.6.29/drivers/net/bonding/bond_main.c:4643: error: āIFF_MASTER_ARPMONā undeclared (first use in this function)
make[4]: *** [/tmp/linux-2.6.29/drivers/net/bonding/bond_main.o] Error 1
make[3]: *** [_module_/tmp/linux-2.6.29/drivers/net/bonding] Error 2
make[2]: *** [sub-make] Error 2
make[1]: *** [all] Error 2
make[1]: Leaving directory `/usr/src/linux-2.6.27.21-0.1-obj/i386/pae'
make: *** [all] Error 2


Das Verzeichnis "opensuse:/tmp/linux-2.6.29/drivers/net/bonding #" hat folgenden Inhalt:


opensuse:/tmp/linux-2.6.29/drivers/net/bonding # l
total 384
drwxr-xr-x 2 root root 4096 May 27 10:09 ./
drwxr-xr-x 40 root root 12288 Mar 24 00:12 ../
-rw-r--r-- 1 root root 268 May 26 15:36 Makefile
-rw-r--r-- 1 root root 223 Mar 24 00:12 Makefile.sav
-rw-r--r-- 1 root root 81699 Mar 24 00:12 bond_3ad.c
-rw-r--r-- 1 root root 9463 Mar 24 00:12 bond_3ad.h
-rw-r--r-- 1 root root 45798 Mar 24 00:12 bond_alb.c
-rw-r--r-- 1 root root 4802 Mar 24 00:12 bond_alb.h
-rw-r--r-- 1 root root 5432 Mar 24 00:12 bond_ipv6.c
-rw-r--r-- 1 root root 139910 Mar 24 00:12 bond_main.c
-rw-r--r-- 1 root root 43529 Mar 24 00:12 bond_sysfs.c
-rw-r--r-- 1 root root 10845 Mar 24 00:12 bonding.h


Meine Frage: Was ist hier noch falsch? Kann überhaupt ein einzelnes Treiber-Module kompiliert werden? Kann das Modul auch nur mit "gcc" übersetzt werden (ohne Mithilfe eines Makefiles bzw. "make")?
Besten Dank für Eure Mithilfe.
Hannes

Fabeltier
27.05.09, 17:27
Hallo,

ja natuerlich kannst Du auch nur ein Modul fuer Deinen Kernel bauen und dann einladen. Das geht auch mit aus dem Kernel "herausoperierten" Sourcen.

Ein einfacherer Weg waere allerdings, Du suchst auf der Seite des Treibers nach einem passenden Sourcepaket bzw. Patch zu Deiner Kernelversion. Das scheint mir das eigentliche Problem hier zu sein, die Kernelversion. Im 2.6.27 gibt's bspw. schon mal keinen netdev_ops Zeiger in der net_device Structure. Wenn Du also das Modul baust ist es am einfachsten unter der Kernelversion zu bauen fuer den es dann auch sein soll. Ausnahmen sind hier nur Crosscompiler Geschichten, bei denen man sowieso unter anderem Kernel / System baut (zB im Embedded Bereich).

Im allg. muss der Kernel fuer ein selbergebautes Modul aber auch "bereit" sein - ich denke mal Du hast den 2.6.27 Kernel auch schon selber kompiliert und hast entsprechenden Support aktiviert bzw versions checks deaktiviert(?), naja..

pferdefreund
27.05.09, 18:37
ein Makefile ruft auch nur den gcc mit entsprechenden Parametern auf - logisch, dass es
auch nur mit gcc und co funktioniert, so man alle -I und -L usw richtig setzt.

hannesd
28.05.09, 06:42
Ich habe den 2.6.27er-Kernel nicht selber kompiliert. Besteht denn in einer solchen Konstellation überhaupt die Möglichkeit, ein Modul - so wie ich es vor habe - zu kompilieren?

Leider gibt es für den Bonding-Treiber keinen eigentlichen Hersteller, bei dem ich Sourcepaket herunterladen könnte.
Besten Dank.
Hannes

Rain_maker
28.05.09, 07:19
http://www.linux-club.de/viewtopic.php?f=41&t=103576

http://forums.opensuse.org/applications/415293-module-compilation-problems.html



Thanks a lot for your answers. I will do a cross reference to this post in the other both foras (there are not more posts in other foras.).

hannesd
28.05.09, 08:56
Woher gibt's denn das Source-RPM "bonding-2.6.30-0.1.src.rpm"? Wurde leider nirgends fündig.

Fabeltier
28.05.09, 13:28
Hallo,
also was ich eigentlich meinte, vorausgesetzt Du willst Bonding support fuer Deinen Kernel, solltest Du auch in den Sourcen Deiner Kernelversion dafuer suchen.

Dabei sehe ich jetzt zwei Moeglichkeiten, entweder Du gehts beim herausextrahieren vor wie Du es beim 2.6.29er schon gemacht hast, nur eben, dass Du einen 2.6.27 nimmst. Das sollte eig. gehen, da der Bonding driver recht unabhaengig sein sollte.

Wegen Deinem Standarkernel, versuch mal ob Du /proc/config.gz nach home kopieren kannst, das entpacken und dann sehen ob folgendes gesetzt ist:


CONFIG_MODULE_UNLOAD = y
CONFIG_MODULE_FORCE_UNLOAD = y
#CONFIG_MODULE_VERSIONING is not set
#CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD = y

Oder, ein anderer Weg ist der wohl ueblichere, Du baust "einfach" einen Kernel und klickst den "Bonding Driver Support" unter Device Drivers -> Network device support an. Das kann das erste mal schon ein ziemliches Projekt sein, Du lernst aber einiges und eigentlich ist es heute auch nicht mehr so dramatisch.

Die doku zum bonding driver support (mit einigen Ressources) kannst Du zB hier finden (war der link in der Doku die Du bei make menuconfig zum modul siehst - Du siehst es ist eigentlich alles da ;) )
http://www.mjmwired.net/kernel/Documentation/networking/bonding.txt


PS: zu dem rpm.. da steht was von 2.6.30 - wenn das einen noch nicht mal als stable freigegebenen 2.6.30er braucht, haste da mit Deinem 2.6.27er eh keinen Chancen, Dir kompiliert ja schon fuer den 29er das Modul nicht wegen fehlenden oder anders definierten Headers zu den Kernel sources der neueren Version. Da kannste das Kompilieren der Sourcen fuer einen 2.6.30er mit 2.6.27er total in den Wind schiessen, imo.

hannesd
28.05.09, 13:54
Vielen Dank zuerst mal für die Antwort. Meine "/proc/config.gz" ist mit Deinem Auszug identisch.
Ich habe das Bonding mit dem 2.6.27er-Kernel bereits in Verwendung. Nun gibt es eine neue Version des Bonding-Drivers (3.5.0), welche ich gerne im bestehenden Distributions-Kernel (openSUSE 11.1) ausgetestet hätte.

Du hast erwähnt, man kann das Bonding-Modul aus dem 2.6.29er-Kernel "herausexpandieren". Gemäss anderen Posts ist das ein nicht so einfaches Unterfangen (Header-Dateien, die geändert wurden, etc..etc..etc..). Oder habe ich da eine Möglichkeit, dies dennoch zu bewerkstelligen, ohne den kompletten 2.6.29er-Kernel neu zu übersetzen?

Besten Dank.
Hannes

Fabeltier
28.05.09, 14:13
Das ist genau was ich meinte.

Es ist relativ trivial, Sources eines solchen Moduls, samt Makefile, aus einem 2.6.29er rauszukopieren und das ganze fuer einen 2.6.29er separat zu kompilieren (evtl. reicht sogar schon in das entsprechende Unterverzeichnis der Kernelsourcen zu gehen und dort make direkt aufzurufen, bzw make bonding oder sowas aehnliches).

Wenn Du aber bei Deiner Kernelversion bleiben willst, kannst Du jedoch wahrscheinlich keine modernere Version deines bonding Treibers verwenden, insbesondere da dieser Treiber integrierter Bestandteil des Kernels ist, sind neuere Versionen sehr wahrscheinlich auch nur an neuere Versionen des Kernels gekoppelt (ich denke der Link mit der Doku sagt etwas darueber, bzw die sourceforge page, forum bzw irc link). Bau halt nen 29er und klick einfach bonding an.

hannesd
02.06.09, 08:06
Alles klar. Vielen Dank für diese Antworten.

Hannes