Eigenen Mirror erstellen: Unterschied zwischen den Versionen
Dirk (Diskussion | Beiträge) |
Dirk (Diskussion | Beiträge) K code → ic |
||
Zeile 29: | Zeile 29: | ||
# chown mirror:users scripts files logs | # chown mirror:users scripts files logs | ||
Alle weiteren Dateinamens-Angaben beziehen sich, wenn nicht anders angegeben auf | Alle weiteren Dateinamens-Angaben beziehen sich, wenn nicht anders angegeben auf {{ic|/home/mirror/}}. Zudem wird weiterhin als root gearbeitet. | ||
== Synchronisationsscript == | == Synchronisationsscript == | ||
Das Synchronisieren des eigenen Mirrors mit einem anderen Mirror wird mittels eines Bash-Scriptes vorgenommen. Nachfolgendes script wird unter | Das Synchronisieren des eigenen Mirrors mit einem anderen Mirror wird mittels eines Bash-Scriptes vorgenommen. Nachfolgendes script wird unter {{ic|scripts/mirrorsync.sh}} gespeichert und ausführbar gemacht. | ||
#!/bin/bash | #!/bin/bash | ||
Zeile 145: | Zeile 145: | ||
== Regelmäßiges Synchronisieren == | == Regelmäßiges Synchronisieren == | ||
{{hinweis|Sollte noch kein [[Cron]]-Daemon installiert sein, so muss dies erst gemacht werden. Die Anleitung dazu bietet der Artikel zu Cron hier im Wiki.}} | {{hinweis|Sollte noch kein [[Cron]]-Daemon installiert sein, so muss dies erst gemacht werden. Die Anleitung dazu bietet der Artikel zu Cron hier im Wiki.}} | ||
Die Crontab für den durch | Die Crontab für den durch {{ic|/bin/false}} als Shell stark eingeschränkten user wird unter {{ic|scripts/mirror.cron}} angelegt. und direkt mit einer Zeile gefüllt. | ||
echo "0 3 * * * /home/mirror/scripts/mirrorsync.sh" > scripts/mirror.cron | echo "0 3 * * * /home/mirror/scripts/mirrorsync.sh" > scripts/mirror.cron | ||
Zeile 151: | Zeile 151: | ||
su -c "crontab -u mirror scripts/mirror.cron" | su -c "crontab -u mirror scripts/mirror.cron" | ||
Hiermit wird über den root-Account als User | Hiermit wird über den root-Account als User {{ic|mirror}} die Crontab eingerichtet, und dabei {{ic|scripts/mirror.cron}} verwendet. Zum überprüfen, ob das funktioniert hat, kann man {{ic|crontab -l}} verwenden. | ||
{{hc|su -c "crontab -u mirror -l"|0 3 * * * /home/mirror/scripts/mirrorsync.sh}} | {{hc|su -c "crontab -u mirror -l"|0 3 * * * /home/mirror/scripts/mirrorsync.sh}} | ||
Wenn es so aussieht, wie im Beispiel, ist alles in Ordnung. Dieser Cronjob führt das Synchronisationsscript nachts um drei Uhr aus. Will man die Crontab bearbeiten, so verwendet man | Wenn es so aussieht, wie im Beispiel, ist alles in Ordnung. Dieser Cronjob führt das Synchronisationsscript nachts um drei Uhr aus. Will man die Crontab bearbeiten, so verwendet man {{ic|su -c "mirror crontab -e"}}. Stattdessen kann man auch {{ic|scripts/mirror.cron}} direkt bearbeiten, muss dann aber mittels {{ic|su -c "mirror crontab scripts/mirror.cron"}} die Crontab manuell neu einlesen. | ||
== Konfiguration von Pacman == | == Konfiguration von Pacman == | ||
Zeile 161: | Zeile 161: | ||
=== Rein lokaler Mirror === | === 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 | 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 {{ic|/etc/pacman.d/mirrorlist}} anpassen. | ||
Server = file:///home/mirror/files/$repo/os/x86_64 | Server = file:///home/mirror/files/$repo/os/x86_64 | ||
Zeile 192: | Zeile 192: | ||
data_connection_timeout=30 | 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 | 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 {{ic|/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. | 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 | Um den Zugriff auf den Mirror von anderen Rechnern aus zu ermöglichen muss man jetzt nur noch die Datei {{ic|/etc/hosts.allow}} anpassen. | ||
vsftpd : ALL : ALL | vsftpd : ALL : ALL | ||
{{hinweis|Mit dieser einstellung darf jeder von dem Mirror herunterladen. dies ist allerdings konfigurierbar, siehe | {{hinweis|Mit dieser einstellung darf jeder von dem Mirror herunterladen. dies ist allerdings konfigurierbar, siehe {{ic|man hosts.allow}} oder bei den Weblinks}} | ||
Wenn alles soweit konfiguriert wurde, kann man vsftpd starten. | Wenn alles soweit konfiguriert wurde, kann man vsftpd starten. | ||
Zeile 206: | Zeile 206: | ||
/etc/rc.d/vsftpd start | /etc/rc.d/vsftpd start | ||
Nun kann man in der Datei | Nun kann man in der Datei {{ic|/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://192.168.1.21/$repo/os/x86_64 | ||
Zeile 219: | Zeile 219: | ||
su -c "mirror /home/mirror/scripts/mirrorsync.sh" | 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 | 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 {{ic|tail}}-Befehls. | ||
tail -f logs/pkgsync_20091015-7.log | tail -f logs/pkgsync_20091015-7.log | ||
Der Dateiname richtet sich bei der Konfiguration nach in diesem Artikel nach folgendem Schema: | Der Dateiname richtet sich bei der Konfiguration nach in diesem Artikel nach folgendem Schema: {{ic|logs/pkgsync_YYMMDD-HH}}. | ||
Nach dem ersten Synchronisieren sollte man ein Mal | Nach dem ersten Synchronisieren sollte man ein Mal {{ic|pacman -Sy}} ausführen, um zu überprüfen, ob der Mirror ordungsgemäß funktioniert. | ||
== Siehe auch == | == Siehe auch == | ||
* [[Eigene Repositories erstellen]] | * [[Eigene Repositories erstellen]] | ||
* Wiki-Artikel zur Funktionsweise von [[rsync]] | * Wiki-Artikel zur Funktionsweise von [[rsync]] | ||
* [[Hosts.deny]] – das Gegenstück zur angesprochenen | * [[Hosts.deny]] – das Gegenstück zur angesprochenen {{ic|hosts.allow}} | ||
* Der Paketmanager [[Pacman]] | * Der Paketmanager [[Pacman]] | ||
Version vom 27. Januar 2013, 20:06 Uhr
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 pkgd 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 \ --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 \ --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
Hinweis: Sollte noch kein Cron-Daemon installiert sein, so muss dies erst gemacht werden. Die Anleitung dazu bietet der Artikel zu Cron hier im Wiki.
Die Crontab für den durch /bin/false
als Shell stark eingeschränkten user wird unter scripts/mirror.cron
angelegt. und direkt mit einer Zeile gefüllt.
echo "0 3 * * * /home/mirror/scripts/mirrorsync.sh" > scripts/mirror.cron chown mirror:users scripts/mirror.cron su -c "crontab -u mirror scripts/mirror.cron"
Hiermit wird über den root-Account als User mirror
die Crontab eingerichtet, und dabei scripts/mirror.cron
verwendet. Zum überprüfen, ob das funktioniert hat, kann man crontab -l
verwenden.
su -c "crontab -u mirror -l"
0 3 * * * /home/mirror/scripts/mirrorsync.sh
Wenn es so aussieht, wie im Beispiel, ist alles in Ordnung. Dieser Cronjob führt das Synchronisationsscript nachts um drei Uhr aus. Will man die Crontab bearbeiten, so verwendet man su -c "mirror crontab -e"
. Stattdessen kann man auch scripts/mirror.cron
direkt bearbeiten, muss dann aber mittels su -c "mirror crontab scripts/mirror.cron"
die Crontab manuell neu einlesen.
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. |