5.11 Debian Spiegel

Ein eigener Debian Spiegel (englisch Mirror), also eine lokale Kopie aller benötigten Dateien vom Debian FTP-Server, kann für verschiedene Zwecke sinnvoll sein. Zunächst einmal hat man sofort Zugriff auf alle Dateien und kann diese installieren, ohne auf den Download der Dateien warten zu müssen. Natürlich ist auch die Aktualität der Software um einiges besser als bei der Installation von CD-ROMs. Für die Installation der Software auf mehreren Rechnern ist eine solche lokale Kopie ebenfalls die erste Wahl. Wenn, wie im nächsten Abschnitt beschrieben, eigene Debian CDs erstellt werden sollen, ist ein Spiegel unumgänglich.

Aufgrund des bereits großen Umfangs des Debian Archivs ist es nicht sinnvoll, eine komplette Kopie aller Dateien lokal vorzuhalten. Meist ist es ausreichend, lediglich die Binaries für die verwendete Architektur (beispielsweise i386) vorzuhalten. Die Sourcen der Pakete werden nur in seltenen Fällen benötigt und können bei Bedarf gezielt besorgt werden. Informationen zum Spiegeln eines Debian Servers finden Sie auch unter http://www.debian.org/mirror/ftpmirror.

5.11.1 debmirror

Das Programm debmirror bietet eine sehr einfache Möglichkeit, einen Debian FTP-Server - bei Bedarf auch nur in Teilen - zu spiegeln. Das Programm steht als offizielles Debian Paket zur Verfügung.

debmirror benutzt keine Konfigurationsdatei; alle benötigten Parameter können auf der Kommandozeile angegeben werden. Sehr vorteilhaft ist bei diesem Skript, dass es speziell auf die Bedürfnisse von Debian angepasst wurde; so kann es beispielsweise mit Package-Pools problemlos umgehen. Das Package-Pool-Konzept wurde mit der Entwicklung von woody eingeführt und erlaubt es, verschiedene Releases (testing, stable, unstable usw.) auf Basis der Daten innerhalb des Verzeichnisses pool/ zu verwalten. Weiterhin werden die benötigten Dateien auf Basis der Package-Dateien ermittelt; somit ist auch hier immer ein einheitlicher Stand sichergestellt.

Die Verwendung von debmirror ist ziemlich simpel. Wenn das Programm ohne weitere Parameter aufgerufen wird, bekommen Sie eine Übersicht der möglichen Parameter:

sushi:~# ./debmirror 
mirrordir not specified
Usage: ./debmirror mirrordir [--debug] [--progress] [--source|--nosource]
          [--md5sums|--nomd5sums] [--passive] [--host=remotehost]
          [--user=remoteusername]
          [--root=directory] [--dist=foo[,bar,..] ...]
          [--section=foo[,bar,..] ...] [--arch=foo[,bar,..] ...]
          [--cleanup|--nocleanup] [--skippackages] [--adddir=directory]
	  [--ignore=regex] [--getcontents] [--exclude=regex] [--help]

Als einziger Parameter ist mirrordir zwingend erforderlich. Dieser beschreibt das lokale Verzeichnis, in dem der Debian Spiegel erzeugt werden soll. Wenn dieses Verzeichnis nicht vorhanden ist, so wird es erzeugt.

Folgendes Kommando erzeugt einen Debian Spiegel für die Architekturi386 im Verzeichnis /home/ftp/debian/; es werden die Versionen potato, woody und sid mit den Bereichen main, contrib und non-free kopiert. Als Server dient ftp.debian.org (hier sollte auf alle Fälle ein gut erreichbarer Server benutzt werden). Es werden keine Sourcen übertragen, und das Verzeichnis debian-non-US auf der lokalen Festplatte wird nicht angetastet (dazu gleich mehr). Weiterhin wird der Fortschritt laufend angezeigt.

