问题描述
我们是一个分散的团队,这就是为什么我们的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
起作用。我可以建议一些规则,如下所示:
-
如果您发现一面好镜像,请将其添加到列表中
-
如果镜像有时掉下来或坏了,则说明该镜像不是好镜像,您应该将其从列表中删除
-
您可以使用
netselect
,apt-spy
或apt-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技巧-但到目前为止,当出现问题时,此方法仍然有效。
运作方式-简而言之:
-
我使用http://mirrors.ubuntu.com或launchpad’s list of mirrors来检索服务器。
-
我对每个参数都进行了简单检查(针对HTTP响应状态代码)。
-
LBNL,我更新了
/etc/apt/sources.list
。
请注意:这是假设人们玩得很好并且放置了其他镜像(例如,将第三方存储库放入/etc/apt/sources.list.d
中。但是我想这意味着仍有改进的空间。
您可以像这样获得此工具:
$ [sudo] gem install apt-spy2
cli随附list
,check
,fix
和help
(以及有关如何使用它的扩展信息)。
我尝试在该项目的README中尽可能多地记录文档。
当前版本是非常保守的0.5.0
。
该代码是开源的,许可证是自由的。我全力以赴。