Tornando o mirror: //mirrors.ubuntu.com altamente disponível

26

Somos uma equipe distribuída, e é por isso que nossas VMs usam a mirror://configuração do Ubuntu . Nossa /etc/apt/sources.listaparência é a seguinte:

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

Isso por si só é incrível e muito útil para pessoas que trabalham em locais diferentes - menos personalização local , etc. necessária. Failover em teoria.

No dia a dia, essa configuração falha com muita frequência. Eu quero dizer 2-3 vezes esta semana.

Agora mirrors.ubuntu.comretorna ftp.uni-bayreuth.decomo meu espelho do armário. Infelizmente, parece estar em baixo.

Isso já dura algumas horas e o espelho é hospedado por voluntários em uma universidade e hoje sendo uma sexta-feira, minhas esperanças são baixas de que isso esteja sendo corrigido em breve.

Toda conversa, minhas perguntas são:

  • Alguém usa isso?
  • Como você trabalha com o tempo de inatividade? (minha correção rápida é um script de shell)
  • Como posso ajudar a melhorar essa situação?
Até
fonte
@ RaduRădeanu - é a primeira vez que li sobre netselect ... 8oþ
dschinn1001
@ RaduRădeanu Dica interessante! Felicidades! Estou tentando usar o mirror:método que teve mais atualizações no seu segmento. Meu problema é que sempre que o espelho mais rápido falha, não há failover e eu fico preso.
Até
Está criando seu próprio espelho do Ubuntu uma opção?
Mitch
@ Até você, deixe-me saber se você pode ter seu próprio espelho.
Mitch

Respostas:

10

Pessoalmente, acho que a melhor maneira de selecionar os melhores espelhos dos repositórios Ubuntu é usar o método GUI:

servidor de download

Agora, para melhorar a situação descrita na pergunta, você precisa definir algumas regras de alguma forma. Essas regras devem agir mirrors.ubuntu.com. Eu posso sugerir algumas regras da seguinte maneira:

  • faça uma lista dos melhores / preferidos espelhos; existem muitos espelhos como você pode ver aqui , aqui ou aqui
  • se você encontrou um bom espelho, adicione-o à lista
  • se um espelho estiver quebrado ou quebrado às vezes, significa que não é um bom espelho e você deve removê-lo da lista
  • você pode usar netselect, apt-spyouapt-fast
  • e outros, dependendo de suas necessidades.

