Package-Preload (Beispiel): Unterschied zwischen den Versionen

Aus wiki.archlinux.de
GerBra (Diskussion | Beiträge)
KKeine Bearbeitungszusammenfassung
 
(20 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{inuse|Tuxnix}}
{{righttoc}}
{{righttoc}}


Zeile 5: Zeile 6:


=== Der Server für das Package-Preload: ===
=== 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.
Ein Rechner wird als Server für das automatische Herunterladen der aktuellen Pakete bestimmt. Er sammelt für alle anderen Rechner die jeweiligen Paket Upgrades.
 
==== 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 ====
==== 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.
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)
  /var/cache/pacman <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.
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.
==== Sync-Datenbank ====
Ein Verzeichnis mit dem Rechnernamen wird angelegt und der lokale Teil der Paketdatenbank darauf symbolisch verlinkt.
mkdir /var/cache/pacman/preload-${HOSTNAME}
ln -s /var/lib/pacman/local/ /var/cache/pacman/preload-${HOSTNAME}


==== pkgpreload.sh ====
==== pkgpreload.sh ====
  #!/usr/bin/env bash
  #!/usr/bin/env bash
  # file-> /usr/local/bin/pkgpreload.sh
  # file-> /usr/local/bin/pkgpreload.sh
Zeile 25: Zeile 25:
  # Proof if root
  # Proof if root
  if (( `id -u` != 0 )); then
  if (( `id -u` != 0 )); then
echo "Sorry, you must be root."
  echo "Sorry, you must be root."
exit
  exit
  fi
  fi
   
   
  ## Variables
  for i in /var/cache/pacman/preload-*; do /usr/bin/pacman -Syuw --noconfirm --dbpath ${i}; done
