Package-Preload (Beispiel): Unterschied zwischen den Versionen

Aus wiki.archlinux.de
Zeile 18: Zeile 18:
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.
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.


==== pkgpredownload.sh ====
==== pkgpreload.sh ====


  #!/usr/bin/env bash
  #!/usr/bin/env bash
  # file-> /usr/local/bin/pkgpredownload.sh
  # file-> /usr/local/bin/pkgpreload.sh
   
   
  # Proof if root
  # Proof if root
Zeile 29: Zeile 29:
  fi
  fi
   
   
  ## Variables
  # Paths
  # where we find the exported package lists of each host
  ListDir="/var/cache/pacman/pkg"
pre_listdir="/var/cache/pacman/pkg"
  PreloadDB="/var/lib/preload"
  # our own pacman sync DB to keep the system sync DB clean
pre_syncdb="/var/lib/preload"
    
    
  ## write, sort and clean package lists
  # Write, a pakage list for this host
# package list of this server
  pacman -Qq > ${ListDir}/${HOSTNAME}.list
  pacman -Qqn > ${pre_listdir}/${HOSTNAME}.list
 
  # create a unique package list from all hosts lists
  # Create a unique.list for all hosts
  sort -u ${pre_listdir}/*.list > ${pre_listdir}/all.list
  sort -u ${ListDir}/*.list > ${ListDir}/unique.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  
  # Clean unique.list from extra packages like AUR
  # preload the packages from the list
  comm -12 <(pacman -Slq --dbpath ${PreloadDB} | sort) <(sort ${ListDir}/unique.list ) > \${ListDir}/cleaned.list
  pacman -Syuw --noconfirm --dbpath ${pre_syncdb} - <${pre_listdir}/cleaned_all.list
  # Preload packages
  pacman -Syuw --noconfirm --dbpath ${PreloadDB} - <${ListDir}/cleaned.list


Die Datei pkgpredownload.sh nach /usr/local/bin/pkgpredownload.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.  
  chmod +x /usr/local/bin/pkgpredownload.sh  
  chmod +x /usr/local/bin/pkgpreload.sh  
Zusätzlich wäre zu überlegen, den Befehl [[Pacman#Paccache|paccache]] ins script zu integrieren um den Vorrat an alten Paketen zu limitieren.
Zusätzlich wäre zu überlegen, den Befehl [[Pacman#Paccache|paccache]] ins script zu integrieren um den Vorrat an alten Paketen zu limitieren.



Version vom 6. Oktober 2022, 13:28 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

# Paths
ListDir="/var/cache/pacman/pkg"
PreloadDB="/var/lib/preload"
 
# Write, a pakage list for this host
pacman -Qq > ${ListDir}/${HOSTNAME}.list
 
# Create a unique.list for all hosts
sort -u ${ListDir}/*.list > ${ListDir}/unique.list

# Clean unique.list from extra packages like AUR
comm -12 <(pacman -Slq --dbpath ${PreloadDB} | sort) <(sort ${ListDir}/unique.list ) > \${ListDir}/cleaned.list

# Preload packages
pacman -Syuw --noconfirm --dbpath ${PreloadDB} - <${ListDir}/cleaned.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/pkg   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'

Siehe auch

Weblinks