Es geht bei meiner Frage eher um ein Verstädnisproblem.
Ich lade mir mit pacman -Syuw
und einem systemd service/timer die neuen Pakete schon einmal im Hintergrund vom Paket-Server, bevor ich sie dann mit einem pacman -Syu
im Terminal installiere.
Funktionieren tut das bislang auch tadellos.
Nun bin ich in der Wiki darauf gestoßen, dass dieses Verfahren die Gefahr eines partiellen Updates bergen würde. Ist das tatsächlich so und wenn ja, durch was käme es dazu?
pacman -Syuw und die Gefahr eines partiellen Paket-Updates
Also nach meinem Verständnis ist das so, wie du es hier schreibst, kein Problem. Falls ein von dir installiertes Paket zwischen dem pacman -Syuw
und dem pacman -Syu
ein Update erfährt, dann bekommt pacman das mit und lädt dann eben zusätzlich noch von diesem Paket die neuere Version runter. Dann hast du halt unnötigerweise etwas heruntergeladen, unnötigerweise elektrische Energie in thermische Energie umgewandelt und die Entropie erhöht.
Aber vielleicht übersehe ich da auch etwas.
Kann nach meinem Verständnis (!) eigentlich nicht sein, da du mit neuerlichem -Syu ohnehin die Dateien neu von einem (in sich konsitenten) Server ziehst. Die logische Abfolge wäre '''pacman -Syuw''' und später '''pacman -U''' (evtl. mit Pfad/zur/Datei). Diese Download-Jetzt/Installation-Später Funktionalität stammt wohl noch aus einer Zeit, als noch nicht jede(r) immer und überall online oder durch Volumen-Tarife geknebelt war. Ich sehe heute keinen Grund mehr dafür.
- Bearbeitet
n815i3xjx8lomlny
Ja, das Nachladen einer neueren Version macht es anstandslos. Wie ein Blick ins pacman.log beweist.
[2022-09-22T20:49:06+0200] [ALPM] upgraded kdesu (5.98.0-1 -> 5.98.0-2)
[2022-09-22T23:33:31+0200] [ALPM] upgraded kdesu (5.98.0-2 -> 5.98.0-3)
Also wozu überhaupt ein -Syuw?
- Bearbeitet
matthias
Danke dir!
Dann lösche ich mal den roten Kasten aus dem betreffenden Artikel heraus, falls kein Einspruch mehr erfolgt. Das prep4ud-script dort funktioniert ohnehin nicht mehr.
matthias Also wozu überhaupt ein -Syuw?
Dann muss ich beim update nicht so lange dabei zuschauen bis das Download abgeschlossen ist.
- Bearbeitet
Alternativ könntest du für die Download-Aktion(also den -w Teil) im Procedere auch eine eigene Sync-Datenbank verwenden (Option -b/--dbpath bei pacman).
Das setzt dann aber ein explizites -y/--refresh beim realen Upgrade-Vorgang voraus (machst du ja schon).
Vorteil des Verfahrens: Deine reale Sync-Datenbank (/var/lib/pacman/sync wäre unangetastet und immer noch auf dem Stand des letzten Syncs vom "realen" Upgrade/Install-Vorgang. Und: ein (warum auch immer) gemachtes pacman -S foobar würde dann maximal ein "Paket not found" auf dem Spiegelserver erfahren, aber eben kein teilweises, unvollständiges System.
//Edit: Der "rote Kasten" gilt m.E. immer noch, aber weniger durch den Pre-Download-Vorgang an sich sondern durch die Gefahr das der User dadurch in die Gefahr eines partiellen Upgrades getrieben wird. Bei einer gemeinsam genutzten Sync-Datenbank ist ein - gedankenloses, "wissenloses" - pacman -S foobar natürlich absolut No-Go!
Der User muß halt verinnerlichen daß einem separatem (-Sy) unbedingt immer ein -Su folgen muß, auch wenn nur ein neues Paket installiert werden soll.
Und alles was dem User hilft solche Situationen zu vermeiden ist IMHO gut. Also in punkto separatem Download (-w= wäre ich für die Anleitung/Hinweis mit einer extra Sync-Datenbank für diesen Vorgang - wie es andere Tools die eine aktuelle Sync-DB brauchen wie checkupdates z.B. schon machen/anbieten.
//Edit2: Hier Beispiele
Als Beispiele zwei Szenarien:
a) Für den lokalen Rechner sollen die jeweils aktuellen Pakete heruntergeladen werden und für eine spätere Aktualisierung im Cache vorhanden sein. Das ist dein avisiertes Beispiel.
b) Es gibt im Netzwerk drei Rechner: einer mir Gnome, einer mit KDE und ein "Server". Alle Rechner nutzen einen gemeinsamen Paket-Cache. In diesem sollten alle jeweils benötigten Pakete vorab schon runtergeladen sein, also beim jeweiligen -Syu am jeweiligen Rechner schon verfügbar sein. Der "Server" soll sich um diesen Pre-Download kümmern.
Generell gilt:
- Es sollen an keinem Rechner durch den Vorgang Änderungen (aka "automatische Upgrades") durchgeführt werden. Es geht lediglich um den Pre-Download von jeweils dem aktuell verfügbaren Paket.
- Alle Rechner sollen konsistent bleiben in ihrem Zustand seit dem letzten -Syu Upgrade-Vorgang.
- Ziel ist es jeweils nur den Paket-Cache mit den aktuell verfügbaren Paketen zu beschicken. Und das eben ohne Punkt (2) oben zu verletzen.
Grundvoraussetzug bei allen Szenarien ist:
Eine eigene Lokalität für die pacman Sync-Datenbank, wegen Punkt (2).
Bei pacman ist die Sync-Datenbank per Default /var/lib/pacman. Darin sind die Ordner local und sync.
Ein pacman -Sy verändert den Inhalt von sync, ein -Su den Inhalt von local. Beides zusammen (-Syu) bilden ein ordentliches Systemupgrade.
Eine eigene Sync-Datenbank wird z.B. so erstellt:
# mkdir /var/local/pacman-DL
# ln -s /var/lib/pacman/local/ /var/local/pacman-DL/
Ein Update der Sync-Datenbank per
pacman -Sy --dbpath /var/local/pacman-DL
verändert nun lediglich unser extra Sync-Dir, läßt aber das "reale" Sync dir "in Ruhe".
Für Szenario a) Pre-Download nur für einen PC würde sich nun anbieten:
- Ein cronjob/systemd-timer mit:
pacman -Syuw --dbpath /var/local/pacman-DL
Die (extra) Sync-DB würde auf den aktuellen Stand gebracht und gleichzeitig der Paket-Cache mit den verfügbaren aktuellen Paketen befüllt. - Das eigentliche Upgrade dann mit:
pacman -Syu
Die Pakete, die in der aktuellen Version im Paket-Cache schon vorhanden sind müßten nicht von den Spiegelservern runtergeladen werden.
Vorteil/Ziel wie gesagt: Der Zustand zwischen zwei Upgrades bliebe konsistent, es würden am PC weder die Sync-DB noch die DB der installierten Paket(e)/Versionen angetastet durh den Pre-Download. Um das Standard pacman.log noch frei von Einträgen zu halten, die nur durch die Pre-Download-Aktionen kommen würde sich anbieten, im Job ein eigenes Log zu verwenden, also z.B.:
pacman -Syuw --dbpath /var/local/pacman-DL --logfile /var/local/pacman-DL/pacman.log
Szenario 2)
Mehrere Rechner mit teils unterschiedlichen Paketgruppen, ein Rechner soll den Pre-Download für alle durchführen und einen gemeinsamen Paket-Cache befüllen vor den jeweils individuell getätigten "realen" Upgrade-Vorgängen der Rechner.
Das erfordert ein wenig mehr "Vorarbeit", v.a. um das Ziel "Konsistenz" und Vermeidung von partiellen Ugrades zu erreichen.
Wir nehmen an, der "Server" soll die Pakete pre-downloaden. Für sich selbst, den Gnome-Rechner und den KDE-Rechner; in das Paket-Cache Verzeichnis /var/cache/pacman/pkg (was irgendwie von allen genutzt wird (NFS/SMB)).
Ich habe es jetzt nicht ausprobiert, sollte aber so funktionieren:
a) am Server ist wie oben für den Pre-Download ein eigenes Sync-DB einzurichten.
b) Die beteiligten Rechner legen eine Liste ihrer jeweils installierten Pakete z.B. ins gemeinsam genutzte Paket-Cache-Dir ab:
pacman -Qq > /var/cache/pacman/pkg/<rechnername>.list
Das kann z.B. durch einen pacman-Hook nach dem jeweils erfolgten "realen" -Syu-Upgrade am jeweiligen Rechner geschehen.
Der "Server", der Gnome-Rechner und der KDE-Rechner haben also unterschiedliche Listen mit jeweils installierten Paketen, die möglichst auch alle pre-downloaded werden sollen.
c) Am "Server" - der downloaded - werden diese Listen nun zusammengeführt und vereinheitlicht vor dem eigentlichen Pre-Download. Dafür würde sich ein eigenes Skript anbieten:
sort -u /pfad_zum/<pc-1>.list /pfad_zum/<pc-2>.list /pfad_zum/<pc-3>.list > /pfad_zum/complete.list
Das erzeugt eine Liste aller Pakete von allen Rechnern für die jeweils die aktuelle Version pre-downloaded werden soll (/pfad_zum/complete.list). Das -u/--unique bei sort bewirkt, das Pakete die auf allen 3 Rechnern installiert sind nicht mehrmals in der complete-Liste auftauchen.
pacman -Syw --dbpath /var/local/pacman-DL - < /pfad_zum/complete.list
Dieser Befehl würde nun die jeweils aktuelle Version aller Pakete aus der complete-Liste pre-downloaden und ins gemeinsame Paket-Dir ablegen.
Wenn die Einzel-Rechner dann ihre jeweils "realen" Upgrades per -Syu machen sollten dann z.B. für den Gnome-Rechner die meisten aktuellen zu installierenden Pakete schon vorhanden sein, ebenso die für den KDE-Rechner. Das halt jeweils ohne unsere Konsistenz-Vorgabe oben zu verletzen.
Das beschreibt für dieses Szenario nur den Idealfall. Was meistens noch berücksichtigt werden muß sind:
1) AUR oder lokal installierte Pakete (die also in den Repos nicht existieren)
Diese kann man z.B. mittels
comm -12 <(pacman -Slq --dbpath /var/local/pacman-DL/ | sort) <(sort /pfad_zum/complete.list ) > /pfad_zum/complete.list
//Edit: obiges erzeugt eine leere Datei, deshalb besśer sowas:
cp /pfad_zum/complete.list /pfad_zum/complete.list.org
comm -12 <(pacman -Slq --dbpath /var/local/pacman-DL/ | sort) <(sort /pfad_zum/complete.list.org ) > /pfad_zum/complete.list
rausfilter bei obigem Punkt (c). Das entfernt aus der complete-Liste eben alle Pakete, die in der eigenen Sync-DB nicht verfügbar sind, also nicht pre-downloaded werden können.
2) Eigene bzw. Fremd-Repos
Falls die beteiligten Rechner sowas nutzen, dann müßte der Rechner der die Pre-Downloads tätigt diese natürlich auch "kennen". Das würde funktionieren wenn dieser eine pacman.conf und ggf. Mirrorlist-Dateien hätte, zusammengefaßt aus allen Repos der beteiligten Rechnern.
Spätestens hier (um die Konsistenz nicht zu ruinieren) ist es sinnvoll, für den pacman der lediglich die Pre-Downloads macht für diese eine eigene pacman.conf dafür anzulegen(Repos) und ggf. auch spezielle Mirrorlist-Datei nnur für diesen Pre-Download-Vorgang.
Der Pre-Download pacman würde dann z.B. per pacman -Syw --config <eigene Conf>
gestartet, in dieser Conf wäre dann der eigene DBPath wie oben konfiguriert und Fremd-Repos eingetragen, ggf. auch andere Mirrorlists. Das halt, um den Download-Rechner (im Beispiel der "Server") sauber zu halten für seinen eigenen Update-Vorgang (bei dem dann die Standard-pacman.conf etc. genutzt wird).
- Bearbeitet
GerBra
Vielen Dank für deine guten Überlegungen.
Der rote Kasten muss also bleiben und auf die möglichen Gefahren hinweisen.
Ich bin sogar der Meinung, dass ein pacman -S foobar
potentiell immer dann Gefahren birgt wenn ein komplettes Paketupgrade mit pacman -Syu
zu lange her war.
Erster Textentwuf:
Um die Gefahr eines partiellen Upgrades zu vermeiden ist beim Gebrauch von pacman -Syuw zu bedenken, dass kein Einzelpaket mitpacman -S foobar
installiert werden sollte bevor die heruntergeladenen Pakete auch installiert wurden. Empfohlen ist hier zuvor immer einpacman -Syu
anzuwenden.
Was ich erst einmal ausprobieren möchte, ist ob tatsächlich mit einer 2. Paketdatenbank ein pacman -S foobar
nicht mehr möglich ist. (Den Teil verstehe ich noch nicht so ganz)
Bei checkupdates ist wohl der Grund für eine zweite Datenbank der, das eine Meldung erzeugt werden soll wenn neue Pakete vorhanden sind. Ich schau mir das mal an, aber brauchen tue ich dies vielleicht nicht wirklich.
Edit:
Du hast inzwischen noch mehr geschrieben.
Das muss ich natürlich erst einmal genau studieren.
Deshalb ist meine Antwort natürlich auch noch nicht komplett. 😉
Vielen Dank aber jetzt schon.
Edit 2:
WoW !!!
Habe es jetzt gelesen und wohl auch verstanden.
Sehr aufschlussreich für das Verständnis war für mich :
Bei pacman ist die Sync-Datenbank per Default /var/lib/pacman. Darin sind die Ordner local und sync.
Ein pacman -Sy verändert den Inhalt von sync, ein -Su den Inhalt von local. Beides zusammen (-Syu) bilden ein ordentliches Systemupgrade.
und natürlich auch das Aufführen der einzelnen weiterführenden Befehle.
Szenario a) werde ich auf jeden Fall auf diese Weise realisieren.
Szenario b) vielleicht. Nützlich wäre es schon für die Rechner die nicht so oft in Gebrauch sind. Jedenfalls dauert das Upgrade nicht so lange wenn nicht mehr für jeden Rechner so fürchterlich viele Pakete heruntergeladen werden müssen.
n815i3xjx8lomlny
Die Vorgehensweise b) würde auch einer unnötigen Entropieerhöhung entgegenwirken. 😉
- Bearbeitet
tuxnix Habe es jetzt gelesen und wohl auch verstanden.
Klasse!
Der Gefahrpunkt wenn man bei sowas keine separate Sync-DB hat, bzw. länger kein Komplettupgrade mehr gefahren hat:
Bsp:
Ich hätte vor 4 Monaten mein letztes -Syu gemacht. Die Sync-DB und die DB der lokal installierten Paket(versionen) ist also von diesem Zeitpunkt.
Jetzt komme ich auf die Idee, daß ich gerne auch die zsh als Shell hätte.
pacman -S zsh
So, daß wird mit ziemlicher Sicherheit so ausgehen daß vom Mirror kommt:
Paket zsh-1.2.3-3 nicht gefunden.
Klar, meine angeforderte Version kommt ja noch aus dem Stand der Sync-DB von vor 4 Monaten.
Und jetzt kann der User etliches falsch machen:
a)"Klar, es gibt eine neuere Version, also"
pacman -Sy zsh
Das bewirkt zum einen, daß die Sync-DB aktualisiert wird und für ALLE Pakete (ob installiert oder nicht) die neue Version(en) zum Installieren per pacman anbietet.
So würde ich die aktuelle Version der zsh kriegen - aber auch gleichzeitig neue Versionen die von der zsh direkt oder indirekt abhängen der Pakete von der die zsh direkt oder indirekt abhängt! Das kann die glibc, openssl, curl, sonstige so-Bumps sein... Für all das kriege ich neue Versionen.
Diese passen aber dann nicht mehr z.B. zu meiner alten bash, meinem alten pacman, usw. Und schon ist das Kind in den Brunnen gefallen... Teilaktualisiertes System.
Richtig wäre gewesen:
pacman -Syu zsh
Wenn also die Sync-Datenbank weder durch "außen"(z.B. den Pre-Downloader) noch durch mich (s.o.) angefaßt wird zwischen zwei regulären Updates, dann kann maximal passieren daß Paket zsh eben nicht mehr in "meiner" Version gefunden wird -> Alarmsignal. Zeit für ein Gesamt-Upgrade.
Der intelligente User wird immer:
a) ein -Sy mit einem -Su verbinden (also -Syu evtl_noch_Paketname).
b) Bei allem, was man mit pacman anstellen kann, vermeiden die Sync-DB des regulären pacman zu verändern. Z.B. etwas wie:
pacman -Sy && pacman -Qu | wc -l
um eine Anzahl der zu updatenden Pakete zu kriegen. Irgendwann denkt man nicht mehr dran und macht obiges pacman -S zsh und hat den Salat... Mit einer eigenen Sync-DB würde das nicht passieren.
//Edit: Ich selbst bin Wiki-Muffel, wenn du irgendwas aus meinem Geschreibsel verwenden/gebrauchen willst: Nur zu...
GerBra Ich selbst bin Wiki-Muffel, wenn du irgendwas aus meinem Geschreibsel verwenden/gebrauchen willst: Nur zu...
Das werde ich sicher tun. Danke Ich habe Szenario b) schon auf einem Rechner laufen und nutze mein NAS-Laufwerk dafür. Die /ect/pacman.conf weist jetzt auf CacheDir=/NAS/pacman/pkg/.
Du bekommst es dann zur Korrektur bzw. Ergänzung hier verlinkt, wenn ich was dazu in der Wiki geschrieben habe. 😉 Ich weiß nur noch nicht wie man das Thema in Kürze und Prägnanz darstellen kann. Deshalb lass ich mir da lieber Zeit damit.
Im Grunde ist das Ganze etwas hypertroph.
Die Gefahr, dass wenn pacman -Syu
nicht regelmäßig erfolgt, ein pacman -S
zu einem inkonsistenten System führen kann, ist ja immer gegeben.
Die Schutzmaßnahmen mit einer eigenen Sync-DB diese Gefahr zu mindern, machen wir hier, weil wir unterstellen, dass ein Preload der Pakete der Duseligkeit des Users Vorschub leisten könnte.
Wir wollen also lediglich nicht durch ein Preload das Potenzial einer schon bestehenden Gefahr erhöhen.
Vielleicht wäre es besser das Problem bei der Wurzel zu packen und darauf hinzuwirken, dass pacman selbst dafür sorgt.
Wenn ich deinem Szenario oben folge, dann musste pacman nur noch beigebracht werden, bevor ein pacman -S foobar
ausgeführt wird, zu prüfen ob zu aktualisierende Abhängigkeiten von foobar auch noch von anderen Pakten Abhängigkeiten darstellen und müsste in diesem Fall den Dienst verweigern mit dem Hinweis: Bitte zuvor System upgraden mit pacman -Syu !
Es ist ja eigentlich die Aufgabe von pacman für die Konsistenz des Systems zu sorgen.
tuxnix Die Gefahr, dass wenn pacman -Syu nicht regelmäßig erfolgt, ein pacman -S zu einem inkonsistenten System führen kann, ist ja immer gegeben.
Warum sollte das so sein? pacman -S
wird versuchen, das Paket (und möglicherweise dessen Abhängigkeiten) anhand der Informationen aus der Sync-Datenbank zu laden und zu installieren.
Alle Pakete werden installiert, wenn sie auf dem Mirror (noch) gefunden werden. Das würde praktisch das gleiche bedeuten, als wenn sie auch am Tag des letzten Sync installiert worden wären.
Wenn eins der Pakete nicht mehr gefunden wird, weil es zwischenzeitlich aktualisiert wurde, schlägt der Download fehl und die Installation aller Pakete wird abgebrochen.
Ich kann deshalb nicht erkennen, warum ein einfaches pacman -S
zu einem inkonsistenten System führen sollte, solange man die Sync-Datenbank nicht aktualisiert.
- Bearbeitet
Martin-MS
Danke für deine Erläuterungen. Du hast natürlich recht. Vielleicht bin ich da aber nur deshalb etwas begriffsstutzig, weil ich mich noch nie getraut habe, bei einem nicht aktualisierten System ein pacman -S durchzuführen.
GerBra
Fertig! Es läuft jetzt mit 2 Rechnern und die Updates laufen viel schneller durch. 😉
Auch habe ich schon mal den zukünftigen Wiki Artikel vornotiert.
Schau bitte mal drüber ob das so taugt, oder ob vielleicht noch Verbesserungspotenzial besteht.
Abgeändert habe ich folgendes:
- Namen und Pfade
- pacman -Qq ->pacman -Qqe
- Server arbeitet mit script statt mit einem Hook
- paccache -vrk2 - zusätzlich im script
- Benutzerrechte - Der zweite Rechner will trotz identischer UID auf den server mit nobody:nobody zugreifen.
Und ein herzliches Dankschön für die tolle Vorarbeit.
Package-Preload (Beispiel)
Das folgende Beispiel zeigt die Möglichkeit auf, den Download von neuen Paketen auf einem zentalen Rechner automatisch durchzuführen und die Pakete von dort aus auf andere Rechner zu verteilen.
Um die Gefahr eines partielles Upgrades, das die Konsistenz des Systems bei einen unbedachten pacman -S foobar
beschädigen könnte zu vermeiden, wird eine separate Paketdatenbank für das Preload genutzt. Dabei wird der Paketbestand einzeln gelistet, sodass jeder Rechner nur die Pakete erhält die auf ihm schon installiert sind. Durch den paccache Befehl wird der Bestand an veralteten Paketen klein gehalten. Die Installation der auf diese Weise vorab heruntergeladenen Pakete wird dabei wie bisher mit dem Befehl pacman -Syu
auf jedem Rechner separat durchgeführt.
Für den Rechner (server) der das Package-Preload durchführen soll:
Vorbereitung
Die folgenden Ordner und Dateien werden erstellt und die Benutzerrechte gesetzt.
Für <rechnername> ist der hostname des betreffenden Rechners zu setzen.
mkdir /etc/preload
mkdir /etc/preload/pkg
chmod 777 /etc/preload/pkg
mkdir /etc/preload/pkg/list
touch /etc/preload/pkg/list/<rechername>
chmod 777 /etc/preload/pkg/list/<rechername>
cp -r /var/cache/pacman/pkg /etc/preload/
ln -s /var/lib/pacman/local/ /etc/preload/
Einrichtung des nfs Server
Dabei wird der Ordner /NAS für unser Beispiel jeweils mit dem Ordner /etc/preload ersetzt.
/etc/pacman.conf
In der /etc/pacman.conf oben eine Zeile einfügen.
CacheDir=/etc/preload/pkg/
pkgpreload.sh
#!/usr/bin/env bash
# file-> /usr/local/bin/pkgpreload.sh
# Proof if root
if (( `id -u` != 0 )); then
echo "Sorry, you must be root."
exit
fi
# Check dependencies
declare -a DEPEND=("paccache")
for i in "${DEPEND[@]}"; do
if ! [[ -f "/usr/bin/$i" || -f "/usr/sbin/$i" ]] ; then
echo "$i is missing. You need to install the pacman-contrib package."
exit 1
fi
done
# Write and sort package lists, delete AUR packages
pacman -Qqe > /etc/preload/pkg/list/<rechername>
sort -u /pacman/pkg/list/<rechername> /etc/preload/pkg/list/<rechnername> /etc/preload/pkg/list/<rechnername> > /etc/preload/pkg/list/all
cp /etc/preload/pkg/list/all /etc/preload/pkg/list/org
comm -12 <(pacman -Slq --dbpath /etc/preload/ | sort) <(sort /etc/preload/pkg/list/org ) > //etc/preload/pkg/list/all
# Preload packages
pacman -Syuw --noconfirm --dbpath /etc/preload --logfile /etc/preload/preload.log
# Delete old packages
paccache -vrk2
Der Eintrag <rechername>
ist im Skript jeweils anzupassen.
Die Datei pkgpreload.sh nach /usr/local/bin/pkgpreload.sh abspeichern und mit einem
chmod +x /usr/local/bin/pkgpreload.sh
ausführbar machen.
Das Paket pacman-contrib sollte instaliert werden.
pacman -S pacman-contrib
systemd service
Service unter etc/systemd/system/abspeichern und danach aktivieren
systemctl enable --now pkgpreload.timer
# file-> /etc/systemd/system/pkgpreload.service
[Unit]
Description=preloads packages
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/pkgpreload.sh
[Install]
WantedBy=basic.target
systemd timer
Timer unter etc/systemd/system/ abspeichern und danach aktivieren
systemctl enable --now pkgpreload.service
# file-> /etc/systemd/system/pkgpreload.timer
[Unit]
Description=preloads packages
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=basic.target
Für alle anderen Rechner:
Den nfs Client einrichten
Die Angabe '/NAS' ist dabei wieder durch '/etc/preload/' zu ersetzen.
/etc/pacman.conf
In der /etc/pacman.conf oben eine Zeile einfügen. CacheDir=/etc/preload/pkg/
pacman Hook
Ein Verzeichnis hooks anlegen
mkdir /etc/pacman.d/hooks
Und die folgende pkglist.hook Datei dort abspeichern
Der <rechername>
ist zuvor anzupassen.
# file->/etc/pacman.d/hooks/pkglist.hook
[Trigger]
Type = Package
Operation = Install
Operation = Remove
Target = *
[Action]
Description = updating packagelist
When = PostTransaction
Exec = /bin/sh -c 'pacman -Qqe > /etc/preload/pkg/list/<rechername>; exit'
- Bearbeitet
Martin-MS Ich kann deshalb nicht erkennen, warum ein einfaches pacman -S zu einem inkonsistenten System führen sollte, solange man die Sync-Datenbank nicht aktualisiert.
Weil pacman -Syuw
ja gerade die Sync Datenbank aktualisiert!
Szenario:
# pacman -Syuw --noc
# pacman -S neues_programm
neues_programm
hat eine Dependency auf eine neue Version vonglib
, gegen die alle Pakete dieglib
benutzen neu gebaut wurden.- Du drückst Enter.
- Pacman installiert
neues_programm
und die neue Version vonglib
. - Alle anderen Programme, welche gegen die vorherige
glib
Version gebaut wurden (pacman
,sudo
) sind jetzt kaputt. - Tränen laufen deine Wangen herunter.
Wo dies gesagt ist: Ich verwende pacman -Syuw
selbst. Dies liegt allerdings daran, dass ich pacman nach einer anderen Philosophie benutze: -S
nur mit -u
. Wenn man sich das angewöhnt, gibt es keine Probleme mit partiellen Upgrades.
- Bearbeitet
Ein paar Anmerkungen habe ich doch ;-)
a) Hände weg von /etc !!!!
Es gibt keinen Grund die variablen Nutzdaten des Procederes, geschweige denn den Paketcache nach /etc zu legen. Vollkommen daneben...
Am Preload-Rechner würde ich den eigenen Sync-Cache nach /var/cache/preload packen oder /var/local/lib/preload.
Den Paket-Cache(-Pfad) des ProLoad-"Servers" würde ich nicht als Zwang antasten, also nichts an den /etc/pacman.conf->CacheDirs ändern. (Klar brauchst du den Hinweis, daß das Cache-Dir aller beteiligten Rechner dann auf das gemeinsam genutzte hin geändert werden müssen)
Im Beispiel gehe einfach davon aus das der wie Default in /var/cache/pacman/pkg liegt. Und der willige User diesen natürlich per NFS/SMB freigeben muß für die "Clients". Der User der solch eine Lösung sucht wird/sollte schon wissen wo sein Paketcache liegt wenn er eine eigene Lokalität hat.
Die "Freigabe" des Paketcaches muß natürlich für alle "Clients" schreibbar sein, sonst können diese ja kein Paket nachträglich in den gemeinsamen Cache packen was nicht pre-loaded wäre. Das muß der User konfigurieren.
Dann können die einzelnen "Clients" in dieses gemeinsame Cacheverzeichnis aber auch ihre lokalen Paketlisten $HOSTNAME.list ablegen.
b) pkgpreload.sh
Ich würde im Paket-Cache-Dir ein eigenes Verzeichnis (ggf. versteckt) namens preload anlegen (lassen). Dieses könnte dann die Paketlisten des "Servers" und der "Clients" enthalten, plus die durch das Skript selbst erstellten variablen Listen_Dateien.
sort -u /pacman/pkg/list/<rechername> /etc/preload/pkg/list/<rechnername> /etc/preload/pkg/list/<rechnername> > /etc/preload/pkg/list/all
Wenn die Dateien alle auf z.B. *.list enden würden könntest du das auch so erledigen:
(Ich gehe hier vom Paketcache in /var/cache/pacman/pkg/.preload aus, darin liegen die $HOSTNAME.list Files)
sort -u /var/cache/pacman/pkg/.preload/*.list > /var/cache/pacman/pkg/.preload/all
Das Globbing ersetzt hier dann die Notwendigkeit einzelne Rechnernamen editieren zu müssen.
Diese Syntax $HOSTNAME.list wäre dann eine Vorgabe an die der User sich zu halten hat (bzw. in den Hooks fest verankert).
Überhaupt würde ich da eher anfangs bestimmte Variablen setzen, die im eigentlichen Skript dann verwendet werden können.
Das könnten z.B. sein:
LISTDIR(Wo liegen die Paketlisten der Rechner)
(Vorschlag: Paketcache/.preload | $(pacconf CacheDir)/.preload)
(pacconf wäre im Paket pacutils enthalten)
PRELOAD_SYNC_DB(wo liegt die eigene Sync-DB für -Syuw)
(Vorschlag s.o:. /var/cache/preload oder /var/local/lib/preload)
Diese VARs kannst du dann im eigentlichen Nutzteil verwenden, wenn der User was verändern will kann das zentral über die Variable gehen.
c) Ob du paccache unbedingt als "Muß" einbauen mußt<g> wäre zu überlegen. Laß das den User entscheiden, dann kann das per Wiki z.B. mit eigenem Timer/Job verwiesen werden. Ein Hinweis auf paccache würde m.E. reichen.
d) Ob -Qqe zum Erstellen der Paketlisten reicht (also nur explizit installierte) mußt du ausprobieren, weiß ich nicht. Also ob der Pre-Download (-Syuw) dann auch die Abhängigkeiten nachzieht. Evtl. wäre ein komplette Paketliste doch besser um möglichst alle verfügbaren Pakete pre-loaden zu können.? (z.B. vom User installierte optionale Abhängigkeiten).
e) In den Hooks bzw. überall wo $HOSTNAME.list verwendet werden (und der User ggf. was anpassen sollte) könntest du auch direkt $(HOSTNAME).list verwenden.
- Bearbeitet
schard Dies liegt allerdings daran, dass ich pacman nach einer anderen Philosophie benutze: -S nur mit -u.
Oder halt -y nur mit -u . Ich persönlich verwende -y nur, wenn ich eben zeitnah auch ein Upgrade mache. (Gut, ich mache auch ne Ausnahme wenn ich genau weiß was ich tue<g>). Das Modified-Datum von /var/lib/pacman/sync versuche ich möglichst als Indikator für: Wann habe ich das letzte Update gemacht? zu verwenden. Muß man nicht im pacman.log revers greppen... (paclog fehlt so eine direkte Option/Filter).
Für alle andere Aktionen mit Paketen/pacman habe ich Tools die eben eine eigene Sync-DB verwenden.
schard Weil pacman -Syuw ja gerade die Sync Datenbank aktualisiert!
Deswegen auch meine Einschränkung
Martin-MS solange man die Sync-Datenbank nicht aktualisiert.
Den Kommentar
tuxnix Die Gefahr, dass wenn pacman -Syu nicht regelmäßig erfolgt, ein pacman -S zu einem inkonsistenten System führen kann, ist ja immer gegeben.
verstehe ich so, dass eben nicht die Datenbank synchronisiert wurde, und nach meinem Verständnis dann auch nicht die Gefahr eines inkonsistenten System bei einer Verwendung von pacman -S
bestehen kann.
- Bearbeitet
GerBra
Update der Anleitung - (ist um einiges kürzer geworden).
Alle deine Punkte wurden in der neuen Version berücksichtigt.
Dankeschön für deine Anregungen und diesmal gerne auch wieder mit viel Kritik falls nötig.
Es kann dadurch nur besser werden. 😉
Package-Preload (Beispiel)
Das folgende Beispiel zeigt die Möglichkeit auf den Download von neuen Paketen auf einem zentalen Rechner automatisch durchzuführen und die Pakete von dort aus auf andere Rechner zu verteilen.
Um die Gefahr eines partielles Upgrades, das die Konsistenz des Systems bei einen unbedachten pacman -S foobar
beschädigen könnte zu vermeiden, wird eine separate Sync-DB genutzt, damit die vorhandene Paketdatenbank weiterhin den jeweiligen Stand der Aktualität des Systems wiedergibt. Die Installation, der auf diese Weise vorab heruntergeladenen Pakete, wird dabei wie bisher mit dem Befehl pacman -Syu
auf jedem Rechner einzeln durchgeführt. Das upgrade läuft entsprechend schneller ab, da für bereits heruntergeladene Pakete auf den gemeinsam genutzten Paket Cache zugegriffen wird.
Für den Rechner (server) der das Package-Preload durchführen soll:
Vorbereitung
Für die separate Sync-Datenbank wird ein Verzeichnis angelegt und der Ordner local symbolisch darauf verlinkt.
mkdir /var/lib/preload
ln -s /var/lib/pacman/local/ /var/lib/preload
Einrichtung des nfs Servers
Im Unterschied zu dem Beispiel im Wiki-Artikel nfs Server wird in der Datei /etc/exports die Zeile
/var/cache/pacman/pkg <client>(rw,sync,no_root_squash)
hinzugefügt. Für <client> ist der entsprechende hostname des zugreifenden Rechners zu setzen. Für den Zugriff von weiteren Rechnern kann jeweils eine neue Zeile angelegt werden.
pkgpreload.sh
#!/usr/bin/env bash
# file-> /usr/local/bin/pkgpreload.sh
# Proof if root
if (( `id -u` != 0 )); then
echo "Sorry, you must be root."
exit
fi
ListDir="/var/cache/pacman/pkg"
PreLoad_DB="/var/lib/preload"
# Write and sort package lists
pacman -Qqe > ${ListDir}/${HOSTNAME}.list
sort -u ${ListDir}/*.list > ${ListDir}/org.list
# Ignore packages not available in our sync DB (like AUR and local installed packages)
comm -12 <(pacman -Slq --dbpath ${PreLoad_DB} | sort) <(sort ${ListDir}/org.list) > /${ListDir}/all.list
# Preload packages
pacman -Syuw --noconfirm --dbpath ${PreLoad_DB}
Die Datei pkgpreload.sh nach /usr/local/bin/pkgpreload.sh abspeichern und mit einem chmod +x /usr/local/bin/pkgpreload.sh
ausführbar machen.
Zusätzlich wäre zu überlegen, den Befehl paccache ins script zu integrieren um der Vorrat an alten Paketen zu limitieren.
systemd service
Service unter /etc/systemd/system/pkgpreload.service abspeichern und danach aktivieren
systemctl enable --now pkgpreload.service
# file-> /etc/systemd/system/pkgpreload.service
[Unit]
Description=preloads packages
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/pkgpreload.sh
[Install]
WantedBy=basic.target
systemd timer
Timer unter /etc/systemd/system/pkgpreload.timer abspeichern und danach aktivieren
systemctl enable --now pkgpreload.timer
Für andere Zeitintervalle siehe systemd/Timers
# file-> /etc/systemd/system/pkgpreload.timer
[Unit]
Description=preloads packages
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=basic.target
Für alle anderen Rechner:
Den nfs Client einrichten
Wie beim server ist auch hier das Paket nfs-utils zu installieren.
pacman -S nfs-utils
Danach ist der /etc/fstab Datei die folgende Zeile anzufügen.
<server>:/var/cache/pacman/pkg /var/cache/pacman/pkg nfs rw,nofail 0 0
Der Ausduck <server> ist hier durch den hostname des Servers zu ersetzen.
Nach einem reboot müsste die Verbindung stehen.
pacman Hook
Ein Verzeichnis hooks anlegen
mkdir /etc/pacman.d/hooks
Und die folgende pkglist.hook Datei dort abspeichern
# file->/etc/pacman.d/hooks/pkglist.hook
[Trigger]
Type = Package
Operation = Install
Operation = Remove
Target = *
[Action]
Description = updating packagelist
When = PostTransaction
Exec = /bin/sh -c 'pacman -Qqe > /var/cache/pacman/pkg/$HOSTNAME.list; exit'
- Bearbeitet
tuxnix
Ich schreibe mal nach und nach noch ein paar Dinge, kann etwas dauern. D.h. der beitrag wächst ggf. noch:
tuxnix [x] Paket-Cache(-Pfad) des ProLoad-"Servers" würde ich nicht als Zwang antasten -
Das hat mich bewogen gar keinen seperaten Cache Ordner mehr anzulegen.
Der Paketcache des Servers ist jetzt der Paketcache für alle Rechner. Dann muss man auch beim jeweiligen Client nicht an der /ect/pacman.conf herumschrauben.
Oder halt den Hinweis an den User, daß der Paketcache(CacheDir) der Clients in der pacman.conf dann auf das Mount-Dir der Freigabe zu ändern ist. Mein Server exportiert z.B. /srv/nfs/pkg (was ein Bind-mount von /var/cache/pacman/pkg ist), die Clients finden den lokal dann unter /mnt/servername/pkg. Dafür habe ich die pacman.conf angepaßt. Wichtig ist m.E. das der User versteht: es soll einen gemeinsamen Pkg-Cache geben und alle müssen dann darauf zugreifen.
tuxnix [x] paccache hab ich aus der Anleitung gestrichen. Privat nutze ich es weiter in dem script.
Einen Hinweis im diesem Wiki-Beitrag drauf zu geben finde ich ok. Hat ja was mit dem Thema zu tun. So a la "Bevor die Festplatte explodiert gibt es auch noch dieses Tool, was sich anbietet" -> Link zu paccache-Wiki (ggf. auf .org)
tuxnix [x] -Qqe tut es. Optionale Abhängigkeiten sind für pacman explizit installierte Pakete.
Auch für optionale Abhängigkeiten, die der User brav als --depend" installiert hat?
tuxnix Um die Gefahr eines partielles Upgrades, das die Konsistenz des Systems bei einen unbedachten pacman -S foobar beschädigen könnte zu vermeiden, wird eine separate Paketdatenbank für das Preload genutzt.
Keine separate Paketdatenbank, sondern eine extra Sync-Datenbank. Sowas wie "Für eine Liste der aktuell verfügbaren Pakete (Sync-Datenbank/-Sy) wird hier eine eigene benutzt, um die Gefahr von parti. Updates blabla zu vermeiden"
tuxnix Dabei wird der Paketbestand einzeln gelistet, sodass jeder Rechner nur die Pakete erhält die auf ihm schon installiert sind.
Verstehe ich nicht was du damit sagen willst.
paccache hast du im nächsten Satz auch noch drin, ich würde den Hinweis auf paccache (s.o.) ans Ende des beitrags schieben.
tuxnix Die Installation der auf diese Weise vorab heruntergeladenen Pakete wird dabei wie bisher mit dem Befehl pacman -Syu auf jedem Rechner separat durchgeführt.
Das würde ich um den Sinn des ganzen nochmal ausführen, daß dann halt im Idealfall schon die meisten Pakete im gemeinamen Cache vorhanden sind (und wg. -Syu der Clients nur die letzten wichtig wirklich neuen ggf. nachgezogen werden müssen).
tuxnix Vorbereitung
Für die separate preload Paketdatenbank wird ein Verzeichnis angelegt und der Ordner local symbolisch darauf verlinkt.
Das ist die separate Sync-Datenbank, nicht Paketdatenbank s.o.
tuxnix chmod 777 /var/cache/pacman/pkg
Das halte ich in einem Wiki-Beitrag für falsch. Warum soll der User ein Sicherheitsloch auf seinem Server aufmachen (777 für zu installierende Pakete). Kann jeder Hinz und Kunz Pakete "unterschieben"...
Am Server und auf den Clients werden für die pacman-Operation jeweils Root-Rechte gebraucht, das Cache-Dir am Server und auf den Clients kann/sollte also root:root 755 haben. Mit einem ordentlichen NFS-Export geht das auch (stichwort no_root_squash, da du irgendwo oben mal schriebst daß dein root-User an den Clienst auf nobody gemappt wird). Alles besser als 777...
tuxnix # Write and sort package lists,
delete AUR package names
pacman -Qqe > $ListDir/$HOSTNAME.list
sort -u $ListDir/*.list > $ListDir/org.list
comm -12 <(pacman -Slq --dbpath $PreLoad_DB | sort) <(sort $ListDir/org.list) > //$ListDir/all.list
"ignore packages not available in our sync DB (like AUR and local installed packages)"
Generell: In Scripts ist es generell besser auf (Pfad) und andere Variablen mittels "$(varname)" zuzugreifen (inkl. der Anführungszeichen). Ein Pfad kann auch mal Leerstellen enthalten.
tuxnix systemd service
Service unter /etc/systemd/system/ abspeichern und danach aktivieren
systemctl enable --now pkgpreload.timer
Da hast du glaube ich jeweils die Dateinamen von *.timer und .service verwechselt.
Beim Timer würde ich noch einen Hinweis auf das Intervall geben ("Im Beispiel machen wir einmal täglich einen PreDownload"). Kann der USer ja ändern wollen.
So, ich glaub das wars erstmal ;-)
"Kritisieren" macht ja so Spaß...<g> Nein, bitte nicht mißverstehen, ich habe eine große Achtung vor deinem Engagement gerade bzgl. Wiki-Beiträgen, okay?
- Bearbeitet
GerBra Auch für optionale Abhängigkeiten, die der User brav als --depend" installiert hat?
Ich habe unter pacman --depend nichts finden können. Auch die Suchmaschine gab nichts her.
Klär mich mal auf, sonst tappe ich hier im Dunkeln.
Das mit der Kritik ist übrigens völlig o.K.
Ich lerne gern dazu und finde das gut, wenn es hinterher korrekt ist.
Außerdem ist das ohnehin alles auch dein Verdienst. Ich wäre da allein bestimmt nicht darauf gekommen. Und soweit ich im Netz dazu gesucht habe gibt es auch keinen besseren Ansatz dazu als den deinen. Zudem hast du mit deiner Kritik meistens recht. Da kann ich dann auch nichts anderes sagen.
Fertig
Soweit es mich selbst betrifft. Alle deine Punkte habe ich berücksichtigt, außer den einen der oben steht.
Falls noch Verbesserungen möglich sind, was mich betrifft immer gerne.
Weil es Matthias zu lang wird, schlage ich vor, dass du oben alle Punkte löschst die du selbst für erledigt hältst. Ich hab ohnehin schon den Fehler gemacht oben zu korrigieren und wenn dann noch neue Punkte kommen sehe ich die dann besser.
Öhmm - ich glaube nicht, dass das Forum für eine derartig spezialisierte Diskussion noch der richtige Ort ist. Im Wiki gibt es dafür extra Diskussions-Seiten; dort kann man auch kollaborativ an einem Endprodukt feilen. Vielleicht macht ihr morgen besser dort weiter.