debmirror -a i386 -s main -s contrib -s non-free \
 -h ftp.debian.org \
 -d woody -d potato -d sid \
 /home/ftp/debian \
 --nosource \
 --ignore=debian-non-US/ --progress

[Tipp]debmirror auf Sarge-Systemen

Mit dem Release von Sarge können die Optionen fürnon-US entfallen, die Pakete sind in den main-Zweig integriert worden.

Da auf dem offiziellen Debian FTP-Server die Pakete aus dem Non-US-Bereich fehlen, können diese Pakete mit einer zweiten Zeile auf den heimischen Rechner geholt werden:

debmirror -a i386 -h ftp.de.debian.org \
 -r /debian-non-US -s non-US/main,non-US/contrib,non-US/non-free \
 -d woody -d potato -d sid \
 /home/ftp/debian/debian-non-US --progress

Je nach Bandbreite Ihrer Internetverbindung steht Ihnen nach einiger Zeit ein lokaler Debian Spiegel zur Verfügung.

5.11.2 Partieller Spiegel

Im Folgenden wird das Erstellen eines partiellen Spiegels beschrieben. Bei einem partiellen Spiegel wird nur ein ausgewählter Teil von Paketen im lokalen Spiegel abgelegt. Wolfgang Borgert stellt auf seinen Webseiten einige Skripte vor, mit denen ein solcher Spiegel erzeugt werden kann. Dabei wird auf die Programme apt, apt-move und debootstrap (siehe apt-move und debootstrap) zurückgegriffen. Die Abhängigkeiten aller in der Liste angegebenen Pakete werden dabei aufgelöst, so dass ein vollständig funktionsfähiger Spiegel entsteht. Durch die Verwendung von debootstrap wird das zugrunde liegende Basissystem nicht verändert, alle Dateien werden in einer chroot-Umgebung abgelegt.

In den folgenden Beispielen wird die chroot-Umgebung unter /var/local/chroot/ erzeugt, innerhalb dieses Verzeichnisses wird der Spiegel mit den Debian Paketen im Verzeichnis/var/local/mirrors/ angelegt. Der Spiegel wird über einen symbolischen Link aus der chroot-Umgebung heraus leichter zugänglich gemacht:

ln -s /var/local/chroot/var/local/mirrors/ /var/local/mirrors/

5.11.2.1 Erzeugen des Spiegels

Das folgende Skript dient zum Erzeugen des Spiegels. Es sollte als Datei create-mirror abgelegt werden.

#!/bin/sh
# generate a partial Debian mirror with debootstrap and apt-move
# 2004-02, W. Borgert <debacle@debian.org>
# Released under the terms of the GNU General Public License

# the root directory of the mirror system
CHROOT=/var/local/chroot
# the mirror directory inside of the chroot
MIRRORDIR=/var/local/mirrors/debian
# the Debian archive next to you
DEBIAN=http://ftp.de.debian.org/debian

####

OUT=adduser,aptitude,apt-utils,at,base-config,bsdmainutils,\
console-common,console-data,console-tools,cpio,cron,debconf-i18n,\
dhcp-client,ed,exim4,exim4-base,exim4-config,exim4-daemon-light,\
fdutils,gettext-base,groff-base,ifupdown,info,ipchains,iptables,\
iputils-ping,klogd,libconsole,libgcrypt1,libgcrypt7,libgdbm3,\
libgnutls7,libgpg-error0,libident,liblocale-gettext-perl,\
liblockfile1,liblzo1,libnewt0.51,libopencdk8,libpcap0.7,libpcre3,\
libpopt0,libsigc++-1.2-5c102,libssl0.9.7,libtasn1-0,\
libtext-charwidth-perl,libtext-iconv-perl,libtext-wrapi18n-perl,\
libwrap0,lilo,logrotate,mailx,makedev,man-db,manpages,mbr,modconf,\
modutils,nano,netbase,netkit-inetd,net-tools,nvi,pciutils,ppp,\
pppconfig,pppoe,pppoeconf,procps,psmisc,setserial,slang1,sysklogd,\
syslinux,sysvinit,tasksel,tcpd,telnet,wget,whiptail

