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

(solved) OS 11.0 - compat-wireless-kmp & falsche "Requires"

A

Anonymous

Gast
Vorgeschichte:

Dieses Problem tritt seit openSUSE 11.0 RC1 reproduzierbar auf, es ist nicht von der Kernelversion abhängig, da eine 10.3 mit "custom-Kernel nach SuSE Art" (also auch über Build Service erstellt, Version 2.6.25.6) dieses Verhalten bei identischem src.rpm nicht aufzeigt.

Aufgefallen ist der ganze Schlamassel hier:

http://www.pc-forum24.de/beta-forum/9635-suse11rc1-ath5k.html

Symptome:

Nach einem fehlerfreien Rebuild eines des compat-wireless-src.rpm kann das entsprechende kmp-Paket nicht installiert werden:

Code:
# rpm -i compat-wireless-kmp-default-20080615_2.6.25.5_1.1-1.1.x86_64.rpm
#error: Failed dependencies:
        ksym(default:__ieee80211_get_channel) = a62b27f7 is needed by compat-wireless-kmp-default-20080615_2.6.25.5_1.1-1.1.x86_64

Das entsprechende Symbol ist nicht in kernel-syms (symvers/symsets&co) enthalten, jedoch ist dies unter 10.3, wo dieses Problem nicht auftritt, genau so.

Ein Vergleich der Ausgaben von

Code:
rpm -q --requires compat-wireless-kmp-default

zeigt folgenden Unterschied:

openSUSE 11.0:

Code:
nescaya:/home/cal # rpm -q --requires compat-wireless-kmp-default
rpmlib(VersionedDependencies) <= 3.0.3-1
kernel-default
grep
coreutils
/bin/sh
/bin/sh
/bin/sh
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
kernel(default:vmlinux) = f30985aa0d58b1bd
kernel(default:drivers_pcmcia) = d6e12e68b28e8185
kernel(default:drivers_leds) = 9c7be1407c475206
kernel(default:drivers_usb_core) = 5f7ab15d128f85da
kernel(default:lib) = 3d902850a781f266
kernel(default:drivers_input) = 6838d12e58f8c652
kernel(default:drivers_net_usb) = 8c4b5210ecad206d
kernel(default:drivers_mmc_core) = a4e7202433369dc1
kernel(default:net_rfkill) = cbce6028156b37d9
kernel(default:drivers_base) = 7522f9b3902583db
ksym(default:__ieee80211_get_channel) = a62b27f7
rpmlib(PayloadIsLzma) <= 4.4.2-1

openSUSE 10.3

Code:
rpm -q --requires compat-wireless-kmp-default

rpmlib(VersionedDependencies) <= 3.0.3-1
kernel-default
/bin/sh
/bin/sh
/bin/sh
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
kernel(vmlinux) = 7478eee6b17e0a6e
kernel(drivers_base) = 764d234a57393d3a
kernel(drivers_net_usb) = b32878b4de53e5a1
kernel(drivers_usb_core) = 4c72c467f0d75340
kernel(drivers_pcmcia) = 04961ed03875aff1
kernel(drivers_leds) = 41e22d9abdc48913
kernel(lib) = 086af86b98115d0b
rpmlib(PayloadIsBzip2) <= 3.0.5-1

Beide Pakete liefern als "Provides" (siehe verlinkten Thread, das zu posten habe ich mir erspart, das ist ja auch genau so, wie es sein soll) das Symbol "__ieee80211_get_channel", aber das Paket für 11.0 setzt dieses Symbol auch (IMHO fälschlicherweise) als "Requires" ein, was zum klassischen "Henne <=> Ei"-Problem führt.

Interessanterweise funktionieren die Treiber aus dem Paket aber, wenn man es mit der entsprechenden "bösen" Option "mit Gewalt" installiert problemlos, aber das ist natürlich keine Option.

Es stellen sich für mich nun folgende Fragen:

- Welcher Mechanismus sorgt für die Erkennung der Requires, oder genauer wo kann ich ansetzten und die Ursache dieses Fehlers zu finden? (daß es sich um den Tag "Autoreqprov: on" handelt und dafür wohl auch das Script "/usr/lib/rpm/find-requires" zuständig sind, ist für mich das Wahrscheinlichste, aber dazu sind meine Kenntnisse einfach noch zu bescheiden).

