如何从命令行选择最快的镜像?

我想通过命令行在全新的Ubuntu Server安装中,使用最快的服务器更新我的sources.list文件。我知道在图形界面下这很容易做到,但似乎没有简单的方法可以通过命令行完成?

3在正则表达式中,“.”字符表示任何字符。如果你想匹配一个“.”,你需要用“\”进行转义,所以us.archive[..]应该写成us.archive[..]。 - Egil
相关链接:http://askubuntu.com/questions/37753/how-can-i-get-apt-to-use-a-mirror-close-to-me - Jorge Castro
2在我的情况下,我不得不用斜杠(/)替换#符号。否则会出现sed: -e expression #1, char 53: unterminated s' command`的错误提示。 - Ethan Leroy
@EthanLeroy 我也是用的Ubuntu 12.04.3版本。 - logoff
应该使用斜杠而不是井号。 - hookenz
14个回答

你不再需要进行任何搜索了 - 正如ajmitch所解释的那样,你可以使用deb镜像来自动选择最佳镜像。

apt-get now supports a 'mirror' method that will automatically select a good mirror based on your location. Putting:

deb mirror://mirrors.ubuntu.com/mirrors.txt precise main restricted universe multiverse
deb mirror://mirrors.ubuntu.com/mirrors.txt precise-updates main restricted universe multiverse
deb mirror://mirrors.ubuntu.com/mirrors.txt precise-backports main restricted universe multiverse
deb mirror://mirrors.ubuntu.com/mirrors.txt precise-security main restricted universe multiverse

on the top in your /etc/apt/sources.list file should be all that is needed to make it automatically pick a mirror for you based on your geographical location.

Lucid (10.04), Maverick (10.10), Natty (11.04), and Oneiric (11.10) users can replace precise with the appropriate name.


1很好的建议。只是要注意,在进行任何apt-get install之前,更改后需要运行sudo apt-get update以便使用最近的镜像。 - Simon East
2相关链接:http://askubuntu.com/q/319433/11244 - Till
29不错的建议,但对我来说没有帮助。它是根据地理位置定位的,给我提供了本地服务器,但在我所处的地方速度要慢得多。在这里,网络的临时距离才是重要因素,而不是空间距离。 - jarondl
事实上,以意大利为例,在这里使用的镜像下载速度较慢。 - Stefano
2目前无法使用:https://bugs.launchpad.net/ubuntu/+source/apt/+bug/1613184 - marathon
1马拉松至少在18.04版以上已修复。 - Pablo Bianchi
就我所知,目前在16.04上也可以运行,尽管似乎会破坏do-release-upgrade。 - Thomas
你说“把这些放在文件顶部”,是指保留下面的条目不变,还是应该将它们注释掉? - phocks

这里有一种永远有效的方法,使用古老而可靠的 netselect 和一些 grep 魔法:
终端控的“寻找最佳服务器”技巧!
  • 从Debian网站上下载并使用dpkg -i命令安装netselect(根据你的架构链接,文件大小约为125 KB,无依赖项)

  • 使用以下命令从你所在位置找到最快的Ubuntu镜像,可以是最新的或者最多落后六小时(我会在下面解释,抱歉在Markdown中无法很好地分割)

    sudo netselect -v -s10 -t20 `wget -q -O- https://launchpad.net/ubuntu/+archivemirrors | grep -P -B8 "statusUP|statusSIX" | grep -o -P "(f|ht)tp://[^\"]*"`
    
  • netselect

    1. -v 使其稍微冗长一些--你想看到进度点和消息,告诉你不同的镜像映射到相同的IP地址 :)
    2. -sN 控制最终要选择多少个镜像(例如前10个镜像)
    3. -tN 是每个镜像进行速度测试的时间(默认为10;数字越大,花费的时间越长,但结果更可靠)
  • 这是反引号的部分(不要粘贴,仅用于解释)

    wget -q -O- https://launchpad.net/ubuntu/+archivemirrors \
    | grep -P -B8 "status(UP|SIX)" \
    | grep -o -P "(f|ht)tp://[^\"]*"
    
    1. wgethttps://launchpad.net/ubuntu/+archivemirrors获取最新的镜像状态。
    2. 第一个 grep 提取最新或落后六小时的镜像,以及包含实际ftp/http URL的前8行上下文
    3. 第二个 grep 提取这些ftp/http URL