Em seguida, para ver como você pode solucionar, posso fornecer um método descrito passo a passo com três exemplos de scripts bash. O primeiro script usa os espelhos do país em que você está no momento, em vez de mirrors.ubuntu.com/mirrors.txt(para cada país, há um arquivo de texto com espelhos associados; consulte http://mirrors.ubuntu.com/ ):

  • Em uma execução de terminalmkdir -p bin - este comando criará um bindiretório em sua homepasta, se você ainda não o tiver.
  • Após a execução gedit ~/bin/change_sources.sh- isso criará o novo arquivo change_sources.shno gedit.
  • Copie e cole um dos próximos scripts no novo arquivo criado:
#!/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

ou algo semelhante ao que pode ser encontrado em 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

ou, um script usando netselect(faça o download daqui , instale as instruções aqui ) como izx explicou muito legal nesta resposta :

#!/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
  • Salve o arquivo e feche-o.
  • Volte ao terminal e execute: chmod +x ~/bin/change_sources.sh- para conceder acesso de execução ao script.
  • Apenas para teste, para executar seu novo script, digite terminal ~/bin/change_sources.sh. Isso causará um erro, porque você não tem o direito de editar /etc/apt/sources.list. Então usesudo ~/bin/change_sources.sh
  • Edite o arquivo crontab do usuário raiz usando o sudo crontab -ecomando e adicione a seguinte linha:
@hourly /home/$USER/bin/change_sources.sh  
#change $USER with your user name
  • Eu configurei o trabalho cron para cada hora, mas você pode mudar conforme desejar ou como achar melhor. Veja http://en.wikipedia.org/wiki/Cron neste sentido.
  • Salve o arquivo e verifique a nova entrada do crontab com sudo crontab -l.

NOTA: Para reverter as alterações feitas por esse script, exclua o trabalho cron e siga as indicações da figura acima ou use o próximo comando no terminal:

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

A partir de agora, o arquivo será alterado dinamicamente depois de encontrar uma alteração no endereço IP.

Pode não ser a melhor solução, mas, na minha opinião, uma boa solução pode ser dada dessa maneira, como nos scripts acima .

Radu Rădeanu
fonte
2
Eu acho que argumentaria se um gui no linux pode ser considerado da maneira tradicional. :) Mas de qualquer maneira: seu primeiro script resolve um problema, eu não tenho. A sintaxe do espelho já recebe meus espelhos alemães, americanos ou onde quer que as pessoas estejam. O segundo script usa os espelhos do país - eles parecem ter a menor largura de banda disponível (visto que na lista de espelhos de arquivos na barra de ativação), o terceiro script assume que um espelho rápido (ou o mais próximo) é realmente o melhor. De volta à estaca zero. Estou codificando um pequeno apt-spyscript agora. Será atualizado aqui mais tarde.
Até
1
@ Até agora, sua pergunta foi " Como você trabalha com o tempo de inatividade? " E " Como posso ajudar a melhorar essa situação? ". Eu mostrei como eu trabalho e sugeri como você pode ajudar a melhorar ... Além disso, se você ler minha resposta até o final, poderá ver que estou ciente de que " pode não ser a melhor solução, mas acho que que uma boa solução pode ser dada desta maneira, como nos scripts acima ". Por fim, se você estiver interessado em corrigir / melhorar servidores quebrados, isso parece fora de tópico aqui e você deve falar com os proprietários desses servidores.
Radu Rădeanu
2
Eu não acho que seja fora de tópico. Várias pessoas da Canonical / Ubuntu me disseram para adicionar minha pergunta aqui. É por isso que estou aqui em primeiro lugar e acho que também porque há uma recompensa atribuída.
Até
1
@Ainda sim, a pergunta é boa, mas não como você a reformulou nesses comentários. Ninguém responderá em "como consertar um servidor de espelho quebrado" aqui, na medida em que não seja um administrador no respectivo servidor.
Radu Rădeanu
1
Não quero corrigir esse servidor, quero corrigir o algoritmo de seleção e a falta de failover.
Até
4

Agradeço toda a entrada nesta questão, mas como ninguém encontrou uma solução simples que se encaixasse em nossas circunstâncias, decidi resolver o problema pessoalmente.

Eu criei uma ferramenta (especificamente para Ubuntu) que eu chamo apt-spy2.

O objetivo principal desta ferramenta é encontrar um espelho de trabalho rapidamente. O trabalho é definido por que o servidor espelho está disponível e (espero :) atualizado.

Não faço suposições sobre se o servidor selecionado é necessariamente o mais próximo e o mais rápido. Não estou fazendo pings ou truques de DNS GEO - mas até agora isso funciona quando algo quebra.

Como funciona - em poucas palavras:

  1. Eu uso http://mirrors.ubuntu.com ou a lista de espelhos da barra de ativação para recuperar servidores.
  2. Faço uma verificação simples em cada um (para o Código de status de resposta HTTP).
  3. LBNL, eu atualizo /etc/apt/sources.list.

Atenção: Isso pressupõe que as pessoas se comportem bem e coloquem espelhos adicionais (por exemplo, repositórios de terceiros) /etc/apt/sources.list.d. Mas acho que isso significa que há espaço para melhorias.

Você pode obter essa ferramenta da seguinte maneira:

$ [sudo] gem install apt-spy2

O cli vem com list, check, fixe help(com mais informações sobre como usá-lo).

