当前位置: 首页>>技术教程>>正文


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

,

问题描述

我们是一个分散的团队,这就是为什么我们的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

就其本身而言,这是非常了不起的,并且对于在不同位置工作的人们非常有帮助-无需进行本地自定义等。理论上为Fail-over。

在day-to-day中,此设置经常失败。我想这星期说2-3次。

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

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

所有谈话,我的问题是:

  • 有人用吗?

  • 您如何解决停机时间? (我的quick-fix是一个shell脚本)

  • 我如何帮助改善这种情况?

最佳回答

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

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

  • 列出最佳/首选镜像;如您所见,有很多镜像hereherehere

  • 如果您发现一面好镜像,请将其添加到列表中

  • 如果镜像有时掉下来或坏了,则说明该镜像不是好镜像,您应该将其从列表中删除

  • 您可以使用netselectapt-spyapt-fast

  • 和其他,取决于您的要求。

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

  • terminal中,运行mkdir -p bin-此命令将在您的home文件夹中创建一个bin目录(如果尚未安装)。

  • 运行gedit ~/bin/change_sources.sh之后-这将在gedit中创建新文件change_sources.sh

  • 将以下脚本之一复制并粘贴到新创建的文件中:

#!/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(从here下载,安装说明here)作为izx的脚本在this answer中很好地解释了:

#!/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-授予脚本执行访问权限。

  • 仅出于测试目的,要运行新脚本,请输入终端~/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

  • 保存文件,并使用sudo crontab -l检查新的crontab条目。

NOTE: To revert the changes made by this script, delete the cron job and follow the indications from the picture above or use next command in terminal:

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

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

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

次佳回答

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

我创建了一个名为apt-spy2的工具(专门针对Ubuntu)。

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

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

运作方式-简而言之:

  1. 我使用http://mirrors.ubuntu.comlaunchpad’s list of mirrors来检索服务器。

  2. 我对每个参数都进行了简单检查(针对HTTP响应状态代码)。

  3. LBNL,我更新了/etc/apt/sources.list

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

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


$ [sudo] gem install apt-spy2

cli随附listcheckfixhelp(以及有关如何使用它的扩展信息)。

我尝试在该项目的README中尽可能多地记录文档。

当前版本是非常保守的0.5.0

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11872.html,未经允许,请勿转载。