这是来自美国加利福尼亚州的一个示例输出:
 60 ftp://mirrors.se.eu.kernel.org/ubuntu/
 70 http://ubuntu.alex-vichev.info/
 77 http://ftp.citylink.co.nz/ubuntu/
279 http://ubuntu.mirrors.tds.net/pub/ubuntu/
294 http://mirror.umd.edu/ubuntu/
332 http://mirrors.rit.edu/ubuntu/
364 ftp://pf.archive.ubuntu.com/ubuntu/
378 http://mirror.csclub.uwaterloo.ca/ubuntu/
399 ftp://ubuntu.mirror.frontiernet.net/ubuntu/
455 http://ubuntu.mirror.root.lu/ubuntu/

“等级”是一个任意的度量标准;通常较低的等级更好。
如果你想知道为什么来自加利福尼亚州的kernel.org瑞典-欧盟镜像和一个新西兰镜像排名前三,那么我也很好奇;-) 事实是,netselect在多个镜像映射到同一个IP时,并不总是选择显示最合适的URL;第三名也被称为nz.archive.ubuntu.com!

14Netselect会选择具有低UDP或ICMP延迟的镜像站点,但不一定会选择能提供更多带宽的镜像站点。 - Tobu
@pix,我已经批准了你的编辑,但是它并不是命令替换导致换行符被替换。而是后续的字段分割去除了换行符。命令替换只会去除尾部的换行符。 - muru
如果你偏好使用HTTPS镜像,请使用grep -P -B9 "statusUP|statusSIX" | grep -o -P "https://[^\"]*"命令来获取HTTPS镜像。 - Clement Cherlin

根据mirrors.ubuntu.com为您的IP选择下载速度最快的镜像的一行代码。
curl -s http://mirrors.ubuntu.com/mirrors.txt | xargs -n1 -I {} sh -c 'echo `curl -r 0-102400 -s -w %{speed_download} -o /dev/null {}/ls-lR.gz` {}' |sort -g -r |head -1| awk '{ print $2  }'

4要有更多的选择,在最后加上 sort -gr | head -3 - Pablo Bianchi
我发现这个答案中的 curl 部分很有帮助,因为 curl -r 0-102400 -o /dev/null [server_url]/ls-lR.gz,其中 [server_url] 是在 mirrors.txt 中列出的基本镜像 URL,允许对来自镜像的前 ~100K 的索引文件进行速度比较。 - jamesc
1这个测试用来测试传输速度,绝对比netselect有所改进。每个服务器只下载10k的数据,可能不能很好地代表在更快的连接上的稳定传输速度。不过,可以将这个数字增加到102400来进行更大规模的下载测试。 - Phil Miller
这个真是太棒了。 - sam
对于xargs警告的一个小修复:xargs: 警告: 选项--max-args和--replace/-I/-i是互斥的,忽略之前的--max-args值 curl -s http://mirrors.ubuntu.com/mirrors.txt | xargs -I {} sh -c 'echo $(curl -r 0-102400 -s -w %{speed_download} -o /dev/null {}/ls-lR.gz) {}' | sort -g -r | head -1 | awk '{ print $2 }' - Alan G.
这是一个非常有用的解决方案。我对GitHub Actions进行了一些改进。更多细节请参阅https://github.com/actions/runner-images/issues/675#issuecomment-1381837292。 - Lari Hotari
我们要如何将获取到的URL添加到 /etc/apt/sources.list 文件中? - Surya

