||'''Contents'''|| ||<>|| To be able to create a mirror people can rely on, you need to have all the files and you need them at the right moment. 'File not found'-errors cause a lot of issues and annoyances for users. This page provides you with scripts to sync from other mirrors and prevent 404's. = ubumirror = One can use the scripts from the '''[[https://code.launchpad.net/~ubumirror-devs/ubumirror/trunk|ubumirror]]''' project to keep their mirror in sync, or use the scripts provided below. This project has been [[https://launchpad.net/ubuntu/+source/ubumirror|packaged since Lucid]] onwards, please file any bug reports you find [[https://bugs.launchpad.net/ubuntu/+source/ubumirror|against it]]. = Archive mirrors = For archive mirrors, it is very important '''not''' to delete packages before the Packages.gz-files (which hold information about the packages available) are updated. Therefor, you need a 'Two stage sync'. This means that you download new packages first, and new Packages.gz after that. After you've downloaded the Packages.gz files, it's safe to delete old packages. == The script == {{{ #/bin/dash fatal() { echo "$1" exit 1 } warn() { echo "$1" } # Find a source mirror near you which supports rsync on # https://launchpad.net/ubuntu/+archivemirrors # rsync://.rsync.archive.ubuntu.com/ubuntu should always work RSYNCSOURCE=rsync://archive.ubuntu.mirror.isp.com/ubuntu # Define where you want the mirror-data to be on your mirror BASEDIR=/var/www/ubuntuarchive/ if [ ! -d ${BASEDIR} ]; then warn "${BASEDIR} does not exist yet, trying to create it..." mkdir -p ${BASEDIR} || fatal "Creation of ${BASEDIR} failed." fi rsync --recursive --times --links --safe-links --hard-links \ --stats \ --exclude "Packages*" --exclude "Sources*" \ --exclude "Release*" --exclude "InRelease" \ ${RSYNCSOURCE} ${BASEDIR} || fatal "First stage of sync failed." rsync --recursive --times --links --safe-links --hard-links \ --stats --delete --delete-after \ ${RSYNCSOURCE} ${BASEDIR} || fatal "Second stage of sync failed." date -u > ${BASEDIR}/project/trace/$(hostname -f) }}} = Releases mirrors = For Releases mirrors, stuff is a little less complicated. There are no dependencies between files, so you can just rsync away. == The script == {{{ #/bin/dash fatal() { echo "$1" exit 1 } warn() { echo "$1" } # Find a source mirror near you which supports rsync on # https://launchpad.net/ubuntu/+cdmirrors # rsync://.rsync.releases.ubuntu.com/releases should always work RSYNCSOURCE=rsync://releases.ubuntu.mirror.isp.com/releases # Define where you want the mirror-data to be on your mirror BASEDIR=/var/www/ubuntureleases/ if [ ! -d ${BASEDIR} ]; then warn "${BASEDIR} does not exist yet, trying to create it..." mkdir -p ${BASEDIR} || fatal "Creation of ${BASEDIR} failed." fi rsync --verbose --recursive --times --links --safe-links --hard-links \ --stats --delete-after \ ${RSYNCSOURCE} ${BASEDIR} || fatal "Failed to rsync from ${RSYNCSOURCE}." date -u > ${BASEDIR}/.trace/$(hostname -f) }}}