當前位置: 首頁>>技術教程>>正文


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/zh-tw/article/11872.html,未經允許,請勿轉載。