Manuel Wildauers blog

Ein eigener Mirror für Arch Linux

Wenn man mehere Systeme rumstehen hat die alle mit Updates versorgt werden wollen, macht es Sinn einen eigenen Mirror für die Pakete zu haben.

So müssen nicht alle Systeme sich mit einem entfernten Mirror vebinden und mühselig die Pakete über das Internet ziehen, sondern nur über das lokale Netz, was in den meisten Fällen auch deutlich schneller ist. Alles was man dafür tun muss ist, ein eigenen Mirror einrichten.

Das Synchronisieren der Pakete kann man zum Beispiel mit diesem Script machen.

#!/bin/bash

# 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"

SYNC_REPO=(core extra)
SYNC_SERVER=rsync.selfnet.de::archlinux
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"

for repo in ${SYNC_REPO[@]}; do
	repo=$(echo $repo | tr [:upper:] [:lower:])
	echo ">> Syncing $repo to $SYNC_FILES/$repo" >> "$SYNC_LOGS/$LOG_FILE"

	rsync -rptlv \
          --delete-after \
          --safe-links \
          --max-delete=1000 \
          --copy-links \
          --delay-updates $SYNC_SERVER/$repo "$SYNC_FILES" \
	  --exclude=os/i686 \
          >> "$SYNC_LOGS/$LOG_FILE"

	date --rfc-3339=seconds > "$SYNC_FILES/$repo.lastsync"
	sleep 5
  done

# 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"

rm -f "$SYNC_LOCK"
exit 0

Über einen Cronjob kann man das Script zum Beispiel jeden morgen um 5 Uhr laufen lassen.

0 5 * * * /home/mirror/scripts/mirror.sh

In der /etc/pacman.d/mirrorlist auf den einzelnen Systemen kann man den Mirror einfach eintragen (In diesem Fall über http; /archlinux ist ein Symlink zu /home/mirror/files) Server = http://IP_SERVER/archlinux/$repo/os/$arch