IN=apt-move,bc,bzip2,dash,debconf-english,libbz2-1.0,libpam0g,\
libreadline4

####

apt-get install debootstrap
mkdir $CHROOT
debootstrap --exclude="$OUT" --include="$IN" sarge $CHROOT $DEBIAN

Im Wesentlichen wird hier debootstrap eingesetzt, um ein minimales Debian System zu erzeugen. Dabei werden einige wenige Pakete hinzugefügt (über die Variable IN) und eine ganze Reihe Pakete nicht installiert, die normalerweise von debootstrap verwendet werden (Variable OUT). Dies führt zu einem Basissystem von lediglich circa 80 MByte Größe (bei Verwendung des Debian Release Sarge).

Dieses Skript wird nur einmalig - bei der ersten Initialisierung des Spiegels - benötigt.

Zunächst ist die Datei /var/local/chroot/etc/apt/sources.list anzupassen. Als erster Eintrag muss das lokale Verzeichnis erscheinen, weitere Einträge verweisen auf externe Debian Spiegel.

deb file:/var/local/mirrors/debian testing main
deb http://ftp.de.debian.org/pub/debian/ testing main

Nun sind noch einige Variablen in der Konfigurationsdatei von apt-move (/etc/apt-move.conf) anzupassen, insbesondere APTSITES, LOCALDIR, DIST, PKGCOMP und CONTENTS. Hier sehen Sie ein Beispiel:

APTSITES="ftp.de.debian.org"
LOCALDIR=/var/local/mirrors/debian
DIST=testing
PKGCOMP="none gzip"
CONTENTS=yes

Nun können zunächst die Paketinformationen für den Spiegel aktualisiert werden; danach werden die (in der chroot-Umgebung) installierten Pakete geholt.

chroot /var/local/chroot apt-get update
chroot /var/local/chroot apt-move get

5.11.2.2 Verwaltung des Spiegels

Leider reicht eine Verzeichnisstruktur mit Debian Paketen nicht aus. Wir benötigen noch Packages- und Release-Dateien. Um Letztere zu erzeugen, dient folgendes Skript, das als make-release im Verzeichnis /var/local/chroot/root/ gespeichert wird.

#!/bin/sh
# generate Release files for a Debian mirror
# 2003-10, W. Borgert <debacle@debian.org>
# Released under the terms of the GNU General Public License

ORIGIN="Debian"
LABEL="Debian"
SUITE="testing"
CODENAME="sarge"
DESC="Debian Testing distribution - Not Released"
UNPACK=0
ARCHIVE=.

# long options not yet implemented
args=`getopt 'a:c:d:l:o:s:u' $*`
for o
    do case "$o" in
        -a | --arch*) ARCHIVE="$2"; shift; shift;;
        -c | --code*) CODENAME="$2"; shift; shift;;
        -d | --desc*) DESC="$2"; shift; shift;;
        -l | --label) LABEL="$2"; shift; shift;;
        -o | --orig*) ORIGIN="$2"; shift; shift;;
        -s | --suite) SUITE="$2"; shift; shift;;
        -u | --unpa*) UNPACK=1; shift;;
        --) shift; break;;
    esac
done

####

cd $ARCHIVE
DATE=`date -u`
if [ $UNPACK -eq 1 ]; then
    PACKAGGZ=`find . -name Packages.gz -o -name Sources.gz`
    for p in $PACKAGGZ; do
        gunzip -c $p > `dirname $p`/`basename $p .gz`
    done
fi

PACKAGES=`find . -name Packages -o -name Packages.gz -o \
    -name Sources -o -name Sources.gz`
