使mirror://mirrors.ubuntu.com高度可用


26

我们是一个分布式团队,这就是为什么我们的VM使用Ubuntu mirror://设置的原因。我们的/etc/apt/sources.list外观如下:

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

就其本身而言,这是非常了不起的,并且对于在不同位置工作的人们非常有帮助-无需本地定制等。理论上的故障转移。

在日常情况下,此设置经常失败。我本周要说2-3次。

现在mirrors.ubuntu.com返回ftp.uni-bayreuth.de作为我的壁橱镜子。不幸的是,它似乎已经失败了。

这已经进行了几个小时,镜子是由一所大学的志愿者主持的,今天是星期五,我希望这种情况很快得到纠正。

所有谈话,我的问题是:

  • 有人用吗?
  • 您如何解决停机时间?(我的快速修复是一个shell脚本)
  • 我如何帮助改善这种情况?


@RaduRădeanu -这是我第一次读到netselect ...8oþ
dschinn1001

@RaduRădeanu有趣的提示!干杯! 我正在尝试使用mirror:线程中更新最多的方法。我的问题是,每当最快的镜像发生故障时,就不会发生故障转移,并且会陷入困境。
直到

是否可以选择创建自己的Ubuntu镜像?
米奇

@Till能否让我知道您是否可以拥有自己的镜子。
米奇

Answers:


10

我个人认为,选择最佳Ubuntu存储库镜像的最佳方法是使用GUI方法:

下载服务器

现在,为了改善问题中描述的情况,您需要以某种方式设置一些规则。必须遵守这些规则mirrors.ubuntu.com。我可以建议一些规则如下:

  • 列出最佳/首选镜子;您可以在这里这里这里看到很多镜子
  • 如果您发现一面好镜子,请将其添加到列表中
  • 如果镜子有时掉下来或坏了,则说明该镜子不是好镜子,您应该将其从列表中删除
  • 您可以使用netselectapt-spyapt-fast
  • 和其他,取决于您的要求。

