Difference between revisions of "Local Mirror (简体中文)"

From ArchWiki
Jump to: navigation, search
 
m (替代方法)
(45 intermediate revisions by 15 users not shown)
Line 1: Line 1:
[[Category:Package Management]]
+
[[Category:Package management (简体中文)]]
{{i18n_links_start}}
+
[[Category:简体中文]]
{{i18n_entry|English|Local Mirror}}
+
[[en:Local Mirror]]
{{i18n_entry|中文(简体)|本地镜像}}
+
[[ru:Local Mirror]]
{{i18n_links_end}}
+
{{translateme (简体中文)|Article has been updated. To be translated.}}
  
===How to set up a local mirror===
+
{{警告|如果你想创建一个官方镜像,参考 [https://wiki.archlinux.org/index.php/DeveloperWiki:NewMirrors 这个页面]。}}
  
This document describes how to create a mirror on your local machine of all the files on the Arch mirrors of the "current" and "extra" directories, how to make it update periodically and how to set up pacman to use the local files.
+
==STOP==
  
* Of course, make sure that you're up-to-date:
+
{{警告|通常不赞成创建一个本地镜像,因为需要很大的带宽。其中一个替代的方法也许会满足你的要求。请查看下面的替代方法。}}
  <pre>
+
  pacman -Syu
+
  </pre>
+
  
* Now, install rsync:
+
====替代方法====
  <pre>
+
*[[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缓存]]
  pacman -S rsync
+
  </pre>
+
  
* Create a directory to host the mirrored files. As of March 2005, "current" requires a little over 500 MB while "extra" weighs around 2.2 GB. You can also mirror "testing" (800 MB) and "unstable" (350 MB) if you wish to. Also change permissions so an unprivileged user (in our example "chris") owns the folders.
+
==本地镜像==
  <pre>
+
  mkdir -p /mirror/{current,extra}
+
  # mkdir /mirror/{testing,unstable}
+
  chown -R chris /mirror
+
  </pre>
+
  
* Fire up your favourite editor and create a file named /mirror/sync.sh with the following content. If you want to mirror "testing" and "unstable" as well, comment out the corresponding lines. You may also adjust the address of the mirror to one geographically close to you.
+
===需要牢记的事实===
  <pre>
+
* 镜像的带宽不是免费的,镜像必须为提供给你的数据付费
  #!/bin/sh
+
** 尽管你已经为你的ISP付费,这也是成立的。
  rsync -avz --delete rsync.archlinux.org::current /mirror/current/
+
* 有很多你可能下载了却永远用不到的包
  rsync -avz --delete rsync.archlinux.org::extra /mirror/extra/
+
* 镜像的管理员会更喜欢让你仅下载需要的包
  # --delete to delete old files remove it if you want to keep them
+
* 再次请求仔细查看上面的替代方案
  # rsync -avz --delete rsync.archlinux.org::ftp/testing /mirror/
+
  # rsync -avz --delete rsync.archlinux.org::ftp/unstable /mirror/
+
  </pre>
+
  
* Make the newly created script executable:
+
'''如果你完全确定本地镜像是唯一合适的解决方案,那么按照下面的指引操作。'''
  <pre>
+
  chmod a+x /mirror/sync.sh
+
  </pre>
+
  
* Make sure dcron is installed (it should already be):
+
===服务器设置===
  <pre>
+
====Building Rsync Command====
  pacman -Q dcron
+
* Use the rsync arguments from [https://wiki.archlinux.org/index.php/DeveloperWiki:NewMirrors DeveloperWiki:NewMirrors]
  </pre>
+
* 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
  
* Create a cron script with the name /etc/cron.daily/sync and the following content, and replace "chris" with the name of an unprivileged user on your system:
+
#Exclude i686 Packages
  <pre>
+
*/os/i686
  #!/bin/sh
+
pool/*/*-i686.pkg.tar.xz
  SYNCLOGFILE="/var/log/sync.log"
+
pool/*/*-i686.pkg.tar.gz
  SYNCLOCKFILE="/var/lock/sync.lock"
+
  
  if [[ -f $SYNCLOCKFILE ]]; then
+
#Exclude x86_64 Packages
    # lock file already present, bail
+
*/os/x86_64
    exit 1
+
pool/*/*-x86_64.pkg.tar.xz
  fi
+
pool/*/*-x86_64.pkg.tar.gz
 +
</pre>
  
  echo -n ">>> Sync log for " > $SYNCLOGFILE
+
* All packages reside in the pool directory. Symlinks are then created from pool to core/extra/testing/etc..
  date >> $SYNCLOGFILE
+
** 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
  
  cd /mirror
+
Example: {{Ic|1=rsync ''$rsync_arguments'' --exclude="/path/to/exclude.txt" ''rsync://example.com/'' /path/to/destination}}
  touch $SYNCLOCKFILE
+
  su - chris -c "/mirror/sync.sh" >> $SYNCLOGFILE
+
  rm -f $SYNCLOCKFILE
+
  
  </pre>
+
====Example Script====
  
* Set permissions:
+
{{Warning|DO NOT USE THIS SCRIPT UNLESS YOU HAVE READ WARNINGS AT THE START OF THIS ARTICLE}}
  <pre>
+
{{Warning|Only use this script to sync Core/Extra/Community! If you need Testing, gnome-unstable or any other repo, use rsync --exclude instead!}}
  chmod 744 /etc/cron.daily/sync
+
  </pre>
+
  
Now the mirror will be synchronized at 00:02 AM everyday. What's now left to do is to tell our system to actually make use of the local mirror.
+
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.
  
* Modify the file /etc/pacman.d/current so that it looks like this:
+
#!/bin/bash
   <pre>
+
  #
+
#################################################################################################
   # CURRENT: Arch Linux core repository
+
### 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.
  [[current]]
+
### REMEMBER:
  Server = file:///mirror/current/os/i686
+
###   * Bandwidth is not free for the mirrors. They must pay for all the data they serve you
  Server = ftp://ftp.archlinux.org/current/os/i686
+
###      => This still applies although you pay your ISP
  # Also include the rest of the mirrors if you want
+
###      => There are many packages that will be downloaded that you will likely never use
  </pre>
+
###      => 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
  
* Modify the file /etc/pacman.d/extra so that it looks like this:
 
  <pre>
 
  #
 
  # The Extra Repository
 
  #
 
  [[extra]]
 
  Server = file:///mirror/extra/os/i686
 
  Server = ftp://ftp.ibiblio.org/pub/linux/distributions/archlinux/extra/os/i686
 
  # Also include the rest of the mirrors if you want
 
  </pre>
 
  
* Do the same for the "testing" and "unstable" files if you decided to mirror those as well.
+
====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.
  
* Wait for the first sync to finish (check /var/log/sync.log), then try and see if it works:
+
#!/usr/bin/lftp -f
  <pre>
+
lcd /local/path/to/your/mirror
  pacman -Sy
+
open ftp.archlinux.org (or whatever your favorite mirror is)
  </pre>
+
# 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 &
  
* That should yield something like this:
+
if you want to see the current status of the mirror. open lftp on terminal and type 'attach <PID>'
  <pre>
+
  :: Synchronizing package databases...
+
  current                 [[/mirror/current/os/i686/]] 100%    LOCAL
+
  extra                    [[/mirror/extra/os/i686/]] 100%    LOCAL
+
  </pre>
+
  
That's it!
+
====Partial mirroring====
  
I'd appreciate any comments and suggestions in IRC, my nick is busfahrer and I'm on #archlinux on irc.freenode.net
+
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.
  
(This document is released under the [[http://www.gnu.org/licenses/fdl.txt GFDL]].)
+
====Serving====
 +
*HTTP (LAN)
 +
**[[LAMP]]
 +
**[[Lighttpd]]
 +
*FTP (LAN)
 +
**[[vsftpd]]
 +
*Physical Media
 +
**Flash Drive
 +
**External HD
  
To go further, try [[Howto_Upgrade_via_Home_Network | this]].
+
===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

Tango-preferences-desktop-locale.png本页面需要更新翻译,内容可能已经与英文脱节。要贡献翻译,请访问简体中文翻译组Tango-preferences-desktop-locale.png

附注: Article has been updated. To be translated.
警告: 如果你想创建一个官方镜像,参考 这个页面

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}
  • 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

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

#################################################################################################
### 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)