包 netselect-apt
dapper (net): 使用 netselect 选择最快的 Debian 镜像 [universe] 0.3.ds1-5:all hardy (net): 使用 netselect 选择最快的 Debian 镜像 [universe] 0.3.ds1-11:all
包 apt-spy
dapper (admin):基于带宽测试编写 sources.list 文件 [universe] 3.1-14:amd64 i386 powerpc
由于安全问题,新版 Ubuntu 中未包含此软件,请参见:Bug report 但是……我通常只使用ping来查找连接到某个位置的速度、跳数和延迟。

5在Ubuntu 12.04中似乎没有netselect-apt可用。 - offby1
请点击此处查看正确的链接:https://bugs.launchpad.net/ubuntu/+source/netselect/+bug/337377 - Rinzwind
13这不再是最受赞同或最好的答案了,请查看下一个。 - ntg
哪个答案是“下一个”可能已经改变了。 - gmatht
apt-spy在Debian 9中已经消失了,但netselect-apt还可以使用。 - netawater
在18.04的仓库中似乎没有netselect-aptapt-spy - k0pernikus
这些是在18.04版本的缺失软件包列表上:https://launchpad.net/ubuntu/bionic/+missingpackages(回答中有一句“由于安全问题似乎没有包含在较新的Ubuntu中”)apt-spy2的源代码链接为:https://github.com/lagged/apt-spy2 - Rinzwind
还要检查一下得到了49个以上赞同的答案。那应该是被采纳的答案。 - Rinzwind

这是我写的一个Python脚本,它可以找到具有最低TCP延迟的镜像。
该脚本还从launchpad获取带宽和状态数据,并且会自动或使用从列表中选择的镜像生成一个新的sources.list文件。
以下是一个使用示例,让您可以从5个与您的计算机延迟最低的美国镜像中进行选择:
$ apt-select --country US -t 5 --choose

5我想告诉你,我已经制作了一个Debian软件包,并将你的脚本整合其中,现在可以非常简单和直接地使用它。软件包下载链接:https://github.com/brodock/apt-select/releases/tag/0.1.0 - Gabriel Mazetto
1这是一个完美的解决方案,因为我已经尝试过其他方法。为了让新手更容易理解,我写了一篇详细介绍这种方法的帖子: https://blog.kmonsoor.com/ubuntu-update-apt-get-server-to-use-fastest-mirror/ - kmonsoor
这太好了,因为在较新的Ubuntu版本中没有netselect可用。 - Tek
请在你的帖子中示范如何使用它。 - Jonathan
1@Jonathan 完成了。完整的使用方法在第一个链接的README文件中。 - John B
只需运行pip3 install apt-select,然后例如运行apt-select -C DE - rubo77

对于命令行,你可以使用一个名为apt-smart的Python工具。
以下是一个用法示例,它可以让你列出在你所在国家范围内排名靠前的镜像(自动检测):
$ apt-smart -l