接下来,要了解如何解决,我可以为您提供一个方法,其中包含三个bash脚本示例,并逐步进行了描述。第一个脚本使用当前所在国家/地区的镜像代替mirrors.ubuntu.com/mirrors.txt(对于每个国家/地区,都有一个与镜像相关联的文本文件;请参阅http://mirrors.ubuntu.com/):

  • 终端运行中mkdir -p bin- 如果您还没有bin目录,此命令将在您的home文件夹中创建目录。
  • 运行后gedit ~/bin/change_sources.sh-这将change_sources.sh在gedit中创建新文件。
  • 将以下脚本之一复制并粘贴到新创建的文件中:
#!/bin/bash

export DISPLAY=:0

if ! [ "`ping -c 1 google.com`" ]; then
    notify-send "No internet connection"
    exit 0  
fi

ip=$(curl -s 'http://ipecho.net/plain')
country=$(curl -s 'http://geoiplookup.net/geoapi.php?output=countrycode' \
    | awk '{ print toupper($2) }')
release=$(lsb_release -sc)

file="/etc/apt/sources.list"
old_file="/etc/apt/sources.list.old"

line=$(head -n 1 $file)
new_line="## Ubuntu Repos for $ip"

if [ "$line" == "$new_line" ] ; then
    exit 0
fi

cp -f $file $old_file

printf "$new_line
deb mirror://mirrors.ubuntu.com/$country.txt $release main restricted universe multiverse
deb mirror://mirrors.ubuntu.com/$country.txt $release-updates main restricted universe multiverse
deb mirror://mirrors.ubuntu.com/$country.txt $release-backports main restricted universe multiverse
deb mirror://mirrors.ubuntu.com/$country.txt $release-security main restricted universe multiverse
" > $file

notify-send "$file has been changed" "The old file has been put in $old_file"

exit 0

或者,类似于在http://repogen.simplylinux.ch/上可以找到的东西

#!/bin/bash

export DISPLAY=:0

if ! [ "`ping -c 1 google.com`" ]; then
    notify-send "No internet connection"
    exit 0  
fi

ip=$(curl -s 'http://ipecho.net/plain')
country=$(curl -s 'http://geoiplookup.net/geoapi.php?output=countrycode' \
    | awk '{ print tolower($2) }')
release=$(lsb_release -sc)

file="/etc/apt/sources.list"
old_file="/etc/apt/sources.list.old"

line=$(head -n 1 $file)
new_line="## Ubuntu Main Repos for $ip"

if [ "$line" == "$new_line" ] ; then
    exit 0
fi

cp -f $file $old_file

printf "$new_line
deb http://$country.archive.ubuntu.com/ubuntu/ $release main restricted universe  multiverse
deb-src http://$country.archive.ubuntu.com/ubuntu/ $release main restricted universe multiverse

## Ubuntu Update Repos for $ip
deb http://$country.archive.ubuntu.com/ubuntu/ $release-security main restricted universe multiverse
deb http://$country.archive.ubuntu.com/ubuntu/ $release-updates main restricted universe multiverse
deb-src http://$country.archive.ubuntu.com/ubuntu/ $release-security main restricted universe multiverse
deb-src http://$country.archive.ubuntu.com/ubuntu/ $release-updates main restricted universe multiverse
" > $file

notify-send "$file has been changed" "The old file has been put in $old_file"

exit 0

或者,使用脚本netselect(下载从这里,安装说明这里)作为izx柠尼斯解释这个答案

#!/bin/bash

export DISPLAY=:0

if ! [ "`ping -c 1 google.com`" ]; then
    notify-send "No internet connection"
    exit 0  
fi

url=$(netselect \
    `wget -q -O- https://launchpad.net/ubuntu/+archivemirrors \
        | grep -P -B8 "statusUP|statusSIX" \
        | grep -o -P "(f|ht)tp.*\"" \
        | tr '"\n' '  '` \
    | awk '{print $2}')
release=$(lsb_release -sc)

if [ "$url" == "" ] ; then
    exit 0
fi

file="/etc/apt/sources.list"
old_file="/etc/apt/sources.list.old"

cp -f $file $old_file

printf "## Ubuntu Best Repos
deb http://extras.ubuntu.com/ubuntu $release main
deb-src http://extras.ubuntu.com/ubuntu $release main
deb $url $release main universe restricted multiverse
deb http://security.ubuntu.com/ubuntu/ $release-security restricted universe main multiverse
deb $url $release-updates restricted universe main multiverse
" > $file

notify-send "$file has been changed" "The old file has been put in $old_file"

exit 0
  • 保存文件并关闭它。
  • 返回终端并运行: chmod +x ~/bin/change_sources.sh -授予脚本执行权限。
  • 仅出于测试目的,要运行新脚本,请输入terminal ~/bin/change_sources.sh。这将给您一个错误,因为您无权编辑/etc/apt/sources.list。所以用sudo ~/bin/change_sources.sh
  • 使用sudo crontab -e命令编辑root用户的crontab文件,并添加以下行:
@hourly /home/$USER/bin/change_sources.sh  
#change $USER with your user name
  • 我已经为每个小时安排了cron工作,但是您可以根据自己的意愿或认为更好的方式进行更改。在这种意义上,请参见http://en.wikipedia.org/wiki/Cron
  • 保存文件,然后使用检查新的crontab条目sudo crontab -l

注意:要还原此脚本所做的更改,请删除cron作业并按照上图的指示进行操作,或者在终端中使用next命令:

cp -f /etc/apt/sources.list.bak /etc/apt/sources.list

从现在开始,找到IP地址更改后,文件将动态更改。

它可能不是最佳解决方案,但是我认为,可以像上面的脚本中那样以一种很好的解决方案


2
我想我会争论一下是否可以将linux上的gui视为传统方式。:)但无论如何:您的第一个脚本解决了一个问题,我没有。镜像语法已经获取了我的德语镜像,或者是美国或任何地方的人。第二个脚本使用国家/地区镜像-它们似乎具有最小的可用带宽(在启动板的archivemirrors列表中看到),第三个脚本假定快速(或最接近)的镜像确实是最好的。回到原点。我正在编写一个小apt-spy脚本。稍后将在此处更新。
直到

1
@Till好,您的问题是“ 您如何在停机时间附近工作? ”和“ 我如何帮助改善这种情况? ”。我向我展示了我的工作方式,并建议您如何帮助改善...。另外,如果您读完我的答案,您会发现我知道“ 这可能不是最佳解决方案,但我认为就像上面的脚本中那样,可以以这种方式给出一个好的解决方案。最后,如果您有兴趣修复/改进损坏的服务器,在这里似乎没什么意思,您应该与这些服务器的所有者联系。
RaduRădeanu13年

