Da ich gerne meine ISO- und blueray-Images von Debian GNU/Linux selbst erstelle, werden bei Benutzung von „jigdo-lite“ alle notwendigen Pakete für das Image von einem Mirror-Server heruntergeladen. Das kann bei einem 25GB blueray-Image sehr lange dauern und viel Datenvolumen erzeugen.
Deshalb betreibe ich einen lokalen Debian Mirror, damit ich die Pakete ganz schnell im lokalen Netzwerk, bestenfalls sogar auf derselben Maschine, abrufen kann. Früher nutzte ich reprepro, um die Debian Pakete für verschiedene Releases lokal bereitzustellen. Aber reprepro hat einige Unterschiede gegenüber ftpsync. Ein Unterschied ist, dass bei reprepro eigene Codenamen und Suites verwendet werden können. ftpsync dagegen nutzt die offizielle Debian Verzeichnisstruktur (debian / debian-archive / debian-security).
ftpsync wird von Debian empfohlen, um einen vollständigen Mirror zu erstellen. So erhält man neben verschiedenen Architekturen auch alle bisher veröffentlichten Codenamen (sid, testing, bullseye, jessie, stretch, etc.).
System Einrichtung
Zuerst habe ich mir das Paket ftpsync installiert
sudo apt-get update && sudo apt-get install ftpsync
Den Mirror, sowie das Handling des ‚Mirrorns‘, möchte ich in unter einem separaten Nutzer durchführen lassen. Deshalb habe ich mir ein neues Nutzerkonto angelegt
sudo useradd -m -r -d /home/mirror -s /bin/bash -C 'Mirror User Account' -U mirror
Der Mirror verbraucht enormen Speicherplatz. Also wird erstmal etwas Speicherplatz zugewiesen und eingerichtet
sudo lvcreate -L 5T -n mirror /dev/raid
sudo mkfs -t btrfs -L mirror /dev/raid/mirror
sudo mkdir /media/raid/mirror
sudo mount /dev/raid/mirror /media/raid/mirror
sudo chown mirror:mirror /media/raid/mirror
Die Daten sollen also unter /media/raid/mirror abgelegt werden und es wurden 5 TB Speicherplatz zugewiesen.
ftpsync Einrichtung
Es ist noch notwendig, ftpsync für den Nutzer „mirror“ einzurichten. Es wird zum Nutzer „mirror“ gewechselt und die Verzeichnisse „.config„, „.config/ftpsync“ und „bin“ erstellt. Dann werden Symlinks angelegt. Der neue Symlink-Name identifiziert das zu ladende Projekt, oder Environment. Das Ziel für die Symlinks ist immer das ftpsync Script unter /usr/bin/ftpsync .
su - mirror
mkdir -p ${HOME}/.config/ftpsync ${HOME}/bin
ln -s /usr/bin/ftpsync ${HOME}/bin/ftpsync.debian
ln -s /usr/bin/ftpsync ${HOME}/bin/ftpsync.debian-archive
ln -s /usr/bin/ftpsync ${HOME}/bin/ftpsync.debian-cd
ln -s /usr/bin/ftpsync ${HOME}/bin/ftpsync.debian-security
Dann werden noch Konfigurationsdateien benötigt.
cat >${HOME}/.config/ftpsync/ftpsync.debian.conf <<"### EOF"
MIRRORNAME=`hostname -f`
TO="/media/raid/mirror/htdocs/debian"
# MAILTO="$LOGNAME"
# HUB=false
RSYNC_HOST=deb.debian.org
RSYNC_PATH="debian"
# RSYNC_USER=
# RSYNC_PASSWORD=
# INFO_MAINTAINER="Admins <[email protected]>, Person <[email protected]>"
# INFO_SPONSOR="Example <https://example.com>"
# INFO_COUNTRY=
# INFO_LOCATION=""
# INFO_THROUGHPUT=10Gb
# ARCH_INCLUDE=
# ARCH_EXCLUDE=
LOGDIR="/media/raid/mirror/logs"
FULLLOGS=true
### EOF
cat >${HOME}/.config/ftpsync/ftpsync.debian-archive.conf <<"### EOF"
MIRRORNAME=`hostname -f`
TO="/media/raid/mirror/htdocs/debian-archive"
# MAILTO="$LOGNAME"
# HUB=false
RSYNC_HOST=deb.debian.org
RSYNC_PATH="debian-archive"
# RSYNC_USER=
# RSYNC_PASSWORD=
# INFO_MAINTAINER="Admins <[email protected]>, Person <[email protected]>"
# INFO_SPONSOR="Example <https://example.com>"
# INFO_COUNTRY=
# INFO_LOCATION=""
# INFO_THROUGHPUT=10Gb
# ARCH_INCLUDE=
# ARCH_EXCLUDE=
LOGDIR="/media/raid/mirror/logs"
FULLLOGS=true
### EOF
cat >${HOME}/.config/ftpsync/ftpsync.debian-cd.conf <<"### EOF"
MIRRORNAME=`hostname -f`
TO="/media/raid/mirror/htdocs/debian-cd"
# MAILTO="$LOGNAME"
# HUB=false
RSYNC_HOST=deb.debian.org
RSYNC_PATH="debian-cd"
# RSYNC_USER=
# RSYNC_PASSWORD=
# INFO_MAINTAINER="Admins <[email protected]>, Person <[email protected]>"
# INFO_SPONSOR="Example <https://example.com>"
# INFO_COUNTRY=
# INFO_LOCATION=""
# INFO_THROUGHPUT=10Gb
# ARCH_INCLUDE=
# ARCH_EXCLUDE=
LOGDIR="/media/raid/mirror/logs"
FULLLOGS=true
### EOF
cat >${HOME}/.config/ftpsync/ftpsync.debian-security.conf <<"### EOF"
MIRRORNAME=`hostname -f`
TO="/media/raid/mirror/htdocs/debian-security"
# MAILTO="$LOGNAME"
# HUB=false
RSYNC_HOST=deb.debian.org
RSYNC_PATH="debian-security"
# RSYNC_USER=
# RSYNC_PASSWORD=
# INFO_MAINTAINER="Admins <[email protected]>, Person <[email protected]>"
# INFO_SPONSOR="Example <https://example.com>"
# INFO_COUNTRY=
# INFO_LOCATION=""
# INFO_THROUGHPUT=10Gb
# ARCH_INCLUDE=
# ARCH_EXCLUDE=
LOGDIR="/media/raid/mirror/logs"
FULLLOGS=true
### EOF
Webserver Einrichtung
Auf die lokalen Repositories und Pakete soll auch zugegriffen werden. Dies soll teilweise auch über das Netzwerk funktionieren. Es wird deshalb NGINX eingesetzt, damit die Daten per HTTP/S erreichbar sind.
sudo apt-get update && sudo apt-get install nginx-light
Jetzt muss noch die NGINX-Konfiguration angelegt und der Dienst neu gestartet werden.
sudo cat >/etc/nginx/sites-available/apt.conf <<### EOF
server {
listen 0.0.0.0:80;
listen [::]:80;
server_name deb.debian.org _;
root /media/raid/mirror/htdocs;
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
}
### EOF
sudo ln -s /etc/nginx/sites-available/apt.conf /etc/nginx/sites-enabled/apt.conf
sudo systemctl restart nginx
Die Daten werden jetzt aus dem Internet heruntergeladen und lokal gespeichert. Bei der ersten Einrichtung sollte dies manuell durchgeführt werden. Später kann die Replizierung der Daten auch mit cronjobs automatisiert werden.
su -s "/bin/bash" -c "~mirror/bin/ftpsync.debian" - mirror
su -s "/bin/bash" -c "~mirror/bin/ftpsync.debian-archive" - mirror
su -s "/bin/bash" -c "~mirror/bin/ftpsync.debian-cd" - mirror
su -s "/bin/bash" -c "~mirror/bin/ftpsync.debian-security" - mirror
Wenn die oben stehenden Befehle ausgeführt wurden, können auch die Logfiles beobachtet werden.
tail -F /media/raid/mirror/logs/*
Der Download der Dateien kann, je nach Bandbreite der Anbindung, Stunden, Tage, oder gar Wochen andauern. Schließlich werden auch enorm viele Daten übertragen. Die Projektordner sehen (Stand 9. Mai 2024) folgendermaßen aus
du -h --max-depth=1 /media/raid/mirror/htdocs/
1986 G | ./debian |
1943 G | ./debian-archive |
226 G | ./debian-cd |
251 G | ./debian-security |
4407 G | . |
Schlussendlich wurden alle Debian Pakete heruntergeladen und ein Cronjob erstellt, damit die notwendigen Kommandos jeden Tag früh morgens ausgeführt werden. Damit bleibt der Mirror in Sync und die Systeme, die auf diesen Mirror zugreifen, erhalten immer aktuelle Pakete.
Damit die Systeme aber auch auf diesen Mirror zugreifen können, muss ein DNS Eintrag, oder ein Eintrag in der lokalen /etc/hosts Datei angelegt werden.