Tentei documentar o máximo possível no arquivo README do projeto .

A versão atual é muito conservadora 0.5.0.

O código é de código aberto e a licença é liberal. E eu aceito todas as contribuições.

Até
fonte
Você fez o upload para os repositórios do ubuntu?
Braiam 29/03
@Braiam Você pode obter esta ferramenta da seguinte maneira: sudo gem install apt-spy2
Radu Rădeanu
@ RaduRădeanu Estou perguntando se ele fez o upload, pois estou interessado em empacotar algo para o Debian.
Braiam 29/03
@Braiam Eu não empacotei, mas gostaria de receber se alguém fizesse isso. :)
até
@Braiam Btw, é improvável que isso funcione com o Debian. ; (Funciona apenas com o Ubuntu.
até
2

Havia este comando no Debian 6.0.4:

apt-spy

Isso fez o trabalho de encontrar o próximo servidor disponível mais próximo automaticamente e gerar um novo sources.list

No Ubuntu, esse comando parece não existir?

Ele ainda existe no Debian 7.0 wheezy:

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

Você pode fazer o download do seu pacote * .deb aqui:

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

... ainda procurando as fontes ...

Você obviamente precisa do Debian-7.0-Installation para obter o código fonte após editar a lista de fontes com a entrada:

deb-src http://http.debian.net/debian wheezy main

Depois do sudo apt-get update, você simplesmente sugaria o código com:

sudo apt-get fonte apt-spy

dschinn1001
fonte
Obrigado pela sugestão, o apt-spy parece ótimo. Não sei se isso funciona bem. Toda vez que eu instalei o debian no ubuntu, ele quebrou mais cedo ou mais tarde devido a outras dependências.
Até
@ Até - é sempre algo com um pouco mais de escavação ... assim que o Linux está ficando mais exigente.
dschinn1001
@ Até Você quer dizer: Construa ...! ou construiu ...? - Cuido próxima vez - agora é de lua cheia aqui e am grogue ...
dschinn1001
Você é rápido !
dschinn1001
2

Talvez não esteja usando a solução que você gosta, mas a configuração de um cache local para os arquivos .deb deve ser ideal quando você baixa vários MB de pacote (a maioria deles eu aposto que são os mesmos) e, como você está baixando no mesmo servidor, pode querer sacrificar um PC para tornar o cache e tornar o servidor menos ocupado.

Procedimento

Você poderá instalar apt-cacherem uma máquina com muito espaço no disco rígido (você precisaria). Você pode configurar isso usando o guia do servidor Apt-cacher , mas vamos fazer um resumo rápido.

  1. Instalar apt-cacher

    sudo apt-get install apt-cacher apache2

  2. Edite /etc/default/apt-cachere defina o autostartvalor como 1, para que o cache inicie quando a máquina for ligada.
  3. Reinicie o apache sudo /etc/init.d/apache2 restart
  4. Teste seu cache usando http://ip-of.your.cache:3142/apt-cacher.
  5. Você deve permitir que o host use o cache, então edite /etc/apt-cacher/apt-cacher.confe procure a linha allowed_hosts. Você pode definir sub-redes como 192.168.0.0/24ou apenas *para todos os hosts
  6. Procure um servidor rápido e confiável . Você pode usar apt-spyisso (esse comando pode levar horas, pois também testa a velocidade de cada servidor).
  7. Nos seus clientes, você tem duas opções:

    • defina o sources.listseguinte:

    deb http: //ip-of.your.cache: 3142 / the.server.you.like / ubuntu / lucid principal universo restrito multiverso

    Mude ip-of.your.cachepara o ip do seu cache e the.server.you.likeo nome do host do servidor que você usará. Você pode usar várias linhas.

    • Ou configure o apt para usar um proxy: edite /etc/apt/apt.conf.d/01proxye adicione a linha:

    Adquirir :: http :: Proxy " http: //ip-of.your.cache: 3142 ";

Braiam
fonte
Se você usar o apt-spy em todo o mundo que iria durar algum tempo ... mas você pode usar este comando com fronteira com a ex Europa por: apt-spy -d testar -a Europa
dschinn1001
@ dschinn1001 -d testingcheira a Debian.
Braiam 21/07/2013
bem então: apt-spy -a Europa
dschinn1001
"voto negativo"? - Não fiz voto negativo? - acontece às vezes que clico acidentalmente com o mouse - nunca voto negativo com mira! então votou em você! THX.
dschinn1001
1

Você pode tentar configurar seu próprio espelho do Ubuntu. Dessa forma, as atualizações serão locais.

O apt-mirror precisa de uma conexão à Internet de alta velocidade e muito espaço em disco

Configurar seu próprio espelho do Ubuntu é muito fácil usando o apt-mirror.

1) entre no repositório apt-mirror. Faça backup do seu arquivo sources.list da seguinte maneira:

