Ich hadere aktuell etwas mit meinem ganzen Ansatz ;-)
Ich habe testweise versucht das Paketfinden in eine Funktion auszulagern, um darin ohne if/elif/else (also die @brikler "doppelten" Aufrufe) auszukommen. Mit dem Ergebniss, daß dieser Ansatz an meinem Laptop noch 2 Minuten länger dauert -🙁
Die Funktion (komme ich wunderbar ohne if/else aus, ist aber Bullshit <g>)
firmware_package=""
find_package() {
shopt -s extglob
local search="$1"
# double -Qqo is needed!
if $(/usr/bin/pacman -Qqo /usr/lib/firmware/$search*(.zst) >/dev/null 2>&1)
then
firmware_package=$(/usr/bin/pacman -Qqo /usr/lib/firmware/$search*(.zst))
fi
printf 'Q-firmware_package: %s!\n' $firmware_package
[[ "$firmware_package" != "" ]] && return 0
firmware_package=$(/usr/bin/pacman -Fq /usr/lib/firmware/"$search".zst)
printf 'F - firmware_package: %s!\n' $firmware_package
[[ "$firmware_package" != "" ]] && return 0
firmware_package=$(/usr/bin/pacman -Fqx $search)
printf 'Fx - firmware_package: %s!\n' $firmware_package
[[ "$firmware_package" != "" ]] && return 0
return 1
}
Die printf's darin sind dazu da mir anzuzeigen welche der 3 Prüfungen ein referenziertes modinfo-Firmware-File durchläuft.
a) Wenn das betreffende Paket installiert ist wird es bei -Qqo gefunden - superschnell
b) Wenn das Paket nicht installiert ist - aber in einem der Repo-Pakete als <pfad>/$search.zst aufgeführt wäre - dann "langsam, aber vertretbar" -Fq
c) Für alles andere wird die extrem langsame -Fx Funktion verwendet. -Fqx
Das Problem damit (was zu meinen +2 Min gegen dem "alten" Ansatz führt) ist aber, das nun jedes von modinfo angeführte File was es wirklich nicht mehr gibt in allen firmware-Paketen zweimal per -F "gesucht" wird. Einmal per -Fq und (weil Fehlschlag) dann nochmal per teuerstem -Fx.
Dieser Versuch/Ansatz ist also idiotisch...
Fakt:
- Alles was nicht per -Qo gefunden werden kann muß ich per -Fx (der teuersten Lösung) suchen. Es führt kein anderer Weg zu einem "Treffer" der auch "richtig" ist.
- Das eigentliche Problem sind die vielen aus modinfo -F firmware ausgegebenen Files für die es wirklich keine Dateien mehr in einem der Firmware-Pakete gibt.
Beim iwlwifi z.B.:
iwlwifi-gl-c0-fm-c0-93.ucode (No package found!)
Diese Datei gibt es einfach nicht mehr. Punkt. Schluß. Auch wenn ich die "teure" Suche dafür verwende...
Ich habe keine wirkliche Ahnung, warum z.B. beim iwlwifi-modinfo so viele "falsche" kommen, bzw. wer diese Angaben woher in diese modinfo-Ausgabe einpflegt. Andere Module haben ähnlich hohe "überflüssige" Files referenziert. (//Edit: Klar, in den Kernel-Sources...)
Falt ist halt aber: Wenn ich wirklich zu jedem referenzierten modinfo Firmware File versuche ein "passendes" Paket zu finden, dann suche ich in rund 1/3 oder 1/2 der Dateien "vergebens". Trotzdem müßte ich es eigentlich tun, da ich das ja "geliefert" bekomme und ein "dummes Skript" nicht entscheiden kann: Überflüssig oder nicht.
Was machbar wäre diesbezüglich (eine "Art" Intelligenz <g>):
Wenn bei einem Modul wie iwlwifi ein oder mehrere Such-Files gefunden werden in den Paketen (per -Qo oder -F), dann brauchst du die anderen Such-Files nicht mehr zu durchsuchen(v.a. nicht die wo es keine passenden dazu gibt). Was bedeutet: Modul iwlwifi Suchlauf findet 1-2 Treffer (im Paket linux-firmware-intel) dann wird dieses gefundene Paket zum passenden Paket für das Modul erklärt. Ohne (intensives) Weitersuchen. Wenn dieses Paket installiert ist/wird, dann bekommt man real ja auch nur die Firmware-Dateien, die darin enthalten sind, und das Modul funktioniert trotzdem).
//Edit: Und nur für ein Modul wo wirkliuch kein einziges der modinfo-Firmware-Files gefunden würde von -Qo oder -Fx, nur hier in der Ausgabe sagen: No package found!
Das würde die Zeit drastisch reduzieren.
Es darf halt nur nicht sein, daß ein Kernelmodul Firmware aus mehreren Firmware-Paketen benötigen würde. Dann wäre die Ausgabe unvollständig, somit falsch.
Allerdings ist mir bisher kein solches Modul untergekommen:
iwlwifi = linux-firmware-intel
r8169(Realtek nic) = linux-firmware-realtek
amdgpu = linux-firmware-amdgpu
usw.
tuxnix Ob ein Durchlauf 5 oder 10 Minuten benötigt finde ich dabei gar nicht so entscheidend
War mein ursprünglicher Gedanke, ja. Das braucht man ja nicht täglich. Somit hadere ich noch: Versuche ich "Zeit" zu optimieren (gerade für sowieso nicht "Findbares" s.o.) - aber ggf. auf Kosten der Genauigkeit. Oder sage ich: Es dauert was es dauert, wenn mir modinfo halt auch "Überflüssiges" liefert (ich muß aber jede Ausgabe gleich "wichtig" behandeln).
Fragen über Fragen... <g>
//Edit: dazu nochmal
tuxnix Mich hat eher dabei irritiert, dass so viele Zeilen für Gerätschaften angezeigt werden, die gar nicht in meinem PC verbaut sind.
Du meinst die "vielen" *.ucode files die:
$ modinfo -F firmware iwlwifi
eben für das dein wireless lan device anzeigt? Das sind keine unterschiedlichen "Geräte", aber jedes Device welches iwlwifi als Modul nutzt benötigt halt mindest ein(oder ggf. mehrere) der aufgeführten Firmware-Files. Bei deinem PC mit Sicherheit andere als z.B. bei meinem Uralt-Laptop - aber beide Chipsätze laufen halt mit dem iwlwifi-Kernelmodul.
Was halt bei diesem Modul "blöd" ist, daß viele der möglichen Firmware-Files es nicht mehr im linux-firmware-intel Paket gibt.
Was modinfo halt "fehlt" wäre ein Schalter wie es eben für lspci gibt:
lspci -k zeigt ja das **aktuell"" verwendete Kernel-modul bei "Kernel driver in use:". Sowas fehlt modinfo halt für die Firmware-Files ;-)
Noch'n //edit: ich hatte auch schon via /sys/class/* oder /sys/modules versucht "Firmware-Infos" rauszukriegen, bin aber letztendlich dabei gelandet daß nur modinfo -F mir diese "generellen" Infos liefern kann. Man kriegt wahrscheinlich nur mit speziellen Parametern ausführlichere Angaben (wobei wir z.B. wieder bei dyndbg='func fw_log_firmware_info +p' wären...)