Eigenen Mirror erstellen

Aus wiki.archlinux.de

Dieser Artikel beschreibt, wie man sich einen eigenen Arch-Mirror anlegt, und diesen mit einem anderen Mirror synchronisiert.

Ein Großteil aller Arch-Nutzer wird dies nie benötigen. Es ist nur sinnvoll, einen eigenen Mirror zu betrieben, wenn man sehr viele Arch-Installationen versorgen will, oder wenn man selbst einen eigenen, offiziellen Mirror anbieten möchte.

Für den Heimgebrauch mit nur wenigen Rechnern eignet sich ein im Netzwerk geteilter Pacman-Cache eventuell besser. Auch existiert mit pacserve eine einfache Möglichkeit, den Cache im LAN zu verteilen, ohne einen zentralen Cache verwalten zu müssen.

Aufgrund der Tatsache, dass das Synchronisieren eines kompletten Repositorys viel Traffic verursacht, ist es nur offiziellen Mirrors gestattet, direkt von rsync.archlinux.org zu synchronisieren. Will man einen offiziellen Mirror betreiben, muss man sich auf der Arch-Mailingliste melden.

In der Mirrorliste sind alle offiziellen Mirrors verzeichnet. Bei vielen besteht auch die Möglichkeit, mittels rsync zu synchronisieren.

Vorbereitungen

Damit man einen Mirror betreiben kann, benötigt man ein Tool, um den eigenen Datenbestand mit einem anderen Mirror zu synchronisieren. Dieser Artikel basiert auf einer rsync-Lösung.

rsync ist im „extra“-Repository enthalten und kann aus diesem mittels Pacman installiert werden. Will man den Mirror tatsächlich (im LAN) anbieten, benötigt man noch einen FTP-Server. in dieserm Artikel wird hierfür vsftpd verwendet, der ebenfalls in „extra“ zu finden ist.

pacman -S rsync vsftpd

Damit vsftpd nicht mit den normalen Userrechten, oder gar als root läuft, ist es sinnvoll, hier einen eigenen User anzulegen.

useradd -m -s /bin/false mirror

Dieser User kann sich nicht einloggen, dies ist also deutlich sicherer, als ein User, der zum Beispiel die bash als Shell definiert hat.

Es müssen zudem Verzeichnisse angelegt werden, in denen Dateien abgelegt werden, die für den Synchronisationsprozess benötigt werden.

$ cd /home/mirror
$ su
# mkdir scripts files logs
# chown mirror:users scripts files logs

Alle weiteren Dateinamens-Angaben beziehen sich, wenn nicht anders angegeben auf /home/mirror/. Zudem wird weiterhin als root gearbeitet.

Synchronisationsscript

Das Synchronisieren des eigenen Mirrors mit einem anderen Mirror wird mittels eines Bash-Scriptes vorgenommen. Nachfolgendes script wird unter scripts/mirrorsync.sh gespeichert und ausführbar gemacht.

#!/bin/bash
#
# The script to sync a local mirror of the Arch Linux repositories and ISOs
#
# Copyright (C) 2007 Woody Gilk <woody@archlinux.org>
# Modifications by Dale Blount <dale@archlinux.org>
# and Roman Kyrylych <roman@archlinux.org>
# Comments translated to German by Dirk Sohler <dirk@0x7be.de>
# Licensed under the GNU GPL (version 2)

# Speicherorte für den Synchronisationsvorgang
SYNC_HOME="/home/mirror"
SYNC_LOGS="$SYNC_HOME/logs"
SYNC_FILES="$SYNC_HOME/files"
SYNC_LOCK="$SYNC_HOME/mirrorsync.lck"

# Auswahl der zu synchronisierenden Repositorys
# Gültige Optionen sind: core, extra, testing, iso
# Leer lassen, um den gesammten Mirror zu synchronisieren
# SYNC_REPO=(core extra testing iso)
SYNC_REPO=()