2
我认为这不是题外话。Canonical / Ubuntu的各种人员告诉我在这里添加我的问题。这就是为什么我首先在​​这里,而且我猜也是为什么要分配赏金。
直到

1
@Till Yep,问题很好,但不是您在这些评论中重新提出的。如果没有相应服务器的管理员,没有人会回答“如何修复损坏的镜像服务器”。
RaduRădeanu13年

1
我不想修复该服务器,我想修复选择算法和缺少故障转移。
直到

4

我感谢所有有关此问题的意见,但由于没人能提出适合我们情况的简单解决方案,因此我决定解决此问题此问题。

我创建了一个工具(专门针对Ubuntu),我称之为 apt-spy2

该工具的主要目标是找到可行的快速镜。工作的定义是镜像服务器可用并且(希望:)是最新的。

我不假设所选服务器是否一定是最接近和最快的服务器。我没有执行任何ping或GEO DNS技巧-但到目前为止,当出现问题时,此方法有效。

运作方式-简而言之:

  1. 我使用http://mirrors.ubuntu.com启动板的镜像列表来检索服务器。
  2. 我对每个参数都进行了简单检查(针对HTTP响应状态代码)。
  3. LBNL,我更新了/etc/apt/sources.list

请注意:这是假设人们玩得很好并且放置了其他镜子(例如,第3方存储库)/etc/apt/sources.list.d。但是我想这意味着仍有改进的空间。

您可以像这样获得此工具:

$ [sudo] gem install apt-spy2

CLI中自带的listcheckfixhelp(关于如何使用它的扩展信息)。

我试图在项目的自述文件中尽可能多地记录文档

当前版本非常保守 0.5.0

该代码是开源的,许可证是自由的。我全力以赴。


您是否已将此文件上传到ubuntu存储库?
Braiam 2014年

@Braiam 您可以像这样获得此工具:sudo gem install apt-spy2
RaduRădeanu2014年

@RaduRădeanu我想问他是否上传了它,因为我有兴趣将某些东西打包到Debian中。
Braiam 2014年

@Braiam我没有打包它,但是如果有人这样做我会欢迎的。:)
直到

@Braiam Btw,这不太可能与Debian一起使用。(仅适用于Ubuntu的。
直到

2

Debian 6.0.4中有以下命令:

间谍

这样做是为了自动查找下一个最接近的可用服务器并生成新的sources.list。

在Ubuntu中,此命令似乎不存在?

它仍然存在于Debian 7.0 wheezy中:

https://launchpad.net/debian/wheezy/+source/apt-spy/+版权

您可以在此处下载* .deb软件包:

http://packages.debian.org/sid/apt-spy

...仍在寻找来源...

在编辑带有entry的sources-list之后,您显然需要Debian-7.0-Installation来获取源代码:

deb-src http://http.debian.net/debian wheezy main

然后在sudo apt-get更新之后,您只需使用以下代码即可吸收代码:

sudo apt-get source apt-spy


感谢您的建议,apt-spy确实很棒。我不确定效果是否良好。每次我将Debian东西安装到ubuntu中时,由于其他依赖关系,它迟早都会崩溃。
直到

@Till-Linux越来越苛刻之后,它总是需要更多的挖掘工作。
dschinn1001 2013年


@Till您的意思是:构建它!还是建造...?-我下次会照顾-现在这里满月了,
很闷...-dschinn1001

你快!
dschinn1001 2013年

2

也许没有使用您喜欢的解决方案,但是当您下载数MB的软件包(大多数情况下,我打赌是相同的)并且由于您是从同一服务器下载的,因此为.deb文件设置本地缓存应该是理想的选择可能想牺牲一台PC来创建缓存并减少服务器的繁忙度。

程序

您应该能够apt-cacher在硬盘驱动器上有很多空间的机器上进行设置(您将需要它)。您可以使用Apt-cacher服务器指南进行配置,但可以快速恢复。

  1. 安装 apt-cacher

    须藤apt-get install apt-cacher apache2

  2. 编辑/etc/default/apt-cacherautostart值并将其设置为1,以便在计算机启动时启动缓存。
  3. 重新启动Apache sudo /etc/init.d/apache2 restart
  4. 使用测试您的缓存http://ip-of.your.cache:3142/apt-cacher
  5. 您应该允许主机使用缓存,因此请编辑/etc/apt-cacher/apt-cacher.conf并查找该行allowed_hosts。您可以为所有主机设置类似192.168.0.0/24或仅的子网*
  6. 寻找一个快速,可靠的服务器。您可以apt-spy为此使用(此命令可能要花费数小时,因为它还会测试每个服务器的速度)。
  7. 在您的客户中,您有两种选择:

    • 设置sources.list如下:

    deb http://ip-of.your.cache:3142 / the.server.you.like / ubuntu / lucid主要受限的宇宙multiverse

    更改ip-of.your.cache缓存IP地址和the.server.you.like将要使用的服务器的主机名。您可以使用几行。

    • 或设置为使用代理:编辑/etc/apt/apt.conf.d/01proxy并添加以下行:

    Acquire :: http :: Proxy“ http://ip-of.your.cache:3142 ”;


如果您在全球范围内使用apt-spy,它将持续一段时间...但是您可以通过以下方式使用此命令,例如:Europe-apt-spy -d testing -a Europe
dschinn1001

@ dschinn1001 -d testing闻起来像Debian。
Braiam

那么好:apt-spy -a Europe
dschinn1001

“下票”?-我没有选票吗?-有时候我会意外地用鼠标点击-我从不对目标投反对票!所以投票给你!谢谢。
dschinn1001 2013年

1

您可以尝试设置自己的Ubuntu镜像。这样,更新将是本地的。

apt-mirror需要高速的Internet连接和大量的磁盘空间

使用apt-mirror可以很容易地设置自己的Ubuntu镜像。

1)进入apt-mirror存储库。像这样备份您的sources.list文件:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.old

