Local Mirror
Contents
STOP
Alternatives:
Local Mirror
Things to keep in mind:
- Bandwidth is not free for the mirrors. They must pay for all the data they serve you
- This still applies although you pay your ISP
- A full mirror (32+64 bit) is over 41GB in size (as of 2015-01-21)
- There are many packages that will be downloaded that you will likely never use
- Mirror operators will much prefer you to download only the packages you need
- Really please look at the alternatives above
If you are absolutely certain that a local mirror is the only sensible solution, then follow the pointers below.
Server Configuration
Building Rsync Command
- Use the rsync arguments from DeveloperWiki:NewMirrors
- Select a server from the above article
- Exclude folder/files you do not want by including
--exclude-from="/path/to/exclude.txt"
in the rsync arguments. Example contents might include:
iso #Exclude i686 Packages */os/i686 pool/*/*-i686.pkg.tar.xz pool/*/*-i686.pkg.tar.gz #Exclude x86_64 Packages */os/x86_64 pool/*/*-x86_64.pkg.tar.xz pool/*/*-x86_64.pkg.tar.gz
- All packages reside in the pool directory. Symlinks are then created from pool to core/extra/testing/etc..
- As of 9/21/2010 this migration is not yet complete.
- There may be actual packages, instead of symlinks, in ${repo}/os/${arch}
- As of 9/21/2010 this migration is not yet complete.
- Exclude any top-level directories that you do not need
Example: rsync $rsync_arguments --exclude-from="/path/to/exclude.txt" rsync://example.com/ /path/to/destination
Example Script
Yes, this script is partially broken ON PURPOSE to avoid people doing copy-and-paste to create their own mirror. It should be easy to fix if you REALLY want a mirror.
#!/bin/bash ################################################################################################# ### It is generally frowned upon to create a local mirror due the bandwidth that is required. ### One of the alternatives will likely fulfill your needs. ### REMEMBER: ### * Bandwidth is not free for the mirrors. They must pay for all the data they serve you ### => This still applies although you pay your ISP ### => There are many packages that will be downloaded that you will likely never use ### => Mirror operators will much prefer you to download only the packages you need ### * Really please look at the alternatives on this page: ### https://wiki.archlinux.org/index.php?title=Local_Mirror ### If you are ABSOLUTELY CERTAIN that a local mirror is the only sensible solution, then this ### script will get you on your way to creating it. ################################################################################################# # Configuration SOURCE='rsync://mirror.example.com/archlinux' DEST='/srv/mirrors/archlinux' BW_LIMIT='500' REPOS='core extra' RSYNC_OPTS="-rtlHq --delete-after --delay-updates --copy-links --safe-links --max-delete=1000 --bwlimit=${BW_LIMIT} --delete-excluded --exclude=.*" LCK_FLE='/var/run/repo-sync.lck' PATH='/usr/bin' # Make sure only 1 instance runs if [ -e "$LCK_FLE" ] ; then OTHER_PID=$(cat $LCK_FLE) echo "Another instance already running: $OTHER_PID" exit 1 fi echo $$ > "$LCK_FLE" for REPO in $REPOS ; do echo "Syncing $REPO" rsync $RSYNC_OPTS ${SOURCE}/${REPO} ${DEST} done # Cleanup rm -f "$LCK_FLE" exit 0
Another mirror script using lftp
lftp can mirror via several different protocols: ftp, http, etc. It also restarts on error, and can run in the background. Put this into your $PATH for an easy way to mirror that continues if you log out.
#!/usr/bin/lftp -f lcd /local/path/to/your/mirror open ftp.archlinux.org (or whatever your favorite mirror is) # Use 'cd' to change into the proper directory on the mirror, if necessary. mirror -cve -x '.*i686.*' core & mirror -cve -x '.*i686.*' extra & mirror -cve -x '.*i686.*' community & mirror -cve -x '.*i686.*' multilib & lcd pool cd pool mirror -cve -x '.*i686.*' community & mirror -cve -x '.*i686.*' packages &
if you want to see the current status of the mirror. open lftp on terminal and type 'attach <PID>'
Partial mirroring
Mirroring only some repositories is definitely not easy, due to the centralization of most packages in `pool/`. See this blog post for an attempt at writing a script for this task.
If you can install all of the packages you wish to mirror, you can install them and set up an http server to share your package cache. An example lighttpd.conf would be:
# This is a minimal example config # See /usr/share/doc/lighttpd # and http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ConfigurationOptions server.port = 80 server.username = "http" server.groupname = "http" server.document-root = "/var/cache/pacman/pkg" server.errorlog = "/var/log/lighttpd/error.log" dir-listing.activate = "enable" index-file.names = ( "index.html" ) mimetype.assign = ( ".html" => "text/html", ".txt" => "text/plain", ".jpg" => "image/jpeg", ".png" => "image/png", "" => "application/octet-stream" )
Then to update your partial mirror, simply execute pacman -Syu. Note this doesn't work for multiple architectures.
Serving
Client Configuration
- Add the proper Server= variable in /etc/pacman.d/mirrorlist
- For physical media (such as flash drive) the following can be used: Server = file:///mnt/media/repo/$repo/os/$arch (where /mnt/media/repo is directory where local mirror located)