# Server, von dem synchronisiert werden soll
# Nur offizielle, öffentliche Mirrors dürfen rsync.archlinux.org verwenden
# SYNC_SERVER=rsync.archlinux.org::ftp
# Der selvnet.de Server kann nicht aufgelößt werden.
# SYNC_SERVER=rsync.selfnet.de::archlinux
# Daher nun der erste rsync Server von folgender Liste: https://www.archlinux.org/mirrors/status/
# Funktioniert Stand 04.10.2020
SYNC_SERVER=rsync://mirror.liteserver.nl/archlinux/
# An dieser Stelle weicht die Lokalisierte Version des Scripts von der
# Originalversion ab, da der Mirror in der Originalversion seit einigen
# Tagen nicht mehr synchronisiert wurde, und daher nur alte Pakete
# bereit stellte. Selfnet hat eine Quota von 50 GB fullspeed am Tag, und
# wird danach auf 16 KByte/s runtergestuft.

# Format des Logfile-Namens
# Das beispiel gibt etwas wie „sync_20091019-3.log“ aus
LOG_FILE="pkgsync_$(date +%Y%m%d-%H).log"

# Logfile anlegen und Timestamp einfügen
touch "$SYNC_LOGS/$LOG_FILE"
echo "=============================================" >> "$SYNC_LOGS/$LOG_FILE"
echo ">> Starting sync on $(date --rfc-3339=seconds)" >> "$SYNC_LOGS/$LOG_FILE"
echo ">> ---" >> "$SYNC_LOGS/$LOG_FILE"

if [ -z $SYNC_REPO ]; then
  # Sync a complete mirror
  rsync -rptlv \
        --delete-after \
        --safe-links \
        --max-delete=1000 \
        --copy-links \
        --delay-updates $SYNC_SERVER "$SYNC_FILES" \
        >> "$SYNC_LOGS/$LOG_FILE"
else
  # Alle Repositorys synchronisieren, die in $SYNC_REPO angegeben wurden
  for repo in ${SYNC_REPO[@]}; do
    repo=$(echo $repo | tr [:upper:] [:lower:])
    echo ">> Syncing $repo to $SYNC_FILES/$repo" >> "$SYNC_LOGS/$LOG_FILE"

    # Wenn man nur i686-Pakete synchronisieren will, kann man in dem
    # rsync-Aufruf dies nach „--delete-after“ inzufügen:
    # „ --exclude=os/x86_64“
    # 
    # Will man stattdessen nur die x86_64-Pakete synchronisieren, verwendet
    # man stattdessen „--exclude=os/i686“
    #
    # Will man beide Architekturen auf dem eigenen Mirror anbieten, lässt
    # den rsync-Aufruf einfach, wie er ist
    #
    rsync -rptlv \
          --delete-after \
          --safe-links \
          --max-delete=1000 \
          --copy-links \
          --delay-updates $SYNC_SERVER/$repo "$SYNC_FILES" \
          >> "$SYNC_LOGS/$LOG_FILE"

    # Erstellt eine Datei „$repo.lastsync“, die den Timestamp der synchronisation
    # beinhaltet (z. B. „2009-10-19 03:14:28+02:00“). Dies kann nützlich sein,
    # um einen Hinweis darauf zu haben, wann der eigene Mirror zuletzt mit
    # dem angegebenen Mirror abgeglichen wurde. Zum Verwenden einkommentieren.
    # date --rfc-3339=seconds > "$SYNC_FILES/$repo.lastsync"

    # Nach jedem Repository fünf Sekunden warten, um zu viele gleichzeitige 
    # Verbindungen zum rsync-Server zu verhindern, fall die Verbindung nach
    # dem synchronisieren des vorherigen Repositorys vom Server nicht
    # zeitig geschlossen wurde
    sleep 5 
  done
fi

# Weiteren Timestamp ins Logfile schreiben, und es schließen
echo ">> ---" >> "$SYNC_LOGS/$LOG_FILE"
echo ">> Finished sync on $(date --rfc-3339=seconds)" >> "$SYNC_LOGS/$LOG_FILE"
echo "=============================================" >> "$SYNC_LOGS/$LOG_FILE"
echo "" >> "$SYNC_LOGS/$LOG_FILE"

