我们是一个分布式团队,这就是为什么我们的虚拟机使用 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
。我可以建议以下一些规则:
- 列出最佳/首选镜像;如你所见,有很多镜像这里,这里或者这里
- 如果你找到了好的镜子,请将其添加到列表中
- 如果镜像有时出现故障或损坏,则意味着它不是好的镜像,您应该将其从列表中删除
- 您可以使用
netselect
,apt-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 技巧 — 但到目前为止,当出现问题时,这种方法是有效的。
工作原理 — 简而言之:
- 我用http://mirrors.ubuntu.com或者launchpad 的镜像列表检索服务器。
- 我对每个都做了简单的检查(针对 HTTP 响应状态代码)。
- LBNL,我更新
/etc/apt/sources.list
。
请注意:这假设人们表现良好并放入额外的镜像(例如第三方存储库)/etc/apt/sources.list.d
。但我想这意味着还有改进的空间。
你可以通过如下方式获取此工具:
$ [sudo] gem install apt-spy2
CLI 附带list
、、check
和fix
(help
包含有关如何使用它的扩展信息)。
我尝试在项目的自述。
当前的版本非常保守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