Rendere mirror: //mirrors.ubuntu.com altamente disponibile


26

Siamo un team distribuito, motivo per cui le nostre VM usano la mirror://configurazione di Ubuntu . Il nostro /etc/apt/sources.listaspetto è il seguente:

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

Questo di per sé è piuttosto sorprendente e molto utile per le persone che lavorano in luoghi diversi - meno personalizzazione locale , ecc. Necessaria. Failover in teoria.

Di giorno in giorno, questa configurazione non riesce troppo spesso. Voglio dire 2-3 volte questa settimana.

In questo momento mirrors.ubuntu.comritorna ftp.uni-bayreuth.decome il mio specchio dell'armadio. Sfortunatamente, sembra essere in calo.

Questo è andato avanti per alcune ore e lo specchio è ospitato da volontari in un'università e oggi essendo un venerdì, le mie speranze sono basse che questo verrà corretto presto.

Tutti i discorsi, le mie domande sono:

  • Qualcuno lo usa?
  • Come evitare i tempi di fermo? (la mia soluzione rapida è uno script di shell)
  • Come posso aiutare a migliorare questa situazione?


@ RaduRădeanu - è la prima volta che leggo di netselect ... 8oþ
dschinn1001

@ RaduRădeanu Suggerimento interessante! Saluti! Sto cercando di utilizzare il mirror:metodo che ha avuto il maggior numero di aggiornamenti nel tuo thread. Il mio problema è che ogni volta che il mirror più veloce fallisce, allora non c'è failover e sono bloccato.
Fino al

La creazione del proprio mirror Ubuntu è un'opzione?
Mitch

@Till Can fammi sapere se puoi avere il tuo mirror.
Mitch

Risposte:


10

Personalmente penso che il modo migliore per selezionare i migliori mirror dei repository Ubuntu sia usare il metodo GUI:

server di download

Ora, per migliorare la situazione descritta nella domanda, è necessario impostare alcune regole in qualche modo. Queste regole devono agire mirrors.ubuntu.com. Posso suggerire alcune regole come segue:

  • fare un elenco dei mirror migliori / preferiti; ci sono molti specchi come puoi vedere qui , qui o qui
  • se hai trovato un buon mirror, aggiungilo all'elenco
  • se un mirror era inattivo o rotto a volte, significa che non è un buon mirror e dovresti rimuoverlo dall'elenco
  • puoi usare netselect, apt-spyoapt-fast
  • e altri, a seconda delle vostre esigenze.