DIRS=`for p in $PACKAGES; do dirname $p; done|sort -u`
COMPS=`for d in $DIRS; do echo $d | \
    sed 's,[^A-Za-z0-9-]*\([A-Za-z0-9-]*\)/.*,\1,'; done|sort -u`
ARCHS=`for d in $DIRS; do echo $d | \
    sed 's,.*binary-\([A-Za-z0-9-]*\),\1,'; done|sort -u`

for d in $DIRS; do
    cd $d
        ARCH=`echo $d | sed 's,.*binary-\([A-Za-z0-9-]*\),\1,'`
        COMP=`echo $d | \
            sed 's,[^A-Za-z0-9-]*\([A-Za-z0-9-]*\)/.*,\1,'`
        echo "Archive: $SUITE
Component: $COMP
Origin: $ORIGIN
Label: $LABEL
Architecture: $ARCH" > Release
    cd -
done

rm -f Release
MD5FILES=`find . -name Packages -o -name Packages.gz -o \
    -name Sources -o -name Sources.gz -o -name Release \
    | sed 's,^[^/]*/,,'`

echo "Origin: $ORIGIN
Label: $LABEL
Suite: $SUITE
Codename: $CODENAME
Date: $DATE
Architectures:" `echo $ARCHS`"
Components:" `echo $COMPS`"
Description: $DESC
MD5Sum:" > Release

for m in $MD5FILES; do
    echo -n " " >> Release
    SIZE=`wc -c $m | sed 's/ *\([0-9]*\).*/\1/'`
    SUM=`md5sum $m | sed 's/^ *\([A-Fa-f0-9]*\) .*/\1/'`
    printf "%s %16d %s\n" $SUM $SIZE $m >> Release
done

echo "SHA1:" >> Release
for m in $MD5FILES; do
    echo -n " " >> Release
    SIZE=`wc -c $m | sed 's/ *\([0-9]*\).*/\1/'`
    SUM=`sha1sum $m | sed 's/^ *\([A-Fa-f0-9]*\) .*/\1/'`
    printf "%s %16d %s\n" $SUM $SIZE $m >> Release
done

Die Information, welche Pakete in dem Spiegel vorgehalten werden sollen, findet sich in der Datei /var/local/chroot/root/packages. Ergänzungen können hier jederzeit vorgenommen werden. Die eigentliche Verwaltung des Spiegels übernimmt folgendes Skript:

#!/bin/sh
# update a partial Debian mirror with apt-move
# 2004-02, W. Borgert <debacle@debian.org>
# Released under the terms of the GNU General Public License

# the root directory of the mirror system
CHROOT=/var/local/chroot
# the mirror directory inside of the chroot
MIRRORDIR=/var/local/mirrors/debian
# master packages file inside of the chroot
MASTER=/root/packages

####

MODE=$1; shift

case "$MODE" in
    clean)
	chroot $CHROOT apt-move --force delete
	exit 0
	;;
    install)
	PACKAGES="$*"
	if [ -f $CHROOT/$MASTER ]; then
	    OLDPACKAGES=`cat $CHROOT/$MASTER`
	else
	    OLDPACKAGES=
	fi
	for p in $OLDPACKAGES $PACKAGES; do echo $p; done | \
	    sort -u > $CHROOT/$MASTER
	;;
    upgrade)
	if [ -f $CHROOT/$MASTER ]; then
	    PACKAGES=`cat $CHROOT/$MASTER`
	else
	    exit 0
	fi
	;;
    *)
	echo "Usage:"
	echo "$0 clean"
	echo "$0 install <packages>"
	echo "$0 upgrade"
	exit -1
	;;
esac

chroot $CHROOT apt-get update
chroot $CHROOT apt-get install \
    --option 'DPkg::Options::=--dry-run' --yes $PACKAGES
chroot $CHROOT apt-move get
chroot $CHROOT apt-move move
chroot $CHROOT apt-move packages
chroot $CHROOT /root/make-release -a $MIRRORDIR
chroot $CHROOT apt-get autoclean