sudo cp /etc/apt/sources.list /etc/apt/sources.list.old

2) Edite o arquivo sources.list da seguinte maneira:

gksudo gedit /etc/apt/sources.list

3) E insira o seguinte em uma nova linha:

deb http://apt-mirror.sourceforge.net/ apt-mirror

4) Vamos atualizar o índice do pacote

sudo apt-get update

5) E instale o apt-mirror

sudo apt-get install apt-mirror

6) Agora o Apt-mirror está configurado, então vamos dizer quais servidores espelhar:

sudo cp /etc/apt/mirror.list /etc/apt/mirror.list.old
gksudo gedit /etc/apt/mirror.list

A configuração padrão colocará os arquivos baixados na pasta / var / spool / apt-mirror. Veja como é o arquivo 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

isso reflete apenas os pacotes binários, mas se você quiser pacotes de origem, insira as linhas apropriadas. Eles geralmente assumem a forma:

deb-src http://gh.archive.ubuntu.com/ubuntu/ lucid main restricted

7) Agora corra apt-mirror. Isso vai demorar um pouco. Não se preocupe se você não pode baixar todos os arquivos de uma só vez, apt-mirrorpode retomar downloads (mate-o com a combinação de teclas Ctrl+ Ce execute-o novamente quando quiser continuar). Ok, execute o apt-mirror assim:

sudo apt-mirror /etc/apt/mirror.list

Também confira Como criar um espelho local Debian / Ubuntu com o apt-mirror

Fonte: Use o Apt-mirror para criar seu próprio espelho do Ubuntu

Mitch
fonte
Se a memória me servir bem, apt-mirrorestá disponível nos repositórios do ubuntu.
Braiam
BTW, certifique-se observar a necessidade de muito espaço no HD para baixar um espelho completo;)
Braiam
Obrigado pela resposta e é um ótimo recurso para configurar um espelho, e eu considerei isso, mas eu precisaria desse conjunto em pelo menos três locais diferentes. Eu sei que sou exigente aqui, mas ainda sinto que isso mirrors.ubuntu.comdeve funcionar. :)
Até
@till mirrors.ubuntu.comnunca será resolvido mirrors.ubuntu.com, mas um servidor mais próximo de você. O problema é que o servidor que ele resolve não é confiável. Sua melhor jogada é usar um servidor confiável da lista oficial.
Braiam 22/07/2013
@Braiam alguma idéia por que espelhos não confiáveis ​​são devolvidos por ele então?
Até
1

Eu escrevi um script Python chamado apt-select para servir como uma alternativa CLI ao método GUI.

O script consulta cada espelho via TCP, imprime nos espelhos stdout com a menor latência e gera um novo sources.listarquivo. Também existem várias opções que permitem escolher em uma lista de espelhos classificados e recuperar informações como quando o espelho foi atualizado pela última vez e sua capacidade de largura de banda.

John B
fonte