Quindi, per vedere come puoi aggirare, posso darti un metodo descritto passo dopo passo con tre esempi di script bash. Il primo script usa i mirror del paese in cui ti trovi al momento anziché mirrors.ubuntu.com/mirrors.txt(per ogni paese esiste un file di testo con mirror associati; vedi http://mirrors.ubuntu.com/ ):

  • In una corsa terminalemkdir -p bin - questo comando creerà una bindirectory nella tua homecartella se non l'hai già.
  • Dopo l'esecuzione gedit ~/bin/change_sources.sh: questo creerà il nuovo file change_sources.shin gedit.
  • Copia e incolla uno dei prossimi script nel nuovo file creato:
#!/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

oppure qualcosa di simile a quello che si può trovare su 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

oppure, uno script che utilizza netselect(scarica da qui , installa le istruzioni qui ) come spiegato izx sarà molto carino in questa risposta :

#!/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
  • Salva il file e chiudilo.
  • Torna nel terminale ed esegui: chmod +x ~/bin/change_sources.sh- per concedere l'accesso in esecuzione per lo script.
  • Solo per test, per eseguire il tuo nuovo script, digita terminal ~/bin/change_sources.sh. Ti darà un errore, perché non hai il diritto di modificare /etc/apt/sources.list. Quindi usasudo ~/bin/change_sources.sh
  • Modificare il file crontab dell'utente root utilizzando il sudo crontab -ecomando e aggiungere la seguente riga:
@hourly /home/$USER/bin/change_sources.sh  
#change $USER with your user name
  • Ho impostato il lavoro cron per ogni ora, ma puoi cambiare come desideri o come pensi sia meglio. Vedi http://en.wikipedia.org/wiki/Cron in questo senso.
  • Salvare il file e controllare la nuova voce crontab con sudo crontab -l.

NOTA: per ripristinare le modifiche apportate da questo script, eliminare il processo cron e seguire le indicazioni dalla figura sopra o utilizzare il comando successivo nel terminale:

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

Da adesso, il file verrà modificato in modo dinamico dopo aver trovato una modifica dell'indirizzo IP.

Potrebbe non essere la soluzione migliore, ma, secondo me, una buona soluzione può essere data in questo modo come negli script sopra .


2
Immagino che discuterei se una GUI su Linux possa mai essere considerata nel modo tradizionale. :) Ma comunque: il tuo primo script risolve un problema, non ho. La sintassi del mirror ottiene già i miei mirror tedeschi, o statunitensi o ovunque siano le persone. Il secondo script utilizza i mirror country: sembrano avere la minima larghezza di banda disponibile (visto che nell'elenco archivemirrors su launchpad), il terzo script presuppone che un mirror veloce (o il più vicino) sia effettivamente il migliore. Torna al punto di partenza. Sto scrivendo un piccolo apt-spyscript in questo momento. Si aggiornerà qui più tardi.
Fino al

1
@Ta beh, la tua domanda era " Come si lavora per i tempi di fermo? " E " Come posso aiutare a migliorare questa situazione? ". Ho mostrato come lavoro e ti ho suggerito come puoi aiutare a migliorare ... Inoltre, se leggi la mia risposta fino alla fine, puoi vedere che sono consapevole che " Potrebbe non essere la soluzione migliore, ma penso che una buona soluzione può essere data in questo modo come negli script sopra ". Infine, se sei interessato a correggere / migliorare i server rotti, questo sembra fuori tema qui e dovresti invece parlare con i proprietari di quei server.
Radu Rădeanu,

2
Non credo sia fuori tema. Diverse persone canoniche / Ubuntu mi hanno detto di aggiungere la mia domanda qui. È per questo che sono qui in primo luogo e immagino anche perché ci sia una taglia assegnata.
Fino al

1
@Tutto sì, la domanda è buona, ma non come l'hai riformulata in questi commenti. Nessuno risponderà a "come riparare un server mirror rotto" qui se non è un amministratore sul rispettivo server.
Radu Rădeanu,

1
Non voglio riparare quel server, voglio riparare l'algoritmo di selezione e la mancanza di failover.
Fino al

4

Apprezzo tutti gli input su questa domanda, ma poiché nessuno ha trovato una soluzione semplice adatta alle nostre circostanze, ho deciso di risolvere il problema da solo.

Ho creato uno strumento (specifico per Ubuntu) che chiamo apt-spy2.

L'obiettivo principale di questo strumento è trovare velocemente uno specchio funzionante . Il funzionamento è definito dal fatto che il server mirror è disponibile e (si spera :) aggiornato.

Non presumo che il server selezionato sia necessariamente il più vicino e il più veloce. Non sto eseguendo ping o trucchi DNS GEO, ma finora funziona quando qualcosa si rompe.

Come funziona - in poche parole:

  1. Uso http://mirrors.ubuntu.com o l'elenco dei mirror del launchpad per recuperare i server.
  2. Faccio un semplice controllo su ciascuno (per il codice di stato della risposta HTTP).
  3. LBNL, aggiorno /etc/apt/sources.list.

Nota: questo presuppone che le persone giochino bene e inseriscano mirror aggiuntivi (ad es. Repository di terze parti in /etc/apt/sources.list.d. Ma suppongo che ciò significhi che c'è spazio per miglioramenti.

Puoi ottenere questo strumento in questo modo:

$ [sudo] gem install apt-spy2

La CLI è dotato list, check, fixe help(con informazioni estese su come usarlo).

Ho cercato di documentare il più possibile nel README del progetto .

La versione attuale è molto conservativa 0.5.0.

Il codice è open source e la licenza è liberale. E prendo tutti i contributi.


Hai caricato questo nei repository Ubuntu?
Braiam,

@Braiam Puoi ottenere questo strumento in questo modo: sudo gem install apt-spy2
Radu Rădeanu

@ RaduRădeanu Sto chiedendo se lo ha caricato, dal momento che sono interessato a impacchettare qualcosa su Debian.
Braiam,

@Braiam Non l'ho impacchettato, ma lo accetterei se qualcuno lo facesse. :)
Fino al

@Braiam Btw, è improbabile che funzioni con Debian. ; (Funziona solo con Ubuntu.
Fino al

2

C'era questo comando su Debian 6.0.4:

apt-spy

Questo ha fatto il lavoro per trovare automaticamente il prossimo server disponibile più vicino e generare un nuovo sources.list

In Ubuntu questo comando sembra non esistere?

Esiste ancora in Debian 7.0 wheezy:

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

Puoi scaricare il tuo pacchetto * .deb qui:

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

... ancora alla ricerca delle fonti ...

Ovviamente è necessaria l'installazione di Debian-7.0 per ottenere il codice sorgente dopo aver modificato l'elenco delle fonti con la voce:

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

Quindi, dopo sudo apt-get update, aspireresti semplicemente il codice con:

sudo apt-get source apt-spy


Grazie per il suggerimento, apt-spy sembra davvero eccezionale. Non sono sicuro che funzioni bene. Ogni volta che ho installato roba debian su Ubuntu, prima o poi si è rotto a causa di altre dipendenze.
Fino al

@Till - è sempre qualcosa con un po 'più di scavo ... non appena Linux diventa più esigente.
dschinn1001,


@Ta intendi: costruiscilo ...! o Costruito ...? - Mi
prenderò

sei veloce!
dschinn1001,

2

Forse non stai usando la soluzione che ti piace, ma impostare una cache locale per i file .deb dovrebbe essere l'ideale quando scarichi diversi MB di pacchetto (per lo più scommetto che sono gli stessi) e dal momento che stai scaricando dallo stesso server, tu potrebbe voler sacrificare un PC per rendere la cache e rendere il server meno occupato.

Procedura

Dovresti essere in grado di installare apt-cacheruna macchina che ha molto spazio nel disco rigido (ne avresti bisogno). È possibile configurarlo utilizzando la guida del server Apt-cacher , ma consente di riprendere rapidamente.

  1. Installare apt-cacher

    sudo apt-get install apt-cacher apache2

  2. Modifica /etc/default/apt-cachere imposta il autostartvalore su 1, in modo che la cache inizi all'accensione della macchina.
  3. Riavvia apache sudo /etc/init.d/apache2 restart
  4. Prova la tua cache utilizzando http://ip-of.your.cache:3142/apt-cacher.
  5. Dovresti consentire all'host di utilizzare la cache, quindi modifica /etc/apt-cacher/apt-cacher.confe cerca la linea allowed_hosts. È possibile impostare subnet come 192.168.0.0/24o solo *per tutti gli host
  6. Cerca un server veloce e affidabile in giro . È possibile utilizzare apt-spyper questo (questo comando potrebbe richiedere ore poiché verifica anche la velocità di ciascun server).
  7. Nei tuoi clienti hai due opzioni:

    • impostare sources.listcome segue:

    deb http: //ip-of.your.cache: 3142 / the.server.you.like / ubuntu / lucido multiverso dell'universo con restrizioni principali

    Modifica l' ip-of.your.cacheip della cache e the.server.you.likeil nome host del server che utilizzerai. Puoi usare più righe.

    • Oppure imposta apt per usare un proxy: modifica /etc/apt/apt.conf.d/01proxye aggiungi la riga:

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


Se dovessi usare apt-spy in tutto il mondo, durerebbe un po '... ma puoi usare questo comando confinando con l'Europa, ad esempio: apt-spy -d testing -a Europa
dschinn1001

@ dschinn1001 -d testingprofuma di Debian.
Braiam,

bene allora: apt-spy -a Europa
dschinn1001

"downvote"? - Non ho fatto alcun voto negativo? - succede a volte che clicco per sbaglio con il mouse - Non faccio mai il voto negativo con l'obiettivo! quindi ti ho votato! grazie.
dschinn1001,

1

Puoi provare a configurare il tuo mirror Ubuntu. In questo modo gli aggiornamenti saranno locali.

apt-mirror richiede una connessione Internet ad alta velocità e molto spazio su disco

Configurare il proprio mirror Ubuntu è molto semplice usando apt-mirror.

1) vai nel repository apt-mirror. Eseguire il backup del file sources.list in questo modo:

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

2) Modifica il file sources.list in questo modo:

gksudo gedit /etc/apt/sources.list

3) E inserire quanto segue in una nuova riga:

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