5.11.2.2.1 Hinzufügen von Paketen

Das Hinzufügen weiterer Pakete ist recht einfach:

./update-mirror install dia ethereal glade-2

Dabei werden die Abhängigkeiten aller Pakete aufgelöst, und alle benötigten Pakete werden dem Spiegel hinzugefügt.

5.11.2.2.2 Aktualisieren des Spiegels

Wenn der Spiegel aktualisiert werden soll, so geschieht dies mit dem Kommando:

./update-mirror upgrade

5.11.2.3 Spiegel für verschiedene Architekturen

Um einen Spiegel auch für andere Hardware-Architekturen bereitzustellen, ist in der Datei /var/local/chroot/etc/apt/apt.conf die Architektur hinzuzufügen:

APT::Architecture "arm";

Weiterhin ist dies auch in /var/local/chroot/etc/apt-move.conf bekannt zu machen:

ARCHS="arm i386"

5.11.3 debian-multimirror

debian-multimirror ist ein in Perl geschriebenes Programm, das in der Lage ist, auch einen partiellen Spiegel eines oder mehrerer Debian Server anzulegen. Die Basis für die Paketauswahl bilden dabei eine oder mehrere Listen von Paketen. Auch ist es möglich, ganze Bereiche von Paketen (beispielsweise games oder kde) auszublenden. debian-multimirror ist noch nicht als Paket in der Debian Distribution enthalten, die Software ist unter http://pedro.larroy.com/debian/debian-multimirror/ zu finden.

5.11.4 mirror

mirror steht als Debian Paket zur Verfügung und wird seit vielen Jahren auch auf großen FTP-Servern (beispielsweise an Universitäten) benutzt, um Inhalte anderer FTP-Server lokal zu speichern. Für eine lokale Kopie der Daten eines Debian FTP-Servers wird neben dem eigentlichen Programm mirror vor allem viel Festplattenplatz benötigt. Da mirror als universelles Programm zum Spiegeln von FTP-Servern entwickelt wurde, kennt es natürlich keine Debian Besonderheiten wie Package-Pools. Um nicht unnötig Pakete zu kopieren, ist leider eine etwas aufwändige Konfiguration nötig.

Die Konfigurationsdateien für das Programm mirror finden sich nach der Installation im Verzeichnis /etc/mirror/packages/. Hier kann für jeden gewünschten Spiegel eine Datei angelegt werden. Das Programm selbst wird dann mit der Konfigurationsdatei als Parameter aufgerufen. Zusätzlich kann die Option -d (auch mehrfach) angegeben werden, um mehr Informationen über den Vorgang zu bekommen.

Hier sehen Sie eine Konfigurationsdatei, die die Architekturen i386 und powerpc vom Debian FTP-Server kopiert.