使用-l--list-mirrors命令,您将获得(来自Travis CI美国服务器的示例输出):
---------------------------------------------------------------------------------------------------------
| Rank | Mirror URL                            | Available? | Updating? | Last updated    | Bandwidth   |
---------------------------------------------------------------------------------------------------------
|    1 | http://mirrors.gigenet.com/ubuntua... | Yes        | No        | Up to date      | 1.73 MB/s   |
|    2 | http://mirror.genesisadaptive.com/... | Yes        | No        | Up to date      | 1.68 MB/s   |
|    3 | http://ubuntu.mirrors.tds.net/pub/... | Yes        | No        | Up to date      | 1.4 MB/s    |
|    4 | http://repos.forethought.net/ubuntu   | Yes        | No        | Up to date      | 1.35 MB/s   |
|    5 | http://repo.miserver.it.umich.edu/... | Yes        | No        | Up to date      | 937.62 KB/s |
...
|   75 | http://mirror.cc.vt.edu/pub2/ubuntu   | Yes        | No        | 1 day behind    | 659.67 KB/s |
|   76 | http://mirror.atlantic.net/ubuntu     | Yes        | No        | 2 days behind   | 351.26 KB/s |
|   77 | http://mirror.lstn.net/ubuntu         | Yes        | No        | 4 days behind   | 806.81 KB/s |
|   78 | http://mirrors.usinternet.com/ubun... | Yes        | No        | 4 weeks behind  | 514.31 KB/s |
|   79 | http://mirrors.arpnetworks.com/Ubuntu | Yes        | No        | 19 weeks behind | 418.94 KB/s |
|   80 | http://mirrors.ocf.berkeley.edu/ub... | Yes        | Yes       | Up to date      | 446.07 KB/s |
---------------------------------------------------------------------------------------------------------
Full URLs which are too long to be shown in above table:
1: http://mirrors.gigenet.com/ubuntuarchive
2: http://mirror.genesisadaptive.com/ubuntu
3: http://ubuntu.mirrors.tds.net/pub/ubuntu
5: http://repo.miserver.it.umich.edu/ubuntu
...
78: http://mirrors.usinternet.com/ubuntu/archive
80: http://mirrors.ocf.berkeley.edu/ubuntu


当然,如果你愿意的话,apt-smart也可以更改你的sources.list文件。
$ apt-smart -a

使用-a--auto-change-mirror,发现可用镜像,按连接速度和更新状态对镜像进行排名,并更新/etc/apt/sources.list以使用最佳可用镜像。

使用-c--change-mirror MIRROR_URL,更新/etc/apt/sources.list以使用给定的MIRROR_URL。

与其他工具相比:

  • apt-smart会自动查找您所在的位置,因此您无需在国外旅行时指定国家。
  • apt-smart从每个镜像实际进行HTTP下载以获得更准确的结果(带宽和状态),并支持HTTP代理,而不是使用ping并依赖于launchpad的不准确数据。
  • apt-smart正在维护,而大多数其他工具长时间未修复问题。

您可以通过pip轻松安装apt-smart,有关详细的复制和粘贴安装命令和用法,请参阅项目自述文件

我是 apt-smart 的作者,这是 apt-mirror-updater 的改进版本。

2这个很好用!使用"pip install apt-smart"来安装它。 - Andy Fraley
1@Andy Fraley 感谢您的评论。如果你够幸运,你可以通过 pip install apt-smart 简单地安装 apt-smart 并且在没有任何错误的情况下运行 apt-smart。但有时在某些环境中可能会显示“apt-smart”命令未找到或其他错误。这不是 apt-smart 的 bug,而是与 pip 或 Ubuntu 系统环境有关的问题,涉及它会讲得很长。因此,推荐的安装方法是按照 项目自述文件 中的安装命令进行操作,该文档清晰明了,可以整个复制粘贴到终端中。 - Martin X
@MartinX 没问题 - 这种情况经常被忽略。谢谢你的更新! - NotTheDr01ds
@MartinX 谢谢你开发这个工具,非常感谢!你有考虑过为它创建一个 .deb 包并提交到 Debian/Ubuntu 中吗?这将会非常好,让人们更容易找到它。 - Per Lundberg

我知道这并不直接回答楼主的问题,但在Ubuntu的桌面/GUI版本中有一个按钮可以为您找到最佳镜像。它似乎运行得相当不错,所以我简要地研究了一下,但没有时间跟进。
我提出这个建议的原因是因为我认为将其制作成一个命令行实用程序应该相当简单和易用。
如果有人感兴趣,测试似乎位于:
/usr/lib/python3/dist-packages/softwareproperties/MirrorTest.py

再说,这大概就是我所能做到的了,但我觉得我会把它留在这里,以防有人需要。当我有更多时间时,我可能会继续处理它。