4) Aggiorniamo l'indice del pacchetto

sudo apt-get update

5) E installa apt-mirror

sudo apt-get install apt-mirror

6) Apt-mirror è ora impostato, quindi diciamo quali server eseguire il mirroring:

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

La configurazione predefinita metterà i tuoi file scaricati nella cartella / var / spool / apt-mirror. Ecco come appare il file 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

questo rispecchia solo i pacchetti binari ma se si desidera pacchetti di origine, è necessario inserire le righe appropriate. Di solito prendono la forma:

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

7) Adesso corri apt-mirror. Ci vorrà un po 'di tempo. Non preoccuparti se non riesci a scaricare tutti i file in una volta sola, apt-mirrorpuoi riprendere i download (uccidilo con la combinazione di tasti Ctrl+ Ce rieseguilo quando vuoi continuare). Ok, esegui apt-mirror in questo modo:

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

Dai un'occhiata anche a Come creare un mirror Debian / Ubuntu locale con apt-mirror

Fonte: Usa Apt-mirror per creare il tuo mirror Ubuntu


Se la memoria mi serve bene, apt-mirrorè disponibile nei repository Ubuntu.
Braiam,

A proposito, assicurati di notare la necessità di un sacco di spazio nell'HD per scaricare un mirror completo;)
Braiam

Grazie per la risposta ed è una grande risorsa per impostare un mirror e l'ho considerato, ma poi avrei bisogno di questo setuo in almeno 3 posizioni diverse. So di essere pignolo qui, ma sento ancora che mirrors.ubuntu.comdovrebbe funzionare. :)
Fino al

@till mirrors.ubuntu.comnon risolverà mai mirrors.ubuntu.com, ma un server più vicino a te. Il problema è che il server che risolve è inaffidabile. Il tuo gioco migliore sta usando un server affidabile dalla lista ufficiale.
Braiam,

@Braiam qualche idea del perché i mirror inaffidabili vengono restituiti da allora?
Fino al

1

Ho scritto uno script Python chiamato apt-select per servire come alternativa alla CLI al metodo GUI.

Lo script interroga ogni mirror tramite TCP, stampa su mirror stdout con la latenza più bassa e genera un nuovo sources.listfile. Esistono anche più opzioni che consentono di scegliere da un elenco di mirror classificati e di recuperare informazioni come l'ultimo aggiornamento del mirror e la sua capacità di larghezza di banda.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.