package=Debian
   #
   comment=Mirror of parts of ftp.debian.org/pub/debian
   #	
   # specify remote host, directory and ls-lR file
   site=ftp.de.debian.org
   remote_dir=/debian
   store_remote_listing=/tmp/DEBIANREMOTE
   ls_lR_file=ls-lR.gz
   #
   # specify the local directory 
   local_dir=/home/ftp/debian
   #
   # inform this user about results
   mail_to=fr
   #
   # Compress these files.
   #compress_patt=\.*(C|c)ontents(-i386)?
   #compress_patt+|Packages(-Master)?|ls-lR|md5sums
   #compress_patt+|Maintainers|msdos-names
   #
   # Exclude these files or directories 
   exclude_patt=private/|project/|ls-lR|ls-lR.gz|ls-lR.patch.gz|dsync.list
   exclude_patt+|debian-(bugs|lists)/
   exclude_patt+|\.*(hurd-i386|hppa|mipsel|mips|ia64|s390|arm|m68k|alpha|hurd|mips|sparc).deb?
   exclude_patt+|\.*(hurd-i386|hppa|mipsel|mips|ia64|s390|arm|m68k|alpha|hurd|mips|sparc).udeb?
   exclude_patt+|\.*(hurd-i386|hppa|mipsel|mips|ia64|s390|arm|m68k|alpha|hurd|mips|sparc).gz?
   exclude_patt+|\.*(hurd-i386|hppa|mipsel|mips|ia64|s390|arm|m68k|alpha|hurd|mips|sparc).diff.gz?
   exclude_patt+|\.*(hurd-i386|hppa|mipsel|mips|ia64|s390|arm|m68k|alpha|hurd|mips|sparc).dsc?
   exclude_patt+|\.*(hurd-i386|hppa|mipsel|mips|ia64|s390|arm|m68k|alpha|hurd|mips|sparc).tar.gz?
   exclude_patt+|\.tar.gz?
   exclude_patt+|\.dsc?
   exclude_patt+|\.changes?
   exclude_patt+|\.diff.gz?
   exclude_patt+|bo/
   exclude_patt+|rex/
   exclude_patt+|slink/
   exclude_patt+|binary-arm/
   exclude_patt+|binary-m68k/
   exclude_patt+|binary-ia64/
   exclude_patt+|binary-hppa/
   exclude_patt+|binary-sparc/
   exclude_patt+|binary-mipsel/
   exclude_patt+|binary-mips/
   exclude_patt+|binary-alpha/
   exclude_patt+|disks-alpha/
   exclude_patt+|disks-m68k/
   exclude_patt+|disks-sparc/
   exclude_patt+|upgrade-alpha/
   exclude_patt+|upgrade-m68k/
   exclude_patt+|upgrade-sparc/
   exclude_patt+|binary-s390/
   exclude_patt+|binary-hurd-i386/
   exclude_patt+|md5sums
   exclude_patt+|md5sums.gz
   exclude_patt+|/potato/main/disks-arm/
   exclude_patt+|/potato/main/binary-arm/
   exclude_patt+|/potato/contrib/binary-arm/
   exclude_patt+|/potato/non-free/binary-arm/
   exclude_patt+|/potato/main/binary-sparc/
   exclude_patt+|/potato/contrib/binary-sparc/
   exclude_patt+|/potato/non-free/binary-sparc/
   exclude_patt+|woody/non-free/binary-sparc/
   exclude_patt+|woody/non-free/binary-alpha/
   exclude_patt+|woody/main/binary-sparc/
   exclude_patt+|woody/main/binary-alpha/
   exclude_patt+|woody/contrib/binary-sparc/
   exclude_patt+|woody/contrib/binary-alpha/
   exclude_patt+|woody/main/binary-hurd/
   exclude_patt+|woody/main/binary-hurd-i386/
   exclude_patt+|woody/main/binary-arm/
   exclude_patt+|woody/main/binary-mips/
   exclude_patt+|woody/main/binary-mipsel/
   exclude_patt+|binary-hppa/
   exclude_patt+|binary-sh/
   exclude_patt+|woody/main/binary-sparc/
   exclude_patt+|woody/main/disks-sparc/
   exclude_patt+|woody/main/binary-alpha/
   exclude_patt+|woody/Contents-arm.gz
   exclude_patt+|woody/Contents-hurd-i386.gz
   exclude_patt+|woody/Contents-alpha.gz
   exclude_patt+|woody/Contents-sparc.gz
   exclude_patt+|woody/Contents-hppa.gz
   exclude_patt+|woody/Contents-sh.gz
   exclude_patt+|woody/Contents-mips.gz
   exclude_patt+|woody/Contents-mipsel.gz
   #
   exclude_patt+|\.notar
   #
   # Don't delete what is mirrored by the other mirror package below
   #
   # delete_excl=(local|debian-non-US|non-US|project)(/|$)
   # Do not delete if more than 20% of all files would vanish
   max_delete_files=20%

 Impressum