- Wie kann ich notfalls beeinflussen, welche Requires _nicht_ gesetzt werden, der umgekehrte Fall ist ja entsprechend simpel (entweder direkt im SPEC oder über die preamble). Somit wäre zumindest ein "Würgaround" möglich, denn in diesem "Zustand" möchte ich die Pakete nicht veröffentlichen.

Ich habe in der Zwischenzeit etwa 20 weitere src.rpms, die am Ende kmp-Pakete ausspucken, unter 11.0 mittels rpmbuild --rebuild erzeugt und ein analoges Problem trat nirgends auf.

Ach ja, es kann auch nicht an meiner Maschine/Build-Umgebung und meiner "Nichtverwendung" von lbuild o.ä. liegen, da dieses Problem reproduzierbar zumindest auf 3 unterschiedlichen Maschinen und auch bei den Paketen aus dem openSUSE Build Service (schmolles Repository) auftritt.

Ich bin für jede Anregung dankbar.

Greetz,

RM
 
Rain_Maker schrieb:
Code:
# rpm -i compat-wireless-kmp-default-20080615_2.6.25.5_1.1-1.1.x86_64.rpm
#error: Failed dependencies:
        ksym(default:__ieee80211_get_channel) = a62b27f7 is needed by compat-wireless-kmp-default-20080615_2.6.25.5_1.1-1.1.x86_64
Du hast compat-wireless-kmp mit dem RPM-Programm von 11.0 gebaut (das jeweils "Requires: ksym(flavor:symbol)" raussucht), aber du hast keinen Kernel installiert, der diese bereitstellt. (Das wirst du dann mit `rpm -q --provides kernel-default` sehen.) Das hat, kann ich dir sagen, weil ich da schon längst drüber weg bin, nichts mit dem kernel-syms-Paket zu tun.
 

oc2pus

Ultimate Guru
- Welcher Mechanismus sorgt für die Erkennung der Requires, oder genauer wo kann ich ansetzten und die Ursache dieses Fehlers zu finden? (daß es sich um den Tag "Autoreqprov: on" handelt und dafür wohl auch das Script "/usr/lib/rpm/find-requires" zuständig sind, ist für mich das Wahrscheinlichste, aber dazu sind meine Kenntnisse einfach noch zu bescheiden).

- Wie kann ich notfalls beeinflussen, welche Requires _nicht_ gesetzt werden, der umgekehrte Fall ist ja entsprechend simpel (entweder direkt im SPEC oder über die preamble). Somit wäre zumindest ein "Würgaround" möglich, denn in diesem "Zustand" möchte ich die Pakete nicht veröffentlichen.

