Seiten: [1]
|
|
|
|
Autor
|
Thema: checkrebuild (Gelesen 959 mal)
|
|
Andreas
Administrator
Offline
Einträge: 1190
Linux von Innen
|
|
checkrebuild
« am: 17. Oktober 2023, 06:13:35 »
|
|
Ich hatte es euch schon mal auf einem unserer Treffen mitgeteilt: Wenn wichtige Bibliotheken sich verändern (z.B. bei einem Update) zieht das öfter mit sich, dass alle Pakete, die auf der "alten Version" aufbauen, nicht mehr funktionieren. Sie sind deshalb nicht fehlerhaft - sie müssen nur "neu gebaut werden" mit der neuen Bibliothek als Basis. Bei Paketen aus den Standard-Repos übernimmt das der Paketbetreuer - bei Paketen aus den AURs muss man das selbst machen. Um zu überprüfen ob auf dem eigenen System Pakete betroffen sind gibt es das Tool rebuild-detector. Das kann man mittels yay -S rebuild-detector installieren (es ist selbst auch in den AURs). Einmal installiert ruft man es mit sudo checkrebuild auf. Es listet alle Pakete auf die Aufrufe zu Bibliotheken enthalten die ins Leere laufen. Die aufgelisteten Pakete sind also deutliche Kandidaten für Fehlfunktionen - müssen es aber nicht sein. Wenn man diese Pakete neu baut (und man wirklich Quelldateien vor sich hatte) ist das Problem gelöst. Neu gebaut werden Pakete mit dem Befehl yay -S <Paketname>. Nach einem Neubau werden sie auf die aktuell vorhandenen Bibliotheken gelinkt und das Problem ist weg. Das funktioniert natürlich nicht wenn man von den Paketen keine Quelldateien vor sich hatte sondern fertig gebaute Binaries (z.B. aus Debian-Paketen etc.) Manchmal erkennt man das am Paketnamen: er sieht dann öfter so aus: Paketname-bin. Hier ist ein Neubau sinnfrei und das Paket wird auch nach einem Neubau mit checkrebuild als fehlerhaft angezeigt werden.
Bei einem sehr umfangreichen System hat man immer einige Kandidaten bei denen checkrebuild anschlägt und ein Neubau nichts bringt, und manchmal hat man dort auch viele Pakete die neu gebaut werden müssen. Das ging bislang nur "per Hand" - für jedes Paket was aufgelistet wurde. Einen Automaten dafür gab es nicht. Aso habe ich mir selbst einen gedengelt und möchte euch diesen nicht vorenthalten. Es ist ein Bash-Script das man in /usr/local/bin/ legt mit dem Namen aurrebuild. (und ein zweites Script mit gleichem Namen in /usr/local/sbin/). Das ist dann auch gleichzeitig der Befehl zum Aufruf. Und dann gibt es noch einen zweiten Teil. Ich habe den Befehl checkrebuild erweitert. Um das "sauber" zu tun (also so dass nach einem Update von checkrebuild meine Änderungen nicht "weg" sind) habe ich ein zweites Script geschrieben das man in /usr/local/sbin/ legt. Beim Aufruf von Kommandozeilenbefehlen werden nämlich die Ordner /usr/local/sbin und /usr/local/bin zuerst durchsucht - und damit mein Script und nicht der "Originalbefehl" gefunden und ausgeführt. Jetzt zur Nutzung:
Vorbereitung: Zunächst prüft man manuell mittels sudo /usr/bin/checkrebuild welche Pakete aktuell betroffen sind. Diese Liste packt man in einen Texteditor. Alle Pakete mit einem "-bin" drin kann man getrost vergessen - dort kann man mit einem Neubau nichts bewirken. Diese Pakete werden "false-positiv" gemeldet. Die verbliebenen versucht man mittels yay -S <Paketname> neu zu bauen. Das wird bei einigen funktionieren - bei einigen jedoch nicht. Die, bei denen das funktioniert, kann man wegstreichen. Alle anderen bleiben auf der Liste. Wenn man die Liste nun komplett abgearbeitet hat baut man mit aurrebuild --update-exceptions zunächst die Ausnahmeliste auf. Diese legt mein Script als Textdatei /etc/rebuildexclude an. Wenn das Script fertig ist ruft man es mit aurrebuild erneut auf. Mein Script versucht nun alle Pakete neu zu bauen die nicht in der Ausnahmedatei sind. Danach zeigt es an bei wie vielen das erfolgreich war. Ggf. muss man danach bei einem oder zwei Paketen nochmal einen manuellen Neubau versuchen (z.B. in einer chroot-Umgebung) - und manchmal muss man die Ausnahmeliste neu bauen (weil ein neuer Kandidat bei dem ein Neubau nichts nützt dazugekommen ist).
Hier nun die Scripte:
/usr/local/sbin/aurrebuild:#! /bin/bash
sudo --user=#1000 /usr/local/bin/aurrebuild
|
|
/usr/local/bin/checkrebuild:#!/bin/bash
/usr/bin/checkrebuild | sed 's/foreign\t//' | diff /etc/rebuildexclude -
|
|
/usr/local/bin/aurrebuild:#!/bin/bash
# Might as well ask for password up-front, right? sudo -v
if [ ! -f /etc/rebuildexclude ];then sudo touch /etc/rebuildexclude fi
/usr/bin/checkrebuild | grep foreign | cut -f 2 > /tmp/2rebuild1
if [[ $1 == "--update-exceptions" ]]; then sudo mv /tmp/2rebuild1 /etc/rebuildexclude echo "exception file updated." exit 0 fi
while read -r line; do if [[ $(grep -E "^$line$" /etc/rebuildexclude) == "" ]];then echo $line >> /tmp/2rebuild fi done < /tmp/2rebuild1 rm /tmp/2rebuild1
if [ ! -f /tmp/2rebuild ];then echo "nothing to do..." exit 0 fi
BEF=$(wc -l /tmp/2rebuild | cut -d " " -f 1) echo "$BEF packages need possibly rebuild - starting"
while read -r line; do if [[ $(grep -E "^$line$" /etc/rebuildexclude) == "" ]];then echo "trying to rebuild $line..." yay --noconfirm --nocleanmenu --nodiffmenu --noeditmenu --sudoloop -S $line fi done < /tmp/2rebuild
truncate -s 0 /tmp/2rebuild
/usr/bin/checkrebuild | grep foreign | cut -f 2 > /tmp/2rebuild1 while read -r line; do if [[ $(grep -E "^$line$" /etc/rebuildexclude) == "" ]];then echo $line >> /tmp/2rebuild fi done < /tmp/2rebuild1 rm /tmp/2rebuild1
echo "before: $BEF" echo "after: $(wc -l /tmp/2rebuild | cut -d ' ' -f 1)"
rm /tmp/2rebuild
|
| Mir hat es meine Systempflege sehr vereinfacht! Bei meinem System waren stets 10...20 Pakete bei denen ein Neubau nicht geholfen hat, und bei manchen Updates mussten 10...20 Pakete manuell neu gebaut werden, was schon recht nervig und zeitaufwändig war... Zusätzlich wird jetzt bei einem Aufruf von checkrebuild die neu gebaute Ausnahmeliste mit berücksichtigt und es werden nur die Pakete angezeigt bei denen ein Neubau wirklich erfolgsversprechend ist. Will man die "alte Ausgabe" haben muss man den Befehl mit /usr/bin/checkrebuild aufrufen.
Da Bash-Scripte nichts anderes sind als eine Textdatei mit Bash-Befehlen drin (deswegen muss man den oben aufgeführten Dateien dann auch Ausführungsrechte geben - bei denen in ...sbin nur für root, bei denen in bin... für "alle"). Man kann ihre Funktion selbst nachvollziehen und sie ggf. verbessern / anpassen. Und wie man einen vorhandenen Befehl durch einen anderen ersetzt (was der Nutzer nicht sofort erkennt) habt ihr nun auch gesehen. Also wieder viel Lernpotenzial in diesem Beitrag - wie auch in den vielen von Sebastian...
LG Andreas
|
« Letzte Änderung: 17. Oktober 2023, 07:45:04 von Andreas » |
Gespeichert
|
Wissen ist das einzige Gut, das mehr wird, wenn man es teilt - wenn es Menschen gibt, die es weitergeben, und es Menschen gibt, die bereit sind, dieses Geschenk auch unter eigenem Einsatz anzunehmen.
Freiheit zu erkämpfen reicht nicht. Man muss sie auch verteidigen.
|
|
|
Sebastian
Sr. Member
Offline
Einträge: 424
|
|
Re:checkrebuild
« Antwort #1 am: 17. Oktober 2023, 10:01:21 »
|
|
Vielen Dank Andreas, für den ein oder anderen wird das mit Sicherheit eine Erleichterung sein.
Btw:
Das kann man mittels yay -S rebuild-detector installieren (es ist selbst auch in den AURs)
|
|
Bei mir ist es im extra Repository:
❯ pacman -Ss rebuild-detector extra/rebuild-detector 4.4.2-1 [Installiert] Detects which packages need to be rebuilt
|
|
Fun Fakt aus dem Handbuch:
Installation pacman -S rebuild-detector
|
|
Du bist echt zu viel in dem AUR unterwegs oder ich zu wenig
Edit:
PS:
Eigentlich müsste beim Upgraden von Paketen auch eine Meldung kommen das Software neu gebaut werden müsste.
man checkrebuild
Pacman hook A pacman hook is included in the distribution as well. For performance reasons, the ldd check is only executed against direct dependencies of the packages that are being updated in this pacman transaction.
|
|
Habe bei mir nachgeschaut in meine System befindet sich der Hook unter
/usr/share/libalpm/hooks/rebuild-detector.hook
|
« Letzte Änderung: 17. Oktober 2023, 10:12:04 von Sebastian » |
Gespeichert
|
Richtig um Hilfe bitten
|
|
|
|
Sebastian
Sr. Member
Offline
Einträge: 424
|
|
PKGBUILD für aurrebuild
« Antwort #3 am: 17. Oktober 2023, 18:20:18 »
|
|
Habe mal für dein aurrebuild Skript ein PKGBUILD gemacht, damit man dein Script über pacman verwalten kann. Wenn die Dateien:
/usr/local/sbin/aurrebuild -> aurrebuild_sbin /usr/local/bin/checkrebuild -> checkrebuild /usr/local/bin/aurrebuild -> aurrebuld_bin
Unter dem angegebenen Namen im selben Verzeichnis wie das PKGBUILD liegen, dann lässt sich das bauen. Musste die Dateien vorher umbenennen, da aurrebuild doppelt vorkommt.
# Maintainer: Your Name <youremail@domain.com> pkgname=aurrebuild pkgver=1 pkgrel=1 pkgdesc="Verlinkt Software gegen Biblioteken mit Ausnahmen" arch=(any) url="https://www.suletuxe.de/forum/index.php?board=11;action=display;threadid=818" license=('unknown') depends=(rebuild-detector) backup=(etc/rebuildexclude) source=("aurrebuild_bin" "checkrebuild" "aurrebuild_sbin") sha256sums=('SKIP' 'SKIP' 'SKIP')
package() { install -m 755 -d "${pkgdir}"/usr/local/{,s}bin install -m 775 "aurrebuild_bin" "${pkgdir}/usr/local/bin/aurrebuild" install -m 775 "checkrebuild" "${pkgdir}/usr/local/bin/checkrebuild" install -m 774 "aurrebuild_sbin" "${pkgdir}/usr/local/sbin/aurrebuild" }
|
|
|
« Letzte Änderung: 20. Oktober 2023, 19:21:36 von Sebastian » |
Gespeichert
|
Richtig um Hilfe bitten
|
|
|
Andreas
Administrator
Offline
Einträge: 1190
Linux von Innen
|
|
Re:checkrebuild
« Antwort #4 am: 17. Oktober 2023, 18:21:35 »
|
|
Das mag daran liegen, dass ich viele dieser Progis schon lange auf meinem System habe. Zuerst waren sie nur in den AURs, irgendwann sind sie dann wegen großer Beliebtheit in die Standard-Repos gewandert. Das entgeht mir in der Tat so gut wie immer...
LG Andreas
|
|
Gespeichert
|
Wissen ist das einzige Gut, das mehr wird, wenn man es teilt - wenn es Menschen gibt, die es weitergeben, und es Menschen gibt, die bereit sind, dieses Geschenk auch unter eigenem Einsatz anzunehmen.
Freiheit zu erkämpfen reicht nicht. Man muss sie auch verteidigen.
|
|
|
Sebastian
Sr. Member
Offline
Einträge: 424
|
|
checkrebuild bash Autocomplete
« Antwort #5 am: 15. November 2023, 18:13:09 »
|
|
Hallo Andreas,
Ich habe mich mit der Bash Autocomplete Funktion etwas näher befasst (Auslöser ist die Euphorie rund um fzf) und als Übung eine kleine Autocomplete Funktion für dein aurrebuild Skript geschrieben. Da dies nur eine Option hat dachte ich mir eigenet sich das ganz gut zum üben
Nunja was soll ich sagen hier ist die kleine Funktion.
#!/usr/bin/env bash
_aurrebuild() { local current_word="${COMP_WORDS[COMP_CWORD]}" local options=(--update-exceptions) ((COMP_CWORD == 1)) && COMPREPLY=($(compgen -W "${options[*]}" -- "${current_word}")) }
complete -F _aurrebuild aurrebuild
|
|
Um diese zu verwenden entweder manuell sourcen oder in eine Datei speichern unter einer dieser Pfade:
/etc/bash_completion.d/ # Systemweit für alle User $XDG_DATA_HOME/bash-completion # Für den Einzelnen User ~/.local/share/bash-completion # Falls man die $XDG_DATA_HOME Variable nicht gesetzt hat.
|
|
danach bekommt man ein Autocomplete wenn man aurrebuild <TAB><TAB> verwendet.
LG Sebastian
|
« Letzte Änderung: 15. November 2023, 18:18:08 von Sebastian » |
Gespeichert
|
Richtig um Hilfe bitten
|
|
|
Andreas
Administrator
Offline
Einträge: 1190
Linux von Innen
|
|
Re:checkrebuild
« Antwort #6 am: 15. November 2023, 18:36:10 »
|
|
Ein riesengroßes Smily...
Danke Sebastian!
Du zeigst auf eindrucksvolle Weise wie weit man in wie kurzer Zeit kommen kann wenn man sich mit der Materie beschäftigt. Es ist jetzt nicht abwertend gemeint: fast jeder kann das erreichen. Das Zauberwort heißt beschäftigen. Es kommt nicht dahergeflogen, und auch das "Buch-unter-das-Kopfkissen-legen" ist keine zielführende Methode. Man muss Zeit (anfangs vieeeel) investieren und verstehen lernen.
Die Thematik ist nicht superschwierig. Es erfordert weder ein Studium noch Hochbegabtsein. Es erfordert die Fähigkeit zu logischem Denken (die über 95% der Menschen sowieso haben) und Biss, auch bei Problemen nicht aufzuhören. Natürlich erfordert es auch Zeit. Diese beiden Dinge verhindern in den meisten Fällen das Weiterkommen...
LG Andreas
|
|
Gespeichert
|
Wissen ist das einzige Gut, das mehr wird, wenn man es teilt - wenn es Menschen gibt, die es weitergeben, und es Menschen gibt, die bereit sind, dieses Geschenk auch unter eigenem Einsatz anzunehmen.
Freiheit zu erkämpfen reicht nicht. Man muss sie auch verteidigen.
|
|
|
Seiten: [1]
|
|
|
|
|
|
|