Benutzer:Tuxnix: Unterschied zwischen den Versionen

Aus wiki.archlinux.de
Tuxnix (Diskussion | Beiträge)
KKeine Bearbeitungszusammenfassung
Tuxnix (Diskussion | Beiträge)
edit
Zeile 1: Zeile 1:
Entwurf: Package-Preload (Beispiel)
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.
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](https://wiki.archlinux.de/title/Pacman#Keine_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.
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:
=== Für den Rechner (server) der das Package-Preload durchführen soll: ===


### Vorbereitung
==== Vorbereitung ====
Für die separate Sync-Datenbank wird ein Verzeichnis angelegt und der Ordner local symbolisch darauf verlinkt.
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](https://wiki.archlinux.de/title/Network_File_System) wird in der Datei /etc/exports die Zeile
`/var/cache/pacman/pkg <client>(rw,sync,no_root_squash)` hinzugefügt.  Für <client> ist der entsprechende hostname des zugreifenden Rechners zu setzen. Für den Zugriff von weiteren Rechnern kann jeweils eine neue Zeile angelegt werden.


mkdir /var/lib/preload
ln -s /var/lib/pacman/local/ /var/lib/preload


### pkgpreload.sh
==== 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.
#!/usr/bin/env bash
/var/cache/pacman/pkg <client>(rw,sync,no_root_squash)
# file-> /usr/local/bin/pkgpreload.sh
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.


# Proof if root
==== pkgpreload.sh ====
if (( `id -u` != 0 )); then
echo "Sorry, you must be root."
exit
fi


ListDir="/var/cache/pacman/pkg"
#!/usr/bin/env bash
PreLoad_DB="/var/lib/preload"
# 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}


# Write and sort package lists
Die Datei pkgpreload.sh nach /usr/local/bin/pkgpreload.sh abspeichern und mit dem folgen Befehl ausführbar machen.  
pacman -Qqe > ${ListDir}/${HOSTNAME}.list
chmod +x /usr/local/bin/pkgpreload.sh
sort -u ${ListDir}/*.list > ${ListDir}/org.list
Zusätzlich wäre zu überlegen, den Befehl [[Pacman#Paccache|paccache]] ins script zu integrieren um der Vorrat an alten Paketen zu limitieren.


# Ignore packages not available in our sync DB (like AUR and local installed packages)
==== systemd service ====
comm -12 <(pacman -Slq --dbpath ${PreLoad_DB} | sort) <(sort ${ListDir}/org.list) > /${ListDir}/all.list
# file-> /etc/systemd/system/pkgpreload.service
 
# Preload packages
[Unit]
pacman -Syuw --noconfirm --dbpath ${PreLoad_DB}
Description=preloads packages
```
After=network-online.target
Die Datei pkgpreload.sh nach /usr/local/bin/pkgpreload.sh abspeichern und mit einem `chmod +x /usr/local/bin/pkgpreload.sh` ausführbar machen.
Wants=network-online.target
Zusätzlich wäre zu überlegen, den Befehl [paccache](https://wiki.archlinux.de/title/Pacman#Paccache) ins script zu integrieren um der Vorrat an alten Paketen zu limitieren.
 
[Service]
### systemd service
ExecStart=/usr/local/bin/pkgpreload.sh
[Install]
WantedBy=basic.target
Service unter /etc/systemd/system/pkgpreload.service abspeichern und danach aktivieren
Service unter /etc/systemd/system/pkgpreload.service abspeichern und danach aktivieren
`systemctl enable --now pkgpreload.service`
systemctl enable --now pkgpreload.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
```


### systemd timer
==== 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
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](https://wiki.archlinux.de/title/Systemd/Timers#Die_[Timer]_Sektion)
Für andere Zeitintervalle siehe [[Systemd/Timers#Die_[Timer]_Sektion|systemd/Timers]]
```
# file-> /etc/systemd/system/pkgpreload.timer
 
[Unit]
Description=preloads packages


[Timer]
OnCalendar=daily
Persistent=true


[Install]
=== Für alle anderen Rechner: ===
WantedBy=basic.target
```


## Für alle anderen Rechner:
==== Den nfs Client einrichten ====
 
### Den nfs Client einrichten
Wie beim server ist auch hier das Paket nfs-utils zu installieren.
Wie beim server ist auch hier das Paket nfs-utils zu installieren.
`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/pkg nfs rw,nofail 0 0`
<server>:/var/cache/pacman/pkg /var/cache/pacman/pkg nfs rw,nofail 0 0
Der Ausduck <server> ist hier durch den hostname des Servers zu ersetzen.
Der Ausdruck <server> ist hier durch den hostname des Servers zu ersetzen.
Nach einem reboot müsste die Verbindung stehen.
Nach einem reboot sollte die Verbindung stehen.


### pacman Hook
==== pacman Hook ====
Ein Verzeichnis hooks anlegen
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
```
# file->/etc/pacman.d/hooks/pkglist.hook
# file->/etc/pacman.d/hooks/pkglist.hook
 
[Trigger]
[Trigger]
Type = Package
Type = Package
Operation = Install
Operation = Install
Operation = Remove
Operation = Remove
Target = *
Target = *
 
[Action]
[Action]
Description = updating packagelist
Description = updating packagelist
When = PostTransaction
When = PostTransaction
Exec = /bin/sh -c 'pacman -Qqe  > /var/cache/pacman/pkg/$HOSTNAME.list; exit'
Exec = /bin/sh -c 'pacman -Qqe  > /var/cache/pacman/pkg/$HOSTNAME.list; exit'
```

Version vom 30. September 2022, 01:43 Uhr

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