2)像这样编辑sources.list文件:

gksudo gedit /etc/apt/sources.list

3)并在新行中插入以下内容:

deb http://apt-mirror.sourceforge.net/ apt-mirror

4)让我们更新包索引

sudo apt-get update

5)并安装apt-mirror

sudo apt-get install apt-mirror

6)现在已经建立了Apt镜像,因此让我们告诉它要镜像的服务器:

sudo cp /etc/apt/mirror.list /etc/apt/mirror.list.old
gksudo gedit /etc/apt/mirror.list

默认配置会将您下载的文件放在/ var / spool / apt-mirror文件夹中。这是mirror.list文件的样子:

############# config ##################
#
set base_path /media/silo/repo
#
# if you change the base path you must create the directories below with write privlages
#
# set mirror_path $base_path/mirror
# set skel_path $base_path/skel
# set var_path $base_path/var
# set cleanscript $var_path/clean.sh
# set defaultarch <running host architecture>
set nthreads 20
set tilde 0
#
############# end config ##############
deb http://archive.ubuntu.com/ubuntu lucid main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu lucid -updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu lucid -backports main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu lucid -security main restricted universe multiverse
clean http://archive.ubuntu.com/ubuntu

这仅镜像二进制软件包,但是如果您想要源软件包,则应插入适当的行。它们通常采用以下形式:

deb-src http://gh.archive.ubuntu.com/ubuntu/ lucid main restricted

7)现在,运行apt-mirror。这将需要一段时间。如果您无法一次下载所有文件,apt-mirror可以继续下载(请使用Ctrl+ C组合键将其杀死,然后在需要继续时重新运行),请不要担心。好的,像这样运行apt-mirror:

sudo apt-mirror /etc/apt/mirror.list

另请参阅如何使用apt-mirror创建本地Debian / Ubuntu镜像

来源:使用Apt镜像创建您自己的Ubuntu镜像


如果内存对我有用,apt-mirror请在ubuntu存储库中找到。
Braiam

顺便说一句,请务必注意需要高清空间以下载完整的镜像;)
Braiam 2013年

感谢您的回答,这是设置镜像的好资源,我已经考虑过了,但是然后我需要在至少3个不同的位置使用此setuo。我知道我在这里很挑剔,但我仍然认为mirrors.ubuntu.com应该这样做。:)
耕种

@till mirrors.ubuntu.com永远不会解析mirrors.ubuntu.com,而是离您最近的服务器。问题是它解析的服务器是不可靠的。您最好的选择是使用官方列表中的可靠服务器。
Braiam

@Braiam知道为什么它返回不可靠的镜像吗?
直到

1

我编写了一个名为apt-select的Python脚本以用作GUI方法的CLI替代方法。

该脚本通过TCP查询每个镜像,以最低的延迟打印到stdout镜像,并生成一个新sources.list文件。还有多个选项可让您从已排序的镜像列表中进行选择,并检索信息,例如上次更新镜像的时间及其带宽容量。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.