# where we find the exported package lists of each host
ListDir="/var/cache/pacman/pkg"
# our own pacman sync DB to keep the system sync DB clean
PreLoad_DB="/var/lib/preload"
# use a own pacman logfile for the pre-download actions
# to keep the real pacman.log clean
pre_log="${PreLoad_DB}/predownload_pacman.log"
## Write and sort package lists
# package list of this server
pacman -Qqn > ${ListDir}/${HOSTNAME}.list
# create a unique package list from all hosts lists
sort -u ${ListDir}/*.list > ${ListDir}/all.list
  # Preload packages
pacman -Syuw --noconfirm --dbpath ${PreLoad_DB} - <${ListDir}/all.list
# Version with own logfile
#pacman -Syuw --noconfirm --dbpath ${PreLoad_DB} --logfile ${pre_log} - <${ListDir}/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:
  chmod +x /usr/local/bin/pkgpreload.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.
Tipp: Zusätzlich wäre zu überlegen, den Befehl [[Pacman#Paccache|paccache]] mit ins script aufzunehmen um den Vorrat an alten Paketen im cache zu limitieren.


==== systemd.service ====
==== systemd.service ====
Ein entsprechender Service ist anzulegen.
  # file-> /etc/systemd/system/pkgpreload.service
  # file-> /etc/systemd/system/pkgpreload.service
   
   
Zeile 69: Zeile 53:


==== systemd.timer ====
==== systemd.timer ====
Einen Timer erstellen, der den Service in den gewünschten Intervallen auslöst.
Für mögliche Zeitintervalle siehe: [[Systemd/Timers|Systemd/Timers]]
  # file-> /etc/systemd/system/pkgpreload.timer
  # file-> /etc/systemd/system/pkgpreload.timer
   
   
Zeile 80: Zeile 67:
  [Install]
  [Install]
  WantedBy=basic.target
  WantedBy=basic.target
Timer unter /etc/systemd/system/pkgpreload.timer abspeichern und danach aktivieren
Timer unter /etc/systemd/system/pkgpreload.timer abspeichern und danach aktivieren:
  systemctl enable --now pkgpreload.timer
  systemctl enable --now pkgpreload.timer
Für andere Zeitintervalle siehe: [[Systemd/Timers|Systemd/Timers]]


=== Für alle anderen Rechner: ===
=== Für alle anderen Rechner: ===
Zeile 91: Zeile 76:
  pacman -S nfs-utils
  pacman -S nfs-utils
Danach ist der /etc/fstab Datei die folgende Zeile anzufügen.
Danach ist der /etc/fstab Datei die folgende Zeile anzufügen.
  <server>:/var/cache/pacman/pkg /var/cache/pacman/pkgnfs   rw,nofail  0 0
  <server>:/var/cache/pacman /var/cache/pacman  rw,nofail  0 0
Der Ausdruck <server> ist hier durch den hostname des Servers zu ersetzen.
Der Ausdruck <server> ist hier durch den hostname des Servers zu ersetzen.
Nach einem {{ic|reboot}} sollte die Verbindung stehen.
Nach einem {{ic|reboot}} sollte die Verbindung stehen.


==== pacman Hook ====
==== pacman Hook ====
Ein Verzeichnis hooks anlegen
Falls noch nicht geschehen das Paket rsync installieren:
pacman -S rsync
Ein Verzeichnis hooks anlegen:
  mkdir /etc/pacman.d/hooks
  mkdir /etc/pacman.d/hooks
Und die folgende pkglist.hook Datei dort abspeichern
Und die folgende pkglist.hook Datei dort abspeichern
Zeile 103: Zeile 90:
  [Trigger]
  [Trigger]
  Type = Package
  Type = Package
Operation = Upgrade
  Operation = Install
  Operation = Install
  Operation = Remove
  Operation = Remove
Zeile 108: Zeile 96:
   
   
  [Action]
  [Action]
  Description = updating packagelist
  Description = Updating packagelist...
  When = PostTransaction
  When = PostTransaction
  Exec = /bin/sh -c 'pacman -Qqn  > /var/cache/pacman/pkg/$HOSTNAME.list; exit'
  Exec = /bin/sh -c '/usr/bin/rsync --mkpath --delete -r --ignore-existing /var/lib/pacman/local/ /var/cache/pacman/preload-${HOSTNAME}/local'
 
=== Siehe auch ===
=== Weblinks ===
 
[[Kategorie:Systemverwaltung]]

Aktuelle Version vom 29. November 2022, 15:28 Uhr

„Package-Preload (Beispiel)“ wurde von Tuxnix als in Bearbeitung markiert. Um Bearbeitungskonflikte zu vermeiden, kontaktiere Tuxnix bitte, bevor du den Artikel bearbeitest.


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. Er sammelt für alle anderen Rechner die jeweiligen Paket Upgrades.

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 <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.

Sync-Datenbank

Ein Verzeichnis mit dem Rechnernamen wird angelegt und der lokale Teil der Paketdatenbank darauf symbolisch verlinkt.

mkdir /var/cache/pacman/preload-${HOSTNAME}
ln -s /var/lib/pacman/local/ /var/cache/pacman/preload-${HOSTNAME}

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

for i in /var/cache/pacman/preload-*; do /usr/bin/pacman -Syuw --noconfirm --dbpath ${i}; done

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 

Tipp: Zusätzlich wäre zu überlegen, den Befehl paccache mit ins script aufzunehmen um den Vorrat an alten Paketen im cache zu limitieren.

systemd.service

Ein entsprechender Service ist anzulegen.

# 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

Einen Timer erstellen, der den Service in den gewünschten Intervallen auslöst. Für mögliche Zeitintervalle siehe: Systemd/Timers

# 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 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 /var/cache/pacman   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

Falls noch nicht geschehen das Paket rsync installieren:

pacman -S rsync

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 = Upgrade
Operation = Install
Operation = Remove
Target = *

[Action]
Description = Updating packagelist...
When = PostTransaction
Exec = /bin/sh -c '/usr/bin/rsync --mkpath --delete -r --ignore-existing /var/lib/pacman/local/ /var/cache/pacman/preload-${HOSTNAME}/local'

Siehe auch

Weblinks