在18.04版本中,此脚本会检测当它作为应用程序(即__main__)从终端调用时...并将结果打印到终端上。请确保给予足够的时间来完成。 $ python3 /usr/lib/python3/dist-packages/softwareproperties/MirrorTest.py >> [省略了前5个] 而获胜者是:ny-mirrors.evowise.com - PatKilg
很遗憾,它无法正常工作。这个脚本会选择5个延迟最低的服务器,并通过下载一个大约1M大小的文件(从你的发行版中的main目录下的Packages.gz文件)来评分它们的带宽。如果你修改脚本,将服务器数量增加到25个,并下载一个500M大小的文件,你将得到完全不同的结果,这次是正确的。 - Jocelyn

我开发了一个简单的基于ping的nodejs脚本,用来测试mirrors.ubuntu.com/mirrors.txt上列出的服务器,并返回最快的服务器。
sudo npm install -g ffum
ffum

请告诉我您是否觉得这个有用,或者有任何建议(=

ffum无法工作:连接错误。 - James Fu
无效:输出为空。 - Juan Simón
克隆存储库并运行node ffum - Michael
太棒了,适合我!我遇到了一个错误,它在寻找node而不是nodejs...另外,如果能显示每个测试存档速度的详细信息就更好了。 - tweak2

查找快速镜像的命令

Ubuntu 18.04 上运行以下命令可以获得良好的结果:

 python /usr/lib/python3/dist-packages/softwareproperties/MirrorTest.py

打印一个按照时间(未详细解释)组织的镜像列表,然后我使用其中排名最高的一个镜像。
更多细节:
对我来说,通过将这个命令输出的前几个结果设置为我的镜像,并在/etc/apt/sources.list中进行相应的设置,进行测试是很有用的。
time sudo apt update

为了查看从镜像下载软件包列表所需的时间,我测试了前三个建议,它们都很快,但其中一个在time sudo apt update测试中比其他两个快两倍。

这是python /usr/lib/python3/dist-packages/softwareproperties/MirrorTest.py的示例输出:

mirror: es-mirrors.evowise.com - time: 0.183778047562
mirror: it-mirrors.evowise.com - time: 0.18604683876
mirror: la-mirrors.evowise.com - time: 0.192630052567
mirror: ny-mirrors.evowise.com - time: 0.208723068237
mirror: mirrors.accretive-networks.net - time: 0.385910987854
mirror: mirror.team-cymru.org - time: 0.46785402298
mirror: mirrors.psu.ac.th - time: 1.64231991768
and the winner is: es-mirrors.evowise.com

2很遗憾,它无法正常工作。这个脚本会选择5个延迟最低的服务器,并通过下载一个大约1M大小的文件(从你的发行版中的main目录下的Packages.gz文件)来评分它们的带宽。如果你修改脚本将服务器数量增加到25个,并下载一个500M大小的文件,你将得到完全不同的结果,这次是正确的。 - Jocelyn
@Jocelyn 确实!我已经制作了一个易于使用的补丁,其中包含一些改进:https://gist.github.com/shvchk/b81e4579bff13486871f99404c497759 - Shevchuk

其他答案,包括被接受的答案,在Ubuntu 11.04及更高版本中已不再有效,因为它们推荐使用Debian软件包,如netselect-aptapt-spy,这些在Ubuntu上无法使用。
下面有两个不同的有效答案:
1. 使用apt-getmirror:方法 这种方法会向Ubuntu服务器请求一个基于您的IP地址附近的镜像列表,并选择其中一个。这是最简单的替代方法,稍微的缺点是最近的镜像有时可能不是最快的。
2. 使用netselect进行命令行操作 展示了如何使用netselect工具从网络角度而不是地理角度找到最快的最近更新的服务器。使用sed命令替换sources.list中的镜像。
使用sed命令替换sources.list中的镜像。

由于某些来源在其路径中使用附加文件夹,因此最好使用替代分隔符语法。

sudo sed -i 's%us.archive.ubuntu.com%mirrors.gigenet.com/ubuntuarchive/%' /etc/apt/sources.list