Thursday, September 24, 2009

Come creare un mirror locale di Fedora

Se usate Fedora su più di un PC, vi sarete trovati ad installare o aggiornare le stesse cose sulle diverse macchine. In questi casi, la domanda più ricorrente è: si può evitare di scaricare gli stessi pacchetti più di una volta, risparmiando così tempo e banda? La risposta è "sì"...

Il concetto di base è che si può fare in modo che i client reperiscano i pacchettti di cui hanno bisogno da una copia locale invece di connettersi ad uno degli altri mirror di Fedora. Per fare ciò abbiamo bisogno di:
  1. creare una copia locale dei repository
  2. rendere disponibile la copia ai client locali
  3. informare l'infrastruttura di Fedora del nuovo mirror locale
Da notare l'importanza del punto 3, perchè la lista dei mirror da cui scaricare viene generata dinamicamente dai server Fedora ad ogni richiesta del client (yum, PackageKit o quant'altro) e quindi saremo in grado di usare il nostro mirror locale in maniera trasparente, ovvero senza necessità di alcuna modifica alla configurazione del package manager.

Veniamo ora al dettagli delle operazioni.


creare una copia locale dei repository

Per creare una copia locale dei respository useremo rsync (se non fosse già installato nel vostro sistema usate il comando yum install rsync) creando uno shell script (per esempio chiamato dosync.sh) contenente il comando:

rsync -vaH \
--exclude-from=fedora-excludes.txt \
--numeric-ids \
--delete \
--delete-delay \
--delay-updates \
rsync://rsync.mirrorservice.org/download.fedora.redhat.com/pub/fedora/linux \
Fedora


il quale creerà una directory "Fedora" contente l'intero repository. Siete ovviamente liberi di scegliere un mirror diverso a cui connettervi dalla lista dei mirror attivi .
Va anche creato il file fedora-excludes.txt che è menzionato nella riga di comando il quale contiene la lista dei files da ignorare nel vostro mirror; per esempio, personalemente non ho necessità di scaricare versioni di Fedora precedenti alla 10, di rawhide, delle immagini ISO, delle architetture PowerPC, etc; il mio file contiene quindi:

**/debug/**
**/alpha/**
**/source/**
**/SRPMS/**
**/drpms/**
**/*.iso
**/ppc/**
**/ppc64/**
linux/core/**
linux/development/**
linux/releases/7/**
linux/releases/8/**
linux/releases/9/**
linux/releases/test/**
linux/updates/8/**
linux/updates/9/**
linux/updates/testing/**


a questo punto si può eseguire la prima sincronizzazione mandando in esecuzione lo script; per la prima volta aspettatevi tempi lunghi, visto che con questa configurazione ho al momento circa 100Gb di dati.

rendere disponibile la copia ai client locali

I client locali accederanno al repository via http; nel mio caso uso il server apache, per cui basta creare il file /etc/httpd/conf.d/fedora_mirror.conf ed inserivi la seguente configurazione:
Alias /fedora /var/www/mirrors/Fedora/linux
AddType application/octet-stream .rpm

<Directory /var/www/mirrors/Fedora/linux>
    Options Indexes FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>

<LocationMatch "\.(xml|xml\.gz|xml\.asc|sqlite)">
    Header set Cache-Control "must-revalidate"
    ExpiresActive On
    ExpiresDefault "now"
</LocationMatch>

Ovviamente adattando il percorso /var/www/mirrors/Fedora/linux al vostro caso.

informare l'infrastruttura di Fedora del nuovo mirror locale
L'ultimo passo da fare per  completare la configurazione del mirror privato è quella di registrarlo sui server Fedora in modo che i client provenienti dalla rete interna siano automaticamente redirezionati su questo.
Per prima cosa accedete al server di mirrormanager e aggiungete un nuovo mirror scegliendo un "Site Name" e "Site Password" a piacere; ricordate di marcare il mirror come "Private". Aggiungete un nuovo "Host", anche qua ricordando di marcarlo come "Private" e poi indicate nella sezione "Site-local Netblocks" da quale indirizzo IP proverranno i vostri client, che nel caso più comune (un solo indirizzo IP dietro un fireall/router) sarà tipo xxx.xxx.xxx.xxx/32.

A questo punto, non resta che usare "Add Category" per segnalare quale dei contenuti sono disponibili; nel nostro caso, la categoria è "Fedora Linux" mentre in "Upstream" va l'indirizzo del mirror che abbiamo scelto.
L'ultima operazione da fare è aggiungere l'URL che i client interni usaranno per accedere al mirror locale (URLs serving this content).

Assicuratevi ora di avere installato il pacchetto mirrormanager-client ed editate il file /etc/mirrormanager-client/report_mirror.conf facendo in modo che le sezioni 'host', 'site' e 'Fedora Linux' siano configurate in accordo a quanto usato in mirrormanager.

A questo punto siamo pronti ad eseguire il comando report_mirror che avrà un output tipo:
# report_mirror 
Category Fedora Other directories updated: 0  added: 0  deleted 0
Category Fedora Secondary Arches directories updated: 0  added: 0  deleted 0
Category Fedora Linux directories updated: 154  added: 0  deleted 0
Category Fedora EPEL directories updated: 0  added: 0  deleted 0
Category Fedora Extras directories updated: 0  added: 0  deleted 0
Category Fedora Core directories updated: 0  added: 0  deleted 0
Category Fedora Archive directories updated: 0  added: 0  deleted 0
checked in successful

Se tutto è andato per il verso giusto, il nuovo mirror apparirà dopo pochi minuti al primo posto della lista, ad esempio quella delle update di Fedora 11 per x86_64

Ultimi ritocchi
Come tocco finale, aggiungete il comando "report_mirror" allo script dosync.sh creato in precedenza e fate in modo che tale script venga eseguito da cron; la frequenza può variare a seconda delle vostre esigenze, ma come minimo suggerisco di farlo giornalmente.

Se siete arrivati fino a qua, complimenti! Se invece avete dubbi o problemi, non esitate a contattarmi.


Riferimenti
http://fedoraproject.org/wiki/Infrastructure/Mirroring
http://www.kev009.com/wp/2009/06/mirroring-fedora/