Package-Preload (Beispiel): Unterschied zwischen den Versionen
GerBra (Diskussion | Beiträge) |
GerBra (Diskussion | Beiträge) →pkgpreload.sh: Variablennamen geändert, Sync-DB Filter am Server wieder aktiviert. |
||
Zeile 24: | Zeile 24: | ||
# Proof if root | # Proof if root | ||
if (( `id -u` != 0 )); then | |||
echo "Sorry, you must be root." | |||
exit | |||
fi | fi | ||
## Variables | ## Variables | ||
# where we find the exported package lists of each host | # where we find the exported package lists of each host | ||
pre_listdir="/var/cache/pacman/pkg" | |||
# our own pacman sync DB to keep the system sync DB clean | # our own pacman sync DB to keep the system sync DB clean | ||
pre_syncdb="/var/lib/preload" | |||
# | ## write, sort and clean package lists | ||
# package list of this server | # package list of this server | ||
pacman -Qqn > ${ | pacman -Qqn > ${pre_listdir}/${HOSTNAME}.list | ||
# create a unique package list from all hosts lists | # create a unique package list from all hosts lists | ||
sort -u ${ | sort -u ${pre_listdir}/*.list > ${pre_listdir}/all.list | ||
# clean the all.list from packages which could not pre-downloaded on this server | |||
comm -12 <(pacman -Slq --dbpath ${pre_syncdb} | sort) <(sort ${pre_listdir}/all.list ) > ${pre_listdir}/cleaned_all.list | |||
pacman - | # preload the packages from the list | ||
# | pacman -Syuw --noconfirm --dbpath ${pre_syncdb} - <${pre_listdir}/cleaned_all.list | ||
Die Datei pkgpreload.sh nach /usr/local/bin/pkgpreload.sh abspeichern und mit dem folgen Befehl ausführbar machen. | Die Datei pkgpreload.sh nach /usr/local/bin/pkgpreload.sh abspeichern und mit dem folgen Befehl ausführbar machen. |
Version vom 2. Oktober 2022, 10:29 Uhr
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 alle anderen Rechner zu verteilen.
Um die Gefahr eines partiellen Upgrades, das die Konsistenz des Systems bei einen unbedachten pacman -S foobar
beschädigen könnte zu vermeiden, wird eine separate Sync-DB genutzt. Somit bleibt die originäre Paketdatenbank unangetastet und kann weiterhin den realen Stand des Systems wiedergeben. Das Upgrade des Systems wird wie bisher mit dem Befehl pacman -Syu
auf jedem Rechner einzeln durchgeführt. Die Installation der neuen Pakete läuft entsprechend schneller ab, da die meisten Pakete schon vorab in den gemeinsam genutzten Paket-Cache geladen wurden.
Der Server für das Package-Preload:
Ein Rechner wird als Server für das automatische Herunterladen der aktuellen Pakete bestimmt und folgende Installation durchgeführt.
Sync-Datenbank
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 folgende Zeile hinzugefügt.
/var/cache/pacman/pkg <client>(rw,sync,no_root_squash)
Für <client> ist hier 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 ## Variables # where we find the exported package lists of each host pre_listdir="/var/cache/pacman/pkg" # our own pacman sync DB to keep the system sync DB clean pre_syncdb="/var/lib/preload" ## write, sort and clean package lists # package list of this server pacman -Qqn > ${pre_listdir}/${HOSTNAME}.list # create a unique package list from all hosts lists sort -u ${pre_listdir}/*.list > ${pre_listdir}/all.list # clean the all.list from packages which could not pre-downloaded on this server comm -12 <(pacman -Slq --dbpath ${pre_syncdb} | sort) <(sort ${pre_listdir}/all.list ) > ${pre_listdir}/cleaned_all.list # preload the packages from the list pacman -Syuw --noconfirm --dbpath ${pre_syncdb} - <${pre_listdir}/cleaned_all.list
Die Datei pkgpreload.sh nach /usr/local/bin/pkgpreload.sh abspeichern und mit dem folgen Befehl ausführbar machen.
chmod +x /usr/local/bin/pkgpreload.sh
Zusätzlich wäre zu überlegen, den Befehl paccache ins script zu integrieren um den Vorrat an alten Paketen zu limitieren.
systemd.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
Den Service unter /etc/systemd/system/pkgpreload.service abspeichern.
systemd.timer
# file-> /etc/systemd/system/pkgpreload.timer [Unit] Description=preloads packages [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=basic.target
Timer unter /etc/systemd/system/pkgpreload.timer abspeichern und danach aktivieren
systemctl enable --now pkgpreload.timer
Für andere Zeitintervalle siehe: Systemd/Timers
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/pkgnfs rw,nofail 0 0
Der Ausdruck <server> ist hier durch den hostname des Servers zu ersetzen.
Nach einem reboot
sollte 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 -Qqn > /var/cache/pacman/pkg/$HOSTNAME.list; exit'