Eigenen Mirror erstellen
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, community, iso # Leer lassen, um den gesammten Mirror zu synchronisieren # SYNC_REPO=(core extra testing community 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 SYNC_SERVER=rsync.selfnet.de::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" # Die nachfolgenden Zeilen verhindern, dass dieses Script mehrmals # gleichzeitig ausgeführt wird, und sollten daher nicht geändert werden if [ ! -d $SYNC_HOME ]; then echo "$SYNC_HOME does not exist, please create it, then run this script again." exit 1 fi [ -f $SYNC_LOCK ] && exit 1 touch "$SYNC_LOCK" # Ende des Blocks, der nicht bearbeitet werden sollte # 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“, „extra“ und „community“ 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 umdie Logfiles kümmern möchte.
Regelmäßiges Synchronisieren
Um den Mirror regelmäßig zu Synchronisieren benutzen wir Systemd
Wir benötigen zum einen die klassische .service
Datei um das Skript mit den passenden Argumenten zu starten.
Dies könnte so aussehen:
# /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 ggf. der User und/oder der Ort des Skriptes angepasst werden.
Zusätzlich brauchen wir das .timer
. Mit diesem regeln wir den Zeitlichen Ablauf des Skriptes.
# /etc/systemd/system/archmirror.timer [Unit] Desciption=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. Näheres dazu findet man aber auch unter Systemd
Um uns über den aktuellen Stand zu informieren können wir systemctl list-timers
benutzen. Dies liefert uns eine Ausgabe die, je nach System und Anzahl der Timer, so aussehen sollte:
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
können wir uns auch eine kurze Statusübersicht anzeigen lassen. Wer es etwas ausführlicher mag, kann journalctl -u archmirror
benutzen.
Durch die Nutzung von Systemd ist es auch nicht mehr notwendig ein seperates LOCK-File anzulegen. Systemd kümmert sich automatisch darum, immer nur eine Instanz des Skriptes zu starten. Es empfiehlt sich daher, die entsprechenden Zeilen aus dem Skript zu entfernen.
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ängen 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
- Eigene Repositories erstellen
- Wiki-Artikel zur Funktionsweise von rsync
- Hosts.deny – das Gegenstück zur angesprochenen
hosts.allow
- Der Paketmanager Pacman
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. |