Lösung (hier von meinem jdic-Paket, dort würde sonst ein Require auf libjawt.so aufgezählt werden, nicht alle Java Pakete "providen" dieses.
Code:
%define my_requires		/tmp/my-requires
...

%install
...

# exclude libjawt.so from the requires-list (it is NOT provided by java ...)
%__cat << EOF > %{my_requires}
%{__find_requires} | grep -v "libjawt.so"
EOF
%__chmod 755 %{my_requires}
%define __find_requires %{my_requires}

...
%clean
%__rm -f %{my_requires}

d.h. der "Trick" besteht darin die nicht gewünschten Dateien auszublenden und RPM ein überladenes fid_requires zu "verkaufen".

Geht für Provides ebenso:

Beispiel aus meinem gephex-Paket, dort will ich die Plugins NICHT in der "Provides Liste haben:
Code:
%define _my_provides	/tmp/my-provides

...

# exclude plugins from the provide-list
%__cat << EOF > %{_my_provides}
grep -v %{buildroot}%{_libdir}/%{name}-%{_major_ver}/modules/*.so | %{__find_provides}
EOF
%__chmod 755 %{_my_provides}
%define __find_provides %{_my_provides}
 
Von solchen Tricks ist strikt abzuraten. Schließlich gibt es Autoreqprov und die von SUSE dazugelieferten find-{requires,provides} nicht umsonst.
 
OP
A

Anonymous

Gast
@oc2pus

Besten Dank für den Workaround, eben getestet und er funktioniert wie erwartet:

Code:
rpm -qp --requires /usr/src/packages/RPMS/i586/compat-wireless-kmp-default-20080621_2.6.25.5_1.1-rm.0.i586.rpm
rpmlib(VersionedDependencies) <= 3.0.3-1
kernel-default
/bin/sh
/bin/sh
/bin/sh
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
kernel(default:vmlinux) = e61690aa8c2e0b5e
kernel(default:drivers_mmc_core) = 18459781724fc17c
kernel(default:drivers_usb_core) = 4460f5d7752dd946
kernel(default:drivers_pcmcia) = e2eba114bcd30db3
kernel(default:net_rfkill) = 4fd4ed04f744f3ff
kernel(default:drivers_base) = b2d567a365a2955b
kernel(default:drivers_input) = 52aaceff7ee6480d
kernel(default:drivers_net) = 80e6b6bd97af330e
kernel(default:drivers_leds) = 5c5eeaf550c6ffd7
kernel(default:lib) = 2d6b50809dab072c
rpmlib(PayloadIsLzma) <= 4.4.2-1

Die Requires sind nun bis auf das eine ksysm identisch, auch wenn es nur ein "Hack" ist, so ermöglicht er zumindest ein Paket zu bauen, was sich ohne --nodeps installieren lässt.

@jengelh

Mir ist durchaus bewusst, daß diese Mechanismen eigentlich das sind, was man so strikt wie möglich verwenden sollte, so bald es wieder ohne diesen "Trick" funktioniert, wird das Ganze wieder aus dem SPEC-File fliegen.

Mir sind nur bei meiner vorherigen Recherche folgende Sachen aufgefallen:

1. Das Paket selbst stellt ja dieses Symbol bereit:

Code:
rpm -qp --provides /usr/src/packages/RPMS/i586/compat-wireless-kmp-default-20080621_2.6.25.5_1.1-rm.0.i586.rpm |grep ieee80211_get_channel
ksym(__ieee80211_get_channel) = 3c94c754
ksym(ieee80211_get_channel) = 75eedb4a
ksym(ieee80211_get_channel_flags) = efd33411

2. Im Script /usr/lib/rpm/find-requires.ksyms findet sich folgender Abschnitt:

Code:
modules=($(grep -E '/lib/modules/.+\.ko$'))
if [ ${#modules[@]} -gt 0 ]; then
    symset_table=$(mktemp -t ${0##*/}.XXXXX)
    /usr/lib/rpm/symset-table | sort > $symset_table

    join -t $'\t' -j 1 -a 2 $symset_table <(
        # Filter out requirements that we fulfill ourself.
        join -t $'\t' -j 2 -v 1 \
            <(all_requires "${modules[@]}") \
            <(all_provides "${modules[@]}") \
        | awk '
        BEGIN { FS = "\t" ; OFS = "\t" }
        { print $3 "/" $2 "/" $1 }
        ' \
        | sort -u) \
    | sort -u \
    | awk '
    { FS = "\t" ; OFS = "\t" }

Ich verstehe den Kommentar so, daß dieser Teil hier "# Filter out requirements that we fulfill ourself." eigentlich dieses ksyms automatisch ausfiltern sollte, aber das aus irgendeinem Grund schief geht.

Da ich beim besten Willen kein Experte bin und mir dieses obige Script nur rudimentär verständlich ist, weiß ich nun nicht, ob hier ein Fehler vorliegt.

Ich werde das mal mit dem entsprechenden Script aus der 10.3 vergleichen, vielleicht fällt mir etwas auf.

Wohlgemerkt, unter 10.3 ist die "Ausgangssituation", daß kernel-default dieses Symbol ebenfalls nicht bereitstellt, es jedoch sehr wohl im compat-wireless-kmp-default enthalten ist exakt die selbe, nur wird dieses Symbol nicht als "Requires" ins kmp-Paket eingebaut.

Code:
rpm -q --provides kernel-default |grep ieee80211

kernel(net_ieee80211) = 5b9fafd2e7b28815
kernel(net_ieee80211_softmac) = 4e18c176bf0edbdb


rpm -q --requires compat-wireless-kmp-default

rpmlib(VersionedDependencies) <= 3.0.3-1
kernel-default  
/bin/sh  
/bin/sh  
/bin/sh  
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
kernel(vmlinux) = 7478eee6b17e0a6e
kernel(drivers_base) = 764d234a57393d3a
kernel(drivers_net_usb) = b32878b4de53e5a1
kernel(drivers_usb_core) = 4c72c467f0d75340
kernel(drivers_pcmcia) = 04961ed03875aff1
kernel(drivers_leds) = 41e22d9abdc48913
kernel(lib) = 086af86b98115d0b
rpmlib(PayloadIsBzip2) <= 3.0.5-1


rpm -q --provides compat-wireless-kmp-default|grep ieee80211_get_channel

ksym(ieee80211_get_channel) = 13a1cbd1
ksym(__ieee80211_get_channel) = a408a96c
ksym(ieee80211_get_channel_flags) = 4a366ff

BTW:

Auf kernel-syms als "möglichen Verursacher" kam ich nur dadurch, daß ich ähnliche Symbole nicht bei "rpm -q --provides kernel-default" sondern durch ein

Code:
zgrep -a ieee80211_get_channel /boot/sym*default*
/boot/symsets-2.6.25.5-1.1-default.tar.gz:0x51b3bc70    ieee80211_get_channel   net/ieee80211/ieee80211 EXPORT_SYMBOL
/boot/symsets-2.6.25.5-1.1-default.tar.gz:0x90b06777    ieee80211_get_channel_flags     net/ieee80211/ieee80211 EXPORT_SYMBOL
/boot/symtypes-2.6.25.5-1.1-default.gz:ieee80211_get_channel const s#ieee80211_channel * ieee80211_get_channel (s#ieee80211_device *, t#u8)
/boot/symtypes-2.6.25.5-1.1-default.gz:ieee80211_get_channel_flags t#u8 ieee80211_get_channel_flags (s#ieee80211_device *, t#u8)
/boot/symvers-2.6.25.5-1.1-default.gz:0x90b06777        ieee80211_get_channel_flags     net/ieee80211/ieee80211 EXPORT_SYMBOL
/boot/symvers-2.6.25.5-1.1-default.gz:0x51b3bc70        ieee80211_get_channel   net/ieee80211/ieee80211 EXPORT_SYMBOL
gefunden habe, welche laut

Code:
rpm -qf /boot/sym*defaul*
kernel-syms-2.6.25.5-1.1
kernel-default-2.6.25.5-1.1
kernel-default-2.6.25.5-1.1
kernel-default-2.6.25.5-1.1

auch von kernel-syms bereit gestellt werden.

Greetz,

RM
 

oc2pus

Ultimate Guru
Ich hänge mich nur ungern an "solved" markierte Threads dran, aber das kann ich so nicht stehen lassen:

jengelh schrieb:
Von solchen Tricks ist strikt abzuraten. Schließlich gibt es Autoreqprov und die von SUSE dazugelieferten find-{requires,provides} nicht umsonst.

kann man so pauschal nicht sagen :mrgreen:

Es gibt genügend Pakete wo genau dieses Verfahren angewendet wird (auch von SuSE selber). I.d.R wird so ein Eingriff immer dann notwendig wenn ein Pakete "lokale" shared libraries nutzt. Wenn diese shared libraries dann nicht "verborgen" werden, würde je nach Paketmanager ein falsches Paket installiert werden.

@Rain_Maker:
um den Thread hier "perfekt" zu machen, könntest du evtl dein modifiziertes spec-file hier noch posten.
 
Bis auf at76_usb... wozu baust du überhaupt compat-wireless für 2.6.25, wenn so ziemlich alle Module ohnehin in 2.6.25 enthalten sind?
Außerdem habe ich das Problem bei einem Neubau nicht (im Specfile ist noch kein find_requires hack)... vielleicht solltest du doch mal in die Sache mit chroot schauen!
 
OP
A

Anonymous

Gast
jengelh schrieb:
Bis auf at76_usb... wozu baust du überhaupt compat-wireless für 2.6.25, wenn so ziemlich alle Module ohnehin in 2.6.25 enthalten sind?

- weil der ath5k scheinbar in der 11.0 "b0rked" ist, mit compat-wireless funktioniert es (siehe verlinkter Thread)

- staendige Weiterentwicklung der Treiber, neue Devices, die unterstuetzt werden

- die rt73/rt61 waren in 2.6.25 teilweise immer noch etwas instabil, die Module im compat-wireless sind Version 2.1.x in 2.6.25 sind sie IIRC noch 2.0.x

- last but not least, weil Pakete bauen Spass macht

jengelh schrieb:
Außerdem habe ich das Problem bei einem Neubau nicht (im Specfile ist noch kein find_requires hack)... vielleicht solltest du doch mal in die Sache mit chroot schauen!

Kann ich bei Gelegenheit mal machen, wie gesagt, bei den Paketen aus dem BuildService (Repo von schmolle1980) tritt das Problem auch auf und im openSUSE Build Service gehe ich einfach mal von einer sauberen Buildumgebung aus (die ja vor jedem Paketbau "frisch" aufgesetzt wird).

//Edit:

Jetzt brat mir einer einen Storch, die neusten Pakete aus schmolles Repository (Build vom 19.06.) haben das Problem ebenfalls nicht mehr (bei den Builds davor war es noch vorhanden).

Code:
rpm -qp --requires Desktop/compat-wireless-kmp-default-20080615_2.6.25.5_1.1-5.2.i586.rpm
warning: Desktop/compat-wireless-kmp-default-20080615_2.6.25.5_1.1-5.2.i586.rpm: Header V3 DSA signature: NOKEY, key ID 31812260
rpmlib(VersionedDependencies) <= 3.0.3-1
kernel-default
grep
coreutils
/bin/sh
/bin/sh
/bin/sh
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
kernel(default:vmlinux) = e61690aa8c2e0b5e
kernel(default:drivers_mmc_core) = 18459781724fc17c
kernel(default:drivers_usb_core) = 4460f5d7752dd946
kernel(default:drivers_net_usb) = 34f7dbd8592e12c4
kernel(default:drivers_pcmcia) = e2eba114bcd30db3
kernel(default:net_rfkill) = 4fd4ed04f744f3ff
kernel(default:drivers_base) = b2d567a365a2955b
kernel(default:drivers_input) = 52aaceff7ee6480d
kernel(default:drivers_leds) = 5c5eeaf550c6ffd7
kernel(default:lib) = 2d6b50809dab072c
rpmlib(PayloadIsLzma) <= 4.4.2-1

@oc2pus

Ich poste mal die wichtigen Teile, welche die Änderungen enthalten

Code:
%define my_requires      /tmp/my-requires
---------------- snip -----------------
%install

#install the scripts

install -d %{buildroot}%{_libdir}/compat-wireless
install -d %{buildroot}%{_sbindir}
install -m 755 source/scripts/modlib.sh %{buildroot}%{_libdir}/compat-wireless/modlib.sh
install -m 755 source/scripts/{athenable,b43enable,athload,b43load} %{buildroot}%{_sbindir}
install -m 755 source/scripts/load.sh %{buildroot}%{_sbindir}/compat-wireless_load
install -m 755 source/scripts/unload.sh %{buildroot}%{_sbindir}/compat-wireless_unload


export INSTALL_MOD_PATH=$RPM_BUILD_ROOT
export INSTALL_MOD_DIR=updates
for flavor in %flavors_to_build; do
        make -C /usr/src/linux-obj/%_target_cpu/$flavor modules_install \
                M=$PWD/obj/$flavor
done

%if %suse_version == 1100
# exclude __ieee80211_get_channel from the requires-list
%__cat << EOF > %{my_requires}
%{__find_requires} | grep -v "__ieee80211_get_channel"
EOF
%__chmod 755 %{my_requires}
%define __find_requires %{my_requires}
%endif

und natürlich

Code:
%changelog
* Mon Jun 23 2008 - rain_maker(at)root-forum.org
- added workaround to exclude ksysm "__ieee80211_get_channel" from requires-list under openSUSE 11.0 (thx @oc2pus for help)

(Aber da die Pakete aus dem Build Service nun -warum auch immer- dieses Problem nicht mehr zeigen, war das wohl umsonst "die Pferde scheu gemacht".)

Greetz,

RM
 
Oben