Benutzer:Tuxnix: Unterschied zwischen den Versionen
Tuxnix (Diskussion | Beiträge) geleert Markierung: Geleert |
Tuxnix (Diskussion | Beiträge) Entwurf: Package-Preload (Beispiel) |
||
Zeile 1: | Zeile 1: | ||
# 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](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. | |||
## 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](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. | |||
### 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 einem `chmod +x /usr/local/bin/pkgpreload.sh` ausführbar machen. | |||
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. | |||
### systemd service | |||
Service unter /etc/systemd/system/pkgpreload.service abspeichern und danach aktivieren | |||
`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 | |||
Timer unter /etc/systemd/system/pkgpreload.timer abspeichern und danach aktivieren | |||
`systemctl enable --now pkgpreload.timer` | |||
Für andere Zeitintervalle siehe [systemd/Timers](https://wiki.archlinux.de/title/Systemd/Timers#Die_[Timer]_Sektion) | |||
``` | |||
# file-> /etc/systemd/system/pkgpreload.timer | |||
[Unit] | |||
Description=preloads packages | |||
[Timer] | |||
OnCalendar=daily | |||
Persistent=true | |||
[Install] | |||
WantedBy=basic.target | |||
``` | |||
## 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 Ausduck <server> ist hier durch den hostname des Servers zu ersetzen. | |||
Nach einem reboot müsste 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' | |||
``` |
Version vom 29. September 2022, 20:24 Uhr
- 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](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.
- 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](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.
- 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 einem `chmod +x /usr/local/bin/pkgpreload.sh` ausführbar machen. 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.
- systemd service
Service unter /etc/systemd/system/pkgpreload.service abspeichern und danach aktivieren `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
Timer unter /etc/systemd/system/pkgpreload.timer abspeichern und danach aktivieren `systemctl enable --now pkgpreload.timer` Für andere Zeitintervalle siehe [systemd/Timers](https://wiki.archlinux.de/title/Systemd/Timers#Die_[Timer]_Sektion) ```
- file-> /etc/systemd/system/pkgpreload.timer
[Unit] Description=preloads packages
[Timer] OnCalendar=daily Persistent=true
[Install] WantedBy=basic.target ```
- 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 Ausduck <server> ist hier durch den hostname des Servers zu ersetzen. Nach einem reboot müsste 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' ```