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/
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:
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'