|
|
Zeile 1: |
Zeile 1: |
| Entwurf:
| |
|
| |
|
| == 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 [[Pacman#Keine_partiellen_Upgrades|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, 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 [[Network_File_System|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
| |
|
| |
| 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 dem folgen Befehl ausführbar machen.
| |
| chmod +x /usr/local/bin/pkgpreload.sh
| |
| Zusätzlich wäre zu überlegen, den Befehl [[Pacman#Paccache|paccache]] ins script zu integrieren um der 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
| |
| Service unter /etc/systemd/system/pkgpreload.service abspeichern und danach aktivieren
| |
| systemctl enable --now pkgpreload.service
| |
|
| |
|
| |
| ==== 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#Die_[Timer]_Sektion|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/pkg nfs 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 -Qqe > /var/cache/pacman/pkg/$HOSTNAME.list; exit'
| |