Difference between revisions of "Local Mirror (简体中文)"
m (→替代方法) |
|||
(17 intermediate revisions by 9 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:Package management (简体中文)]] | [[Category:Package management (简体中文)]] | ||
− | |||
[[Category:简体中文]] | [[Category:简体中文]] | ||
+ | [[en:Local Mirror]] | ||
+ | [[ru:Local Mirror]] | ||
+ | {{translateme (简体中文)|Article has been updated. To be translated.}} | ||
− | {{ | + | {{警告|如果你想创建一个官方镜像,参考 [https://wiki.archlinux.org/index.php/DeveloperWiki:NewMirrors 这个页面]。}} |
− | |||
− | |||
− | |||
+ | ==STOP== | ||
− | {{ | + | {{警告|通常不赞成创建一个本地镜像,因为需要很大的带宽。其中一个替代的方法也许会满足你的要求。请查看下面的替代方法。}} |
− | + | ====替代方法==== | |
+ | *[[Pacman_Tips_(简体中文) #.E5.9C.A8.E7.BD.91.E7.BB.9C.E4.B8.8A.E5.85.B1.E4.BA.ABpacman.E7.BC.93.E5.AD.98|在网络上共享pacman缓存]] | ||
− | + | ==本地镜像== | |
− | + | ===需要牢记的事实=== | |
+ | * 镜像的带宽不是免费的,镜像必须为提供给你的数据付费 | ||
+ | ** 尽管你已经为你的ISP付费,这也是成立的。 | ||
+ | * 有很多你可能下载了却永远用不到的包 | ||
+ | * 镜像的管理员会更喜欢让你仅下载需要的包 | ||
+ | * 再次请求仔细查看上面的替代方案 | ||
− | + | '''如果你完全确定本地镜像是唯一合适的解决方案,那么按照下面的指引操作。''' | |
− | == | + | ===服务器设置=== |
+ | ====Building Rsync Command==== | ||
+ | * Use the rsync arguments from [https://wiki.archlinux.org/index.php/DeveloperWiki:NewMirrors DeveloperWiki:NewMirrors] | ||
+ | * Select a server from the above article | ||
+ | * Exclude folder/files you do not want by including {{Ic|1=--exclude-from="/path/to/exclude.txt"}} in the rsync arguments. Example contents might include: | ||
+ | <pre> | ||
+ | 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 | ||
+ | </pre> | ||
− | + | * 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} | ||
+ | * Exclude any top-level directories that you do not need | ||
− | + | Example: {{Ic|1=rsync ''$rsync_arguments'' --exclude="/path/to/exclude.txt" ''rsync://example.com/'' /path/to/destination}} | |
− | == | + | ====Example Script==== |
− | |||
− | + | {{Warning|DO NOT USE THIS SCRIPT UNLESS YOU HAVE READ WARNINGS AT THE START OF THIS ARTICLE}} | |
+ | {{Warning|Only use this script to sync Core/Extra/Community! If you need Testing, gnome-unstable or any other repo, use rsync --exclude instead!}} | ||
− | + | 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 | #!/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' | ||
− | # | + | # Make sure only 1 instance runs |
− | + | if [ -e "$LCK_FLE" ] ; then | |
− | if [ | + | OTHER_PID=`/bin/cat $LCK_FLE` |
− | + | echo "Another instance already running: $OTHER_PID" | |
− | + | exit 1 | |
fi | fi | ||
+ | echo $$ > "$LCK_FLE" | ||
− | + | for REPO in $REPOS ; do | |
− | + | echo "Syncing $REPO" | |
− | + | echo /usr/bin/rsync $RSYNC_OPTS ${SOURCE}/${REPO} ${DEST} | |
− | + | done | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | # Cleanup | |
− | + | /bin/rm -f "$LCK_FLE" | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
exit 0 | 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 [http://blog.invokk.net/2012/01/mirroring-only-some-repositories-of-archlinux/ this blog post] for an attempt at writing a script for this task. | ||
− | + | ====Serving==== | |
+ | *HTTP (LAN) | ||
+ | **[[LAMP]] | ||
+ | **[[Lighttpd]] | ||
+ | *FTP (LAN) | ||
+ | **[[vsftpd]] | ||
+ | *Physical Media | ||
+ | **Flash Drive | ||
+ | **External HD | ||
− | + | ===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'') |
Revision as of 14:10, 14 March 2013
Contents
STOP
替代方法
本地镜像
需要牢记的事实
- 镜像的带宽不是免费的,镜像必须为提供给你的数据付费
- 尽管你已经为你的ISP付费,这也是成立的。
- 有很多你可能下载了却永远用不到的包
- 镜像的管理员会更喜欢让你仅下载需要的包
- 再次请求仔细查看上面的替代方案
如果你完全确定本地镜像是唯一合适的解决方案,那么按照下面的指引操作。
服务器设置
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="/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' # Make sure only 1 instance runs if [ -e "$LCK_FLE" ] ; then OTHER_PID=`/bin/cat $LCK_FLE` echo "Another instance already running: $OTHER_PID" exit 1 fi echo $$ > "$LCK_FLE" for REPO in $REPOS ; do echo "Syncing $REPO" echo /usr/bin/rsync $RSYNC_OPTS ${SOURCE}/${REPO} ${DEST} done # Cleanup /bin/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.
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)