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

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

我们是一个分布式团队,这就是为什么我们的虚拟机使用 Ubuntumirror://设置。我们的虚拟/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 脚本)
  • 我能怎样帮助改善这种情况?

答案1

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

下载服务器

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

  • 列出最佳/首选镜像;如你所见,有很多镜像这里这里或者这里
  • 如果你找到了好的镜子,请将其添加到列表中
  • 如果镜像有时出现故障或损坏,则意味着它不是好的镜像,您应该将其从列表中删除
  • 您可以使用netselectapt-spy或者apt-fast
  • 以及其他,取决于您的要求。

接下来,为了了解如何解决此问题,我可以使用三个 bash 脚本示例逐步介绍一种方法。第一个脚本使用您当前所在国家的镜像,而不是mirrors.ubuntu.com/mirrors.txt(每个国家都有一个与镜像关联的文本文件;请参阅http://mirrors.ubuntu.com/):

  • 在一个终端运行-如果您还没有目录,mkdir -p bin此命令将bin在您的文件夹中创建一个目录。home
  • 运行后- 这将在 gedit 中gedit ~/bin/change_sources.sh创建新文件。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(从下载这里,安装说明这里) 作为韋萊解释得很好这个答案

#!/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
  • 使用命令编辑root用户的crontab文件sudo crontab -e,并添加以下行:
@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 作业并按照上图中的指示进行操作,或者在终端中使用下一个命令:

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

从现在起,当文件发现 IP 地址发生变化时,它将会动态地更改。

这可能不是最好的解决方案,但在我看来,可以像上面的脚本一样通过这种方式给出一个好的解决方案

答案2

我感谢大家对这个问题的意见,但由于没有人提出一个适合我们情况的简单解决方案,我决定使固定我自己的问题。

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

此工具的主要目的是找到在职的镜像快速。工作是指镜像服务器可用并且(希望如此:)是最新的。

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

工作原理 — 简而言之:

  1. 我用http://mirrors.ubuntu.com或者launchpad 的镜像列表检索服务器。
  2. 我对每个都做了简单的检查(针对 HTTP 响应状态代码)。
  3. LBNL,我更新/etc/apt/sources.list

请注意:这假设人们表现良好并放入额外的镜像(例如第三方存储库)/etc/apt/sources.list.d。但我想这意味着还有改进的空间。

你可以通过如下方式获取此工具:

$ [sudo] gem install apt-spy2

CLI 附带list、、checkfixhelp包含有关如何使用它的扩展信息)。

我尝试在项目的自述

当前的版本非常保守0.5.0

代码是开源的,许可证是自由的。我接受所有贡献。

答案3

Debian 6.0.4 中有这个命令:

apt-spy

这项任务会自动找到下一个最近的可用服务器,并生成一个新的 sources.list

在 Ubuntu 中这个命令似乎不存在?

它仍然存在于 Debian 7.0 wheezy 中:

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

您可以在这里下载您的 *.deb 包:

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

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

显然,您需要 Debian-7.0-Installation 才能在使用以下条目编辑源列表后获取源代码:

deb-源文件http://http.debian.net/debian喘息主要

然后,在 sudo apt-get update 之后,您只需使用以下命令获取代码:

sudo apt-get 源 apt-spy

答案4

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

apt-mirror 需要高速互联网连接和大量磁盘空间

使用 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-mirror 现在已经设置好了,让我们告诉它要镜像哪些服务器:

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-mirror 创建自己的 Ubuntu 镜像

相关内容