# Die lock-Datei zum Sperren des Script-Durchlaufs löschen und das
# Script beenden
rm -f "$SYNC_LOCK"
exit 0

Das Script muss natürlich an die eigenen Bedürfnisse angepasst werden. Gerade bei der Auswahl der Architekturen und Repositorys sollte man tatsächlich auch nur das angeben, was man selbst wirklich benötigt. Ein x86_64-Mirror mit den Repositorys „core“ und „extra“ umfasst etwa 15 Gigabyte.

Für jeden Mirror-Vorgang wird ein Logfile angelegt. Damit die Logfiles nicht überhand nehmen, sollte man zum beispiel LogRotate einrichten, oder aber ein Aufräumscript laufen lassen, wenn man sich nicht manuell um die Logfiles kümmern möchte.

Regelmäßiges Synchronisieren

Um den Mirror regelmäßig zu synchronisieren kommt Systemd zum Einsatz. Hierzu erstellt mane ine Service-Datei mit entsprechendem Inhalt.

/etc/systemd/system/archmirror.service
[Unit]
Description=running archmirror sync
[Service]
User=mirror
Type=simple
ExecStart=/home/mirror/scripts/mirrorsync.sh
[Install]
WantedBy=multi-user.target

Hier muss eventuell der User oder der Ort des Skriptes angepasst werden.

Zusätzlich wird ein Systemd-Timer benötigt, der das Script in regelmäßigen Abständen ausführt.

/etc/systemd/system/archmirror.timer
[Unit]
Description=run archmirror sync every hour
[Timer]
OnBootSec=10min
OnUnitActiveSec=1h
Unit=archmirror.service
[Install]
WantedBy=multi-user.target

Zehn Minuten nach dem Start des System beginnt der erste Durchlauf. Sobald das Skript beendet wurde beginnt der Countdown von einer Stunde.

Nachdem die Systemd-Dateien angelegt wurden muss einmalig systemctl daemon-reload ausgeführt werden um die Änderungen einzulesen. Dies muss auch nach Änderungen an schon bestehenden Dateien durchgeführt werden.

Der aktuelle Status wird mittels systemctl list-timers angezeigt. Dies liefert uns eine Ausgabe die, je nach System und Anzahl der Timer wie folgt aussieht.

NEXT                        LEFT         LAST                        PASSED       UNIT                         ACTIVATES
Sa 2015-10-31 11:15:09 UTC  41min left   Sa 2015-10-31 10:15:09 UTC  18min ago    archmirror.timer             archmirror.service

Mit systemctl status archmirror kann man sich eine kurze Statusübersicht anzeigen lassen. Wenn man ausführlichere Informationen über den Status des Timers erfahren möchte, verwendet man journalctl -u archmirror.

Konfiguration von Pacman

Je nachdem, ob man den eigenen Mirror nur Lokal verwenden möchte, oder ob man einen Server im Netz stehen hat, auf dem der Mirror läuft, und man diesen verwenden möchte, gibt es zwei Wege, die man beschreiten kann.

Rein lokaler Mirror

Wenn der Mirror nur lokal verwendet werden soll (wenn also der Server und der Client identisch sind), kann man dies direkt tun, ohne noch etwas an der Mirror-Konfiguration anpassen zu müssen. Man muss lediglich die Datei /etc/pacman.d/mirrorlist anpassen.

Server = file:///home/mirror/files/$repo/os/x86_64

Dies schreibt man in die este Zeile der Mirror-Liste. Wenn man nicht alle Repositorys synchronisiert, sollte man nach dieser Zeile weitere Mirrors angeben. Pacman geht die Liste so lange durch, bis es einen Server gefunden hat, auf dem das benötigte Paket vorhanden ist.

Mirror auf eigenem Server

Wenn der eigene Mirror sich auf einem anderen Rechner befindet, als der, der diesen Mirror benutzen soll (wenn man also einen Mirror in einem Netzwerk anbieten will), dann bedarf es noch der Einrichtung eines FTP-Servers auf dem Mirror-Server. Hierzu wird in diesem Artikel vsftpd verwendet.

Nach der Installation dieses Servers (siehe oben) wird er wie folgt konfiguriert.

# User, mit dessen Rechten der Server laufen soll
nopriv_user=mirror
 
# Username für den anonymen Login, identisch mit nopriv_user
ftp_username=mirror

# Das Startverzeichnis für den anonymen User
anon_root=/home/mirror/files
# Weitere Konfiguration 
listen=YES
tcp_wrappers=YES
use_localtime=YES
hide_ids=YES
anonymous_enable=YES
no_anon_password=YES
ls_recurse_enable=YES
idle_session_timeout=120
data_connection_timeout=30

Der so konfigurierte Server ist sehr sicher. Man braucht für den zugriff kein Passwort, und sollte daher nicht öffentlich zugänglich sein (außer, das ist beabsichtigt, weil man einen öffentlichen Mirror anbieten will). Einschränken kann man den Zugriff beispielsweise über die Datei /etc/hosts.allow oder Portforwarding-Regeln auf dem Router.

Der Passwortschutz für den FTP-Zugang zum Mirror bei gleichzeitiger Funktionalität als normaler, mit Pacman abrufbarer Mirror wird in diesem Artikel nicht behandelt.

Um den Zugriff auf den Mirror von anderen Rechnern aus zu ermöglichen muss man jetzt nur noch die Datei /etc/hosts.allow anpassen.

vsftpd : ALL : ALL

Hinweis: Mit dieser einstellung darf jeder von dem Mirror herunterladen. dies ist allerdings konfigurierbar, siehe man hosts.allow oder bei den Weblinks

Wenn alles soweit konfiguriert wurde, kann man vsftpd starten.

/etc/rc.d/vsftpd start

Nun kann man in der Datei /etc/pacman.d/mirrorlist, je nachdem, ob der Server im DNS vorhanden ist, oder nicht, den eigenen Mirror ganz normal als Quelle hinzufügen.

Server = ftp://192.168.1.21/$repo/os/x86_64
# Server = ftp://hostname/$repo/os/x86_64
# Server = ftp://localhost/$repo/os/x86_64

Im Beispiel wird der Server über seine IP angesprochen. Auskommentiert sind das ansprechen über den im DNS vorhandenen Hostname, sowie das ansprechen des Mirrors über localhost. Wenn man die IP verwendet, sollte man dafür Sorge tragen, dass der Server immer über die Selbe IP erreichbar ist.

Die erste Synchronisation

Wenn man den eigenen Mirror das erste Mal mit einem anderen Mirror synchronisiert, dauert dies, abhängig von der Internetverbindung, mehrere Stunden. Jedes weitere synchronisieren geht schneller, da nur jeweils aktualisierte Pakete übertragen werden. Man kann wahlweise bis zum in der Crontab angegebenen Zeitpunkt warten, oder das Synchronisieren, zum beispiel in einer screen-Session oder mit nohup manuell starten.

su -c "mirror /home/mirror/scripts/mirrorsync.sh"

Es wird nichts ausgegeben, da das Script auch als Cronjob läuft, und dann jedes mal unnötig System-Mails generiert werden würden. Will man trotzdem einen Status sehen, kann man dies mittels des tail-Befehls.

tail -f logs/pkgsync_20091015-7.log

Der Dateiname richtet sich bei der Konfiguration nach in diesem Artikel nach folgendem Schema: logs/pkgsync_YYMMDD-HH.

Nach dem ersten Synchronisieren sollte man ein Mal pacman -Sy ausführen, um zu überprüfen, ob der Mirror ordungsgemäß funktioniert.

Siehe auch

Weblinks


Dieser Artikel (oder Teile davon) steht unter GNU FDL (GNU Freie Dokumentationslizenz) und ist eine Übersetzung aus dem ArchLinux.org Wiki. Am Original-Artikel kann jeder Korrekturen und Ergänzungen vornehmen. Im ArchLinux.org Wiki ist eine